database: Introduce single PersonOrEnsemble enum

This commit is contained in:
Elias Projahn 2021-05-24 15:37:19 +02:00
parent 15e5849730
commit cec955eb9f
5 changed files with 118 additions and 143 deletions

View file

@ -5,7 +5,8 @@ use adw::prelude::*;
use gettextrs::gettext;
use glib::clone;
use gtk::prelude::*;
use musicus_backend::db::{Ensemble, Instrument, Performance, Person};
use log::error;
use musicus_backend::db::{Ensemble, Instrument, Performance, Person, PersonOrEnsemble};
use std::cell::RefCell;
use std::rc::Rc;
@ -85,8 +86,14 @@ impl Screen<Option<Performance>, Performance> for PerformanceEditor {
this.editor.set_save_cb(clone!(@weak this => move || {
let performance = Performance {
person: this.person.borrow().clone(),
ensemble: this.ensemble.borrow().clone(),
performer: if let Some(person) = this.person.borrow().clone() {
PersonOrEnsemble::Person(person)
} else if let Some(ensemble) = this.ensemble.borrow().clone() {
PersonOrEnsemble::Ensemble(ensemble)
} else {
error!("Tried to save performance without performer");
return;
},
role: this.role.borrow().clone(),
};
@ -133,13 +140,16 @@ impl Screen<Option<Performance>, Performance> for PerformanceEditor {
// Initialize
if let Some(performance) = performance {
if let Some(person) = performance.person {
this.show_person(Some(&person));
this.person.replace(Some(person));
} else if let Some(ensemble) = performance.ensemble {
this.show_ensemble(Some(&ensemble));
this.ensemble.replace(Some(ensemble));
}
match performance.performer {
PersonOrEnsemble::Person(person) => {
this.show_person(Some(&person));
this.person.replace(Some(person));
}
PersonOrEnsemble::Ensemble(ensemble) => {
this.show_ensemble(Some(&ensemble));
this.ensemble.replace(Some(ensemble));
}
};
if let Some(role) = performance.role {
this.show_role(Some(&role));

View file

@ -9,27 +9,10 @@ use gettextrs::gettext;
use glib::clone;
use gtk::prelude::*;
use gtk_macros::get_widget;
use musicus_backend::db::{Ensemble, Person};
use musicus_backend::db::PersonOrEnsemble;
use std::cell::RefCell;
use std::rc::Rc;
/// Either a person or an ensemble to be shown in the list.
#[derive(Clone, Debug)]
pub enum PersonOrEnsemble {
Person(Person),
Ensemble(Ensemble),
}
impl PersonOrEnsemble {
/// Get a short textual representation of the item.
pub fn get_title(&self) -> String {
match self {
PersonOrEnsemble::Person(person) => person.name_lf(),
PersonOrEnsemble::Ensemble(ensemble) => ensemble.name.clone(),
}
}
}
/// The main screen of the app, once it's set up and finished loading. The screen assumes that the
/// music library and the player are available and initialized.
pub struct MainScreen {

View file

@ -5,26 +5,9 @@ use adw::prelude::*;
use gettextrs::gettext;
use glib::clone;
use gtk::prelude::*;
use musicus_backend::db::{Ensemble, Medium, Person};
use musicus_backend::db::{Medium, PersonOrEnsemble};
use std::rc::Rc;
/// Either a person or an ensemble to be shown in the list.
#[derive(Clone, Debug)]
pub enum PersonOrEnsemble {
Person(Person),
Ensemble(Ensemble),
}
impl PersonOrEnsemble {
/// Get a short textual representation of the item.
pub fn get_title(&self) -> String {
match self {
PersonOrEnsemble::Person(person) => person.name_lf(),
PersonOrEnsemble::Ensemble(ensemble) => ensemble.name.clone(),
}
}
}
/// A screen for selecting a medium.
pub struct MediumSelector {
handle: NavigationHandle<Medium>,