From cf96792029f2972241d2e541080f7cc5d72802c0 Mon Sep 17 00:00:00 2001 From: Elias Projahn Date: Sat, 31 Oct 2020 23:48:11 +0100 Subject: [PATCH] Add preferences dialog --- res/resources.xml | 1 + res/ui/preferences.ui | 44 ++++++++++++++++++++++++++++++++++++++ res/ui/window.ui | 31 +++++---------------------- src/backend.rs | 4 ++-- src/dialogs/mod.rs | 3 +++ src/dialogs/preferences.rs | 43 +++++++++++++++++++++++++++++++++++++ src/window.rs | 20 ++++++++++++++++- 7 files changed, 117 insertions(+), 29 deletions(-) create mode 100644 res/ui/preferences.ui create mode 100644 src/dialogs/preferences.rs diff --git a/res/resources.xml b/res/resources.xml index 51b79bd..4cc5d85 100644 --- a/res/resources.xml +++ b/res/resources.xml @@ -13,6 +13,7 @@ ui/person_screen.ui ui/person_selector.ui ui/poe_list.ui + ui/preferences.ui ui/recording_editor.ui ui/recording_screen.ui ui/recording_selector.ui diff --git a/res/ui/preferences.ui b/res/ui/preferences.ui new file mode 100644 index 0000000..2b4419b --- /dev/null +++ b/res/ui/preferences.ui @@ -0,0 +1,44 @@ + + + + + + + False + True + dialog + + + True + False + General + + + True + False + Music library + + + True + True + False + Music library folder + select_music_library_path_button + None selected + + + Select + True + True + True + center + + + + + + + + + + diff --git a/res/ui/window.ui b/res/ui/window.ui index f15c310..d8076d9 100644 --- a/res/ui/window.ui +++ b/res/ui/window.ui @@ -106,11 +106,10 @@ False False - + True True True - add_menu True @@ -126,7 +125,7 @@ True False True - add_menu + menu True @@ -171,31 +170,11 @@ - +
- Add person - win.add-person - - - Add instrument - win.add-instrument - - - Add work - win.add-work - - - Add ensemble - win.add-ensemble - - - Add recording - win.add-recording - - - Add tracks - win.add-tracks + Preferences + win.preferences
diff --git a/src/backend.rs b/src/backend.rs index ba01df3..4713ad8 100644 --- a/src/backend.rs +++ b/src/backend.rs @@ -314,8 +314,8 @@ impl Backend { receiver.await? } - pub fn set_music_library_path(&self, path: &str) { - self.music_library_path.replace(Some(PathBuf::from(path))); + pub fn set_music_library_path(&self, path: PathBuf) { + self.music_library_path.replace(Some(path.clone())); } pub fn get_music_library_path(&self) -> Option { diff --git a/src/dialogs/mod.rs b/src/dialogs/mod.rs index 68c7275..86bbb6f 100644 --- a/src/dialogs/mod.rs +++ b/src/dialogs/mod.rs @@ -22,6 +22,9 @@ pub use person_editor::*; pub mod person_selector; pub use person_selector::*; +pub mod preferences; +pub use preferences::*; + pub mod recording_editor; pub use recording_editor::*; diff --git a/src/dialogs/preferences.rs b/src/dialogs/preferences.rs new file mode 100644 index 0000000..3a64521 --- /dev/null +++ b/src/dialogs/preferences.rs @@ -0,0 +1,43 @@ +use crate::backend::Backend; +use glib::clone; +use gtk::prelude::*; +use gtk_macros::get_widget; +use libhandy::prelude::*; +use std::rc::Rc; + +pub struct Preferences { + window: gtk::Window, +} + +impl Preferences { + pub fn new>(backend: Rc, parent: &P) -> Self { + let builder = gtk::Builder::from_resource("/de/johrpan/musicus_editor/ui/preferences.ui"); + + get_widget!(builder, gtk::Window, window); + get_widget!(builder, libhandy::ActionRow, music_library_path_row); + get_widget!(builder, gtk::Button, select_music_library_path_button); + + window.set_transient_for(Some(parent)); + + if let Some(path) = backend.get_music_library_path() { + music_library_path_row.set_subtitle(Some(path.to_str().unwrap())); + } + + select_music_library_path_button.connect_clicked(clone!(@strong window, @strong backend, @strong music_library_path_row => move |_| { + let dialog = gtk::FileChooserNative::new(Some("Select music library folder"), Some(&window), gtk::FileChooserAction::SelectFolder, None, None); + + if let gtk::ResponseType::Accept = dialog.run() { + if let Some(path) = dialog.get_filename() { + music_library_path_row.set_subtitle(Some(path.to_str().unwrap())); + backend.set_music_library_path(path); + } + } + })); + + Self { window } + } + + pub fn show(&self) { + self.window.show(); + } +} diff --git a/src/window.rs b/src/window.rs index cc50b47..2da9fcb 100644 --- a/src/window.rs +++ b/src/window.rs @@ -24,10 +24,14 @@ impl Window { get_widget!(builder, libhandy::ApplicationWindow, window); get_widget!(builder, libhandy::Leaflet, leaflet); + get_widget!(builder, gtk::Button, add_button); get_widget!(builder, gtk::Box, sidebar_box); get_widget!(builder, gtk::Box, empty_screen); - let backend = Rc::new(Backend::new("test.sqlite", std::env::current_dir().unwrap())); + let backend = Rc::new(Backend::new( + "test.sqlite", + std::env::current_dir().unwrap(), + )); let poe_list = PoeList::new(backend.clone()); let navigator = Navigator::new(&empty_screen); @@ -60,6 +64,20 @@ impl Window { .pack_start(&result.poe_list.widget, true, true, 0); result.window.set_application(Some(app)); + add_button.connect_clicked(clone!(@strong result => move |_| { + TracksEditor::new(result.backend.clone(), &result.window, clone!(@strong result => move || { + result.reload(); + })).show(); + })); + + action!( + result.window, + "preferences", + clone!(@strong result => move |_, _| { + Preferences::new(result.backend.clone(), &result.window).show(); + }) + ); + action!( result.window, "add-person",