From 19670da538be29b83397421507bc8d3cdddbc580 Mon Sep 17 00:00:00 2001 From: Elias Projahn Date: Tue, 7 Nov 2023 16:21:47 +0100 Subject: [PATCH] Hook up library manager --- data/ui/home_page.blp | 4 +++ data/ui/library_manager.blp | 12 +++++++++ po/POTFILES | 1 + src/library_manager.rs | 53 +++++++++++++++++++++++++++++++++++++ src/main.rs | 1 + src/window.rs | 19 +++++++++++-- 6 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 data/ui/library_manager.blp create mode 100644 src/library_manager.rs diff --git a/data/ui/home_page.blp b/data/ui/home_page.blp index e614adf..0b36fc3 100644 --- a/data/ui/home_page.blp +++ b/data/ui/home_page.blp @@ -156,6 +156,10 @@ template $MusicusHomePage : Adw.NavigationPage { } menu primary_menu { + item { + label: _("_Library manager"); + action: "win.library"; + } item { label: _("_Preferences"); action: "app.preferences"; diff --git a/data/ui/library_manager.blp b/data/ui/library_manager.blp new file mode 100644 index 0000000..2672a02 --- /dev/null +++ b/data/ui/library_manager.blp @@ -0,0 +1,12 @@ +using Gtk 4.0; +using Adw 1; + +template $MusicusLibraryManager : Adw.NavigationPage { + title: _("Music Library"); + tag: "library"; + + Adw.ToolbarView { + [top] + Adw.HeaderBar {} + } +} \ No newline at end of file diff --git a/po/POTFILES b/po/POTFILES index c58a81c..48e7687 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -1,4 +1,5 @@ data/ui/home_page.blp +data/ui/library_manager.blp data/ui/player_bar.blp data/ui/playlist_page.blp data/ui/playlist_tile.blp diff --git a/src/library_manager.rs b/src/library_manager.rs new file mode 100644 index 0000000..cb07b49 --- /dev/null +++ b/src/library_manager.rs @@ -0,0 +1,53 @@ +use crate::library::MusicusLibrary; +use adw::{ + prelude::*, + subclass::{navigation_page::NavigationPageImpl, prelude::*}, +}; +use gtk::glib::{self, Properties}; +use std::cell::OnceCell; + +mod imp { + use super::*; + + #[derive(Properties, Debug, Default, gtk::CompositeTemplate)] + #[properties(wrapper_type = super::LibraryManager)] + #[template(file = "data/ui/library_manager.blp")] + pub struct LibraryManager { + #[property(get, construct_only)] + pub library: OnceCell, + } + + #[glib::object_subclass] + impl ObjectSubclass for LibraryManager { + const NAME: &'static str = "MusicusLibraryManager"; + type Type = super::LibraryManager; + type ParentType = adw::NavigationPage; + + fn class_init(klass: &mut Self::Class) { + klass.bind_template(); + klass.bind_template_instance_callbacks(); + } + + fn instance_init(obj: &glib::subclass::InitializingObject) { + obj.init_template(); + } + } + + #[glib::derived_properties] + impl ObjectImpl for LibraryManager {} + + impl WidgetImpl for LibraryManager {} + impl NavigationPageImpl for LibraryManager {} +} + +glib::wrapper! { + pub struct LibraryManager(ObjectSubclass) + @extends gtk::Widget, adw::NavigationPage; +} + +#[gtk::template_callbacks] +impl LibraryManager { + pub fn new(library: &MusicusLibrary) -> Self { + glib::Object::builder().property("library", library).build() + } +} diff --git a/src/main.rs b/src/main.rs index bb3badf..1c0889d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,7 @@ mod application; mod config; mod home_page; +mod library_manager; mod library; mod player; mod player_bar; diff --git a/src/window.rs b/src/window.rs index 0069846..add8081 100644 --- a/src/window.rs +++ b/src/window.rs @@ -1,6 +1,7 @@ use crate::{ - home_page::MusicusHomePage, library::MusicusLibrary, player::MusicusPlayer, - player_bar::PlayerBar, playlist_page::MusicusPlaylistPage, welcome_page::MusicusWelcomePage, + home_page::MusicusHomePage, library::MusicusLibrary, library_manager::LibraryManager, + player::MusicusPlayer, player_bar::PlayerBar, playlist_page::MusicusPlaylistPage, + welcome_page::MusicusWelcomePage, }; use adw::subclass::prelude::*; use gtk::{gio, glib, glib::clone, prelude::*}; @@ -44,6 +45,15 @@ mod imp { self.parent_constructed(); self.obj().load_window_state(); + let navigation_view = self.navigation_view.get().to_owned(); + let library_action = gio::ActionEntry::builder("library") + .activate(move |_: &super::MusicusWindow, _, _| { + navigation_view.push_by_tag("library") + }) + .build(); + + self.obj().add_action_entries([library_action]); + let player_bar = PlayerBar::new(&self.player); self.player_bar_revealer.set_child(Some(&player_bar)); @@ -144,8 +154,13 @@ impl MusicusWindow { fn load_library(&self, path: impl AsRef) { let library = MusicusLibrary::new(path); + self.imp() .navigation_view .replace(&[MusicusHomePage::new(&library, &self.imp().player).into()]); + + self.imp() + .navigation_view + .add(&LibraryManager::new(&library)); } }