From eac168880d50c7c9785024ad24be5301551402b7 Mon Sep 17 00:00:00 2001 From: Elias Projahn Date: Tue, 2 Feb 2021 11:10:19 +0100 Subject: [PATCH] Use new editor widget for instruments and ensembles --- res/musicus.gresource.xml | 3 - res/ui/ensemble_editor.ui | 134 -------------------------------- res/ui/instrument_editor.ui | 134 -------------------------------- res/ui/person_editor.ui | 147 ------------------------------------ src/editors/ensemble.rs | 73 +++++++++--------- src/editors/instrument.rs | 73 +++++++++--------- src/editors/person.rs | 1 - 7 files changed, 76 insertions(+), 489 deletions(-) delete mode 100644 res/ui/ensemble_editor.ui delete mode 100644 res/ui/instrument_editor.ui delete mode 100644 res/ui/person_editor.ui diff --git a/res/musicus.gresource.xml b/res/musicus.gresource.xml index 286a78b..8295cd6 100644 --- a/res/musicus.gresource.xml +++ b/res/musicus.gresource.xml @@ -2,12 +2,9 @@ ui/editor.ui - ui/ensemble_editor.ui - ui/instrument_editor.ui ui/login_dialog.ui ui/medium_editor.ui ui/performance_editor.ui - ui/person_editor.ui ui/player_bar.ui ui/player_screen.ui ui/poe_list.ui diff --git a/res/ui/ensemble_editor.ui b/res/ui/ensemble_editor.ui deleted file mode 100644 index 60d0ce7..0000000 --- a/res/ui/ensemble_editor.ui +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - crossfade - - - content - - - vertical - - - false - false - - - Ensemble - - - - - - go-previous-symbolic - - - - - object-select-symbolic - - - - - - - - False - - - - - true - - - 12 - 12 - 18 - 12 - 500 - 300 - - - start - - - none - - - True - Name - name_entry - - - center - True - - - - - - - True - Publish to the server - upload_switch - - - center - True - - - - - - - - - - - - - - - - - - - loading - - - vertical - - - false - false - - - Ensemble - - - - - - - - true - true - true - center - center - - - - - - - - diff --git a/res/ui/instrument_editor.ui b/res/ui/instrument_editor.ui deleted file mode 100644 index ed33cce..0000000 --- a/res/ui/instrument_editor.ui +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - crossfade - - - content - - - vertical - - - false - false - - - Instrument - - - - - - go-previous-symbolic - - - - - object-select-symbolic - - - - - - - - False - - - - - true - - - 12 - 12 - 18 - 12 - 500 - 300 - - - start - - - none - - - True - Name - name_entry - - - center - True - - - - - - - True - Publish to the server - upload_switch - - - center - True - - - - - - - - - - - - - - - - - - - loading - - - vertical - - - false - false - - - Instrument - - - - - - - - true - true - true - center - center - - - - - - - - diff --git a/res/ui/person_editor.ui b/res/ui/person_editor.ui deleted file mode 100644 index 78d3e45..0000000 --- a/res/ui/person_editor.ui +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - crossfade - - - content - - - vertical - - - false - false - - - Person - - - - - - go-previous-symbolic - - - - - object-select-symbolic - - - - - - - - False - - - - - true - - - 12 - 12 - 18 - 12 - 500 - 300 - - - start - - - none - - - True - First name - first_name_entry - - - center - True - - - - - - - True - Last name - last_name_entry - - - center - True - - - - - - - True - Publish to the server - upload_switch - - - center - True - - - - - - - - - - - - - - - - - - - loading - - - vertical - - - false - false - - - Person - - - - - - - - true - true - true - center - center - - - - - - - - diff --git a/src/editors/ensemble.rs b/src/editors/ensemble.rs index 769b0cc..6415f66 100644 --- a/src/editors/ensemble.rs +++ b/src/editors/ensemble.rs @@ -1,21 +1,24 @@ use crate::backend::Backend; -use crate::database::*; -use crate::widgets::{Navigator, NavigatorScreen}; +use crate::database::generate_id; +use crate::database::Ensemble; +use crate::widgets::{Editor, EntryRow, Navigator, NavigatorScreen, Section, UploadSection}; use anyhow::Result; +use gettextrs::gettext; use glib::clone; use gtk::prelude::*; -use gtk_macros::get_widget; use std::cell::RefCell; use std::rc::Rc; /// A dialog for creating or editing a ensemble. pub struct EnsembleEditor { backend: Rc, + + /// The ID of the ensemble that is edited or a newly generated one. id: String, - widget: gtk::Stack, - info_bar: gtk::InfoBar, - name_entry: gtk::Entry, - upload_switch: gtk::Switch, + + editor: Editor, + name: EntryRow, + upload: UploadSection, saved_cb: RefCell ()>>>, navigator: RefCell>>, } @@ -23,21 +26,25 @@ pub struct EnsembleEditor { impl EnsembleEditor { /// Create a new ensemble editor and optionally initialize it. pub fn new(backend: Rc, ensemble: Option) -> Rc { - // Create UI + let editor = Editor::new(); + editor.set_title("Ensemble"); - let builder = gtk::Builder::from_resource("/de/johrpan/musicus/ui/ensemble_editor.ui"); + let list = gtk::ListBoxBuilder::new() + .selection_mode(gtk::SelectionMode::None) + .build(); - get_widget!(builder, gtk::Stack, widget); - get_widget!(builder, gtk::Button, back_button); - get_widget!(builder, gtk::Button, save_button); - get_widget!(builder, gtk::InfoBar, info_bar); - get_widget!(builder, gtk::Entry, name_entry); - get_widget!(builder, gtk::Switch, upload_switch); + let name = EntryRow::new(&gettext("Name")); + list.append(&name.widget); + + let section = Section::new(&gettext("General"), &list); + let upload = UploadSection::new(); + + editor.add_content(§ion.widget); + editor.add_content(&upload.widget); let id = match ensemble { Some(ensemble) => { - name_entry.set_text(&ensemble.name); - + name.set_text(&ensemble.name); ensemble.id } None => generate_id(), @@ -46,28 +53,27 @@ impl EnsembleEditor { let this = Rc::new(Self { backend, id, - widget, - info_bar, - name_entry, - upload_switch, + editor, + name, + upload, saved_cb: RefCell::new(None), navigator: RefCell::new(None), }); // Connect signals and callbacks - back_button.connect_clicked(clone!(@strong this => move |_| { + this.editor.set_back_cb(clone!(@strong this => move || { let navigator = this.navigator.borrow().clone(); if let Some(navigator) = navigator { navigator.pop(); } })); - save_button.connect_clicked(clone!(@strong this => move |_| { + this.editor.set_save_cb(clone!(@strong this => move || { let context = glib::MainContext::default(); let clone = this.clone(); context.spawn_local(async move { - clone.widget.set_visible_child_name("loading"); + clone.editor.loading(); match clone.clone().save().await { Ok(_) => { let navigator = clone.navigator.borrow().clone(); @@ -75,9 +81,9 @@ impl EnsembleEditor { navigator.pop(); } } - Err(_) => { - clone.info_bar.set_revealed(true); - clone.widget.set_visible_child_name("content"); + Err(err) => { + let description = gettext!("Cause: {}", err); + clone.editor.error(&gettext("Failed to save ensemble!"), &description); } } @@ -94,22 +100,18 @@ impl EnsembleEditor { /// Save the ensemble and possibly upload it to the server. async fn save(self: Rc) -> Result<()> { - let name = self.name_entry.get_text().unwrap().to_string(); + let name = self.name.get_text(); let ensemble = Ensemble { id: self.id.clone(), name, }; - let upload = self.upload_switch.get_active(); - if upload { + if self.upload.get_active() { self.backend.post_ensemble(&ensemble).await?; } - self.backend - .db() - .update_ensemble(ensemble.clone()) - .await?; + self.backend.db().update_ensemble(ensemble.clone()).await?; self.backend.library_changed(); if let Some(cb) = &*self.saved_cb.borrow() { @@ -126,10 +128,11 @@ impl NavigatorScreen for EnsembleEditor { } fn get_widget(&self) -> gtk::Widget { - self.widget.clone().upcast() + self.editor.widget.clone().upcast() } fn detach_navigator(&self) { self.navigator.replace(None); } } + diff --git a/src/editors/instrument.rs b/src/editors/instrument.rs index 801a756..4f7a058 100644 --- a/src/editors/instrument.rs +++ b/src/editors/instrument.rs @@ -1,21 +1,24 @@ use crate::backend::Backend; -use crate::database::*; -use crate::widgets::{Navigator, NavigatorScreen}; +use crate::database::generate_id; +use crate::database::Instrument; +use crate::widgets::{Editor, EntryRow, Navigator, NavigatorScreen, Section, UploadSection}; use anyhow::Result; +use gettextrs::gettext; use glib::clone; use gtk::prelude::*; -use gtk_macros::get_widget; use std::cell::RefCell; use std::rc::Rc; /// A dialog for creating or editing a instrument. pub struct InstrumentEditor { backend: Rc, + + /// The ID of the instrument that is edited or a newly generated one. id: String, - widget: gtk::Stack, - info_bar: gtk::InfoBar, - name_entry: gtk::Entry, - upload_switch: gtk::Switch, + + editor: Editor, + name: EntryRow, + upload: UploadSection, saved_cb: RefCell ()>>>, navigator: RefCell>>, } @@ -23,21 +26,25 @@ pub struct InstrumentEditor { impl InstrumentEditor { /// Create a new instrument editor and optionally initialize it. pub fn new(backend: Rc, instrument: Option) -> Rc { - // Create UI + let editor = Editor::new(); + editor.set_title("Instrument/Role"); - let builder = gtk::Builder::from_resource("/de/johrpan/musicus/ui/instrument_editor.ui"); + let list = gtk::ListBoxBuilder::new() + .selection_mode(gtk::SelectionMode::None) + .build(); - get_widget!(builder, gtk::Stack, widget); - get_widget!(builder, gtk::Button, back_button); - get_widget!(builder, gtk::Button, save_button); - get_widget!(builder, gtk::InfoBar, info_bar); - get_widget!(builder, gtk::Entry, name_entry); - get_widget!(builder, gtk::Switch, upload_switch); + let name = EntryRow::new(&gettext("Name")); + list.append(&name.widget); + + let section = Section::new(&gettext("General"), &list); + let upload = UploadSection::new(); + + editor.add_content(§ion.widget); + editor.add_content(&upload.widget); let id = match instrument { Some(instrument) => { - name_entry.set_text(&instrument.name); - + name.set_text(&instrument.name); instrument.id } None => generate_id(), @@ -46,28 +53,27 @@ impl InstrumentEditor { let this = Rc::new(Self { backend, id, - widget, - info_bar, - name_entry, - upload_switch, + editor, + name, + upload, saved_cb: RefCell::new(None), navigator: RefCell::new(None), }); // Connect signals and callbacks - back_button.connect_clicked(clone!(@strong this => move |_| { + this.editor.set_back_cb(clone!(@strong this => move || { let navigator = this.navigator.borrow().clone(); if let Some(navigator) = navigator { navigator.pop(); } })); - save_button.connect_clicked(clone!(@strong this => move |_| { + this.editor.set_save_cb(clone!(@strong this => move || { let context = glib::MainContext::default(); let clone = this.clone(); context.spawn_local(async move { - clone.widget.set_visible_child_name("loading"); + clone.editor.loading(); match clone.clone().save().await { Ok(_) => { let navigator = clone.navigator.borrow().clone(); @@ -75,9 +81,9 @@ impl InstrumentEditor { navigator.pop(); } } - Err(_) => { - clone.info_bar.set_revealed(true); - clone.widget.set_visible_child_name("content"); + Err(err) => { + let description = gettext!("Cause: {}", err); + clone.editor.error(&gettext("Failed to save instrument!"), &description); } } @@ -94,22 +100,18 @@ impl InstrumentEditor { /// Save the instrument and possibly upload it to the server. async fn save(self: Rc) -> Result<()> { - let name = self.name_entry.get_text().unwrap().to_string(); + let name = self.name.get_text(); let instrument = Instrument { id: self.id.clone(), name, }; - let upload = self.upload_switch.get_active(); - if upload { + if self.upload.get_active() { self.backend.post_instrument(&instrument).await?; } - self.backend - .db() - .update_instrument(instrument.clone()) - .await?; + self.backend.db().update_instrument(instrument.clone()).await?; self.backend.library_changed(); if let Some(cb) = &*self.saved_cb.borrow() { @@ -126,10 +128,11 @@ impl NavigatorScreen for InstrumentEditor { } fn get_widget(&self) -> gtk::Widget { - self.widget.clone().upcast() + self.editor.widget.clone().upcast() } fn detach_navigator(&self) { self.navigator.replace(None); } } + diff --git a/src/editors/person.rs b/src/editors/person.rs index a70051c..d3af4e9 100644 --- a/src/editors/person.rs +++ b/src/editors/person.rs @@ -6,7 +6,6 @@ use anyhow::Result; use gettextrs::gettext; use glib::clone; use gtk::prelude::*; -use gtk_macros::get_widget; use std::cell::RefCell; use std::rc::Rc;