From 44cb9fa4105e87202e9ddc8d9d85646ffa5cb522 Mon Sep 17 00:00:00 2001 From: Elias Projahn Date: Mon, 28 Sep 2020 15:14:05 +0200 Subject: [PATCH] Add ensemble editor dialog --- res/resources.xml | 1 + res/ui/ensemble_editor.ui | 73 ++++++++++++++++++++++++++++++++++ src/dialogs/ensemble_editor.rs | 66 ++++++++++++++++++++++++++++++ src/dialogs/mod.rs | 3 ++ src/window.rs | 12 ++++-- 5 files changed, 152 insertions(+), 3 deletions(-) create mode 100644 res/ui/ensemble_editor.ui create mode 100644 src/dialogs/ensemble_editor.rs diff --git a/res/resources.xml b/res/resources.xml index 188506f..d5e16e9 100644 --- a/res/resources.xml +++ b/res/resources.xml @@ -1,6 +1,7 @@ + ui/ensemble_editor.ui ui/instrument_editor.ui ui/person_editor.ui ui/window.ui diff --git a/res/ui/ensemble_editor.ui b/res/ui/ensemble_editor.ui new file mode 100644 index 0000000..21fe56c --- /dev/null +++ b/res/ui/ensemble_editor.ui @@ -0,0 +1,73 @@ + + + + + + False + True + True + dialog + + + True + False + 18 + 12 + 6 + + + True + False + end + Name + + + 0 + 0 + + + + + True + True + True + + + 1 + 0 + + + + + + + True + False + Ensemble + + + Cancel + True + True + True + + + + + Save + True + True + True + + + + end + 1 + + + + + + diff --git a/src/dialogs/ensemble_editor.rs b/src/dialogs/ensemble_editor.rs new file mode 100644 index 0000000..c17c48f --- /dev/null +++ b/src/dialogs/ensemble_editor.rs @@ -0,0 +1,66 @@ +use crate::database::*; +use glib::clone; +use gtk::prelude::*; +use gtk_macros::get_widget; +use std::rc::Rc; + +pub struct EnsembleEditor { + window: gtk::Window, + id: i64, + name_entry: gtk::Entry, +} + +impl EnsembleEditor { + pub fn new () + 'static, P: IsA>( + db: Rc, + parent: &P, + ensemble: Option, + callback: F, + ) -> Rc { + let builder = + gtk::Builder::from_resource("/de/johrpan/musicus_editor/ui/ensemble_editor.ui"); + + get_widget!(builder, gtk::Window, window); + get_widget!(builder, gtk::Button, cancel_button); + get_widget!(builder, gtk::Button, save_button); + get_widget!(builder, gtk::Entry, name_entry); + + let id = match ensemble { + Some(ensemble) => { + name_entry.set_text(&ensemble.name); + ensemble.id + } + None => rand::random::().into(), + }; + + let result = Rc::new(EnsembleEditor { + id: id, + window: window, + name_entry: name_entry, + }); + + cancel_button.connect_clicked(clone!(@strong result => move |_| { + result.window.close(); + })); + + save_button.connect_clicked(clone!(@strong result => move |_| { + result.window.close(); + + let ensemble = Ensemble { + id: result.id, + name: result.name_entry.get_text().to_string(), + }; + + db.update_ensemble(ensemble.clone()); + callback(ensemble); + })); + + result.window.set_transient_for(Some(parent)); + + result + } + + pub fn show(&self) { + self.window.show(); + } +} diff --git a/src/dialogs/mod.rs b/src/dialogs/mod.rs index b50f93b..3ab4e11 100644 --- a/src/dialogs/mod.rs +++ b/src/dialogs/mod.rs @@ -1,3 +1,6 @@ +pub mod ensemble_editor; +pub use ensemble_editor::*; + pub mod instrument_editor; pub use instrument_editor::*; diff --git a/src/window.rs b/src/window.rs index d45ff7f..a7aaf6f 100644 --- a/src/window.rs +++ b/src/window.rs @@ -48,9 +48,15 @@ impl Window { println!("TODO: Add work."); }); - action!(result.window, "add-ensemble", |_, _| { - println!("TODO: Add ensemble."); - }); + action!( + result.window, + "add-ensemble", + clone!(@strong result => move |_, _| { + EnsembleEditor::new(result.db.clone(), &result.window, None, |ensemble| { + println!("{:?}", ensemble); + }).show(); + }) + ); action!(result.window, "add-recording", |_, _| { println!("TODO: Add recording.");