From a7e7fe7b89e0a458a03562cdcd3c7b7462cdd88f Mon Sep 17 00:00:00 2001 From: Elias Projahn Date: Fri, 9 Oct 2020 23:01:56 +0200 Subject: [PATCH] Add ensemble selector --- res/resources.xml | 1 + res/ui/ensemble_selector.ui | 91 +++++++++++++++++++++++++++ src/dialogs/ensemble_selector.rs | 105 +++++++++++++++++++++++++++++++ src/dialogs/mod.rs | 3 + 4 files changed, 200 insertions(+) create mode 100644 res/ui/ensemble_selector.ui create mode 100644 src/dialogs/ensemble_selector.rs diff --git a/res/resources.xml b/res/resources.xml index c4a0744..9abcb6c 100644 --- a/res/resources.xml +++ b/res/resources.xml @@ -2,6 +2,7 @@ ui/ensemble_editor.ui + ui/ensemble_selector.ui ui/instrument_editor.ui ui/instrument_selector.ui ui/part_editor.ui diff --git a/res/ui/ensemble_selector.ui b/res/ui/ensemble_selector.ui new file mode 100644 index 0000000..9aec87a --- /dev/null +++ b/res/ui/ensemble_selector.ui @@ -0,0 +1,91 @@ + + + + + + False + True + 350 + 300 + True + dialog + + + True + False + vertical + + + True + True + 6 + 6 + 6 + 6 + edit-find-symbolic + False + False + + + False + True + 0 + + + + + True + True + in + + + True + False + + + True + False + + + True + False + No ensembles found. + + + + + + + + + True + True + 1 + + + + + + + True + False + Select ensemble + True + + + True + True + True + + + True + False + list-add-symbolic + + + + + + + + diff --git a/src/dialogs/ensemble_selector.rs b/src/dialogs/ensemble_selector.rs new file mode 100644 index 0000000..4ddb9ad --- /dev/null +++ b/src/dialogs/ensemble_selector.rs @@ -0,0 +1,105 @@ +use super::selector_row::SelectorRow; +use super::EnsembleEditor; +use crate::backend::Backend; +use crate::database::*; +use gio::prelude::*; +use glib::clone; +use gtk::prelude::*; +use gtk_macros::get_widget; +use std::convert::TryInto; +use std::rc::Rc; + +pub struct EnsembleSelector +where + F: Fn(Ensemble) -> () + 'static, +{ + backend: Rc, + window: gtk::Window, + callback: F, + list: gtk::ListBox, + search_entry: gtk::SearchEntry, +} + +impl EnsembleSelector +where + F: Fn(Ensemble) -> () + 'static, +{ + pub fn new>(backend: Rc, parent: &P, callback: F) -> Rc { + let builder = + gtk::Builder::from_resource("/de/johrpan/musicus_editor/ui/ensemble_selector.ui"); + + get_widget!(builder, gtk::Window, window); + get_widget!(builder, gtk::Button, add_button); + get_widget!(builder, gtk::SearchEntry, search_entry); + get_widget!(builder, gtk::ListBox, list); + + let result = Rc::new(EnsembleSelector { + backend: backend, + window: window, + callback: callback, + search_entry: search_entry, + list: list, + }); + + result + .backend + .get_ensembles(clone!(@strong result => move |ensembles| { + for (index, ensemble) in ensembles.iter().enumerate() { + let label = gtk::Label::new(Some(&ensemble.name)); + label.set_halign(gtk::Align::Start); + let row = SelectorRow::new(index.try_into().unwrap(), &label); + row.show_all(); + result.list.insert(&row, -1); + } + + result + .list + .connect_row_activated(clone!(@strong result, @strong ensembles => move |_, row| { + result.window.close(); + let row = row.get_child().unwrap().downcast::().unwrap(); + let index: usize = row.get_index().try_into().unwrap(); + (result.callback)(ensembles[index].clone()); + })); + + result + .list + .set_filter_func(Some(Box::new(clone!(@strong result => move |row| { + let row = row.get_child().unwrap().downcast::().unwrap(); + let index: usize = row.get_index().try_into().unwrap(); + let search = result.search_entry.get_text().to_string().to_lowercase(); + search.is_empty() || ensembles[index] + .name + .to_lowercase() + .contains(&search) + })))); + })); + + result + .search_entry + .connect_search_changed(clone!(@strong result => move |_| { + result.list.invalidate_filter(); + })); + + add_button.connect_clicked(clone!(@strong result => move |_| { + let editor = EnsembleEditor::new( + result.backend.clone(), + &result.window, + None, + clone!(@strong result => move |ensemble| { + result.window.close(); + (result.callback)(ensemble); + }), + ); + + editor.show(); + })); + + 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 ddba104..95eb816 100644 --- a/src/dialogs/mod.rs +++ b/src/dialogs/mod.rs @@ -1,6 +1,9 @@ pub mod ensemble_editor; pub use ensemble_editor::*; +pub mod ensemble_selector; +pub use ensemble_selector::*; + pub mod instrument_editor; pub use instrument_editor::*;