From 00bd7027a6f5d0ee76ff0b2678dd9eeb3db998b4 Mon Sep 17 00:00:00 2001 From: Elias Projahn Date: Fri, 29 Sep 2023 21:18:28 +0200 Subject: [PATCH] Add player mockup --- data/ui/window.blp | 2 -- src/home_page.rs | 23 ++++++++++++++++---- src/main.rs | 1 + src/player.rs | 52 ++++++++++++++++++++++++++++++++++++++++++++++ src/window.rs | 36 +++++++++++++++++++++++++++++--- 5 files changed, 105 insertions(+), 9 deletions(-) create mode 100644 src/player.rs diff --git a/data/ui/window.blp b/data/ui/window.blp index ae627b7..d429fa4 100644 --- a/data/ui/window.blp +++ b/data/ui/window.blp @@ -14,8 +14,6 @@ template $MusicusWindow : Adw.ApplicationWindow { $MusicusWelcomePage { folder-selected => $set_library_folder() swapped; } - - $MusicusHomePage {} }; } diff --git a/src/home_page.rs b/src/home_page.rs index 7c03995..05ff254 100644 --- a/src/home_page.rs +++ b/src/home_page.rs @@ -1,14 +1,20 @@ +use crate::player::MusicusPlayer; use adw::subclass::{navigation_page::NavigationPageImpl, prelude::*}; -use gtk::{glib, prelude::*}; +use gtk::{glib, glib::Properties, prelude::*}; +use std::cell::RefCell; mod imp { use crate::tile::MusicusTile; use super::*; - #[derive(Debug, Default, gtk::CompositeTemplate)] + #[derive(Properties, Debug, Default, gtk::CompositeTemplate)] + #[properties(wrapper_type = super::MusicusHomePage)] #[template(file = "data/ui/home_page.blp")] pub struct MusicusHomePage { + #[property(get, set)] + pub player: RefCell, + #[template_child] pub search_entry: TemplateChild, #[template_child] @@ -37,12 +43,20 @@ mod imp { } } + #[glib::derived_properties] impl ObjectImpl for MusicusHomePage { fn constructed(&self) { self.parent_constructed(); self.search_entry .set_key_capture_widget(Some(self.obj().as_ref())); + self.player + .borrow() + .bind_property("active", &self.play_button.get(), "visible") + .invert_boolean() + .sync_create() + .build(); + for _ in 0..9 { self.persons_flow_box.append(&MusicusTile::new()); self.works_flow_box.append(&MusicusTile::new()); @@ -62,13 +76,14 @@ glib::wrapper! { #[gtk::template_callbacks] impl MusicusHomePage { - pub fn new() -> Self { - glib::Object::new() + pub fn new(player: &MusicusPlayer) -> Self { + glib::Object::builder().property("player", player).build() } #[template_callback] fn play(&self, _: >k::Button) { log::info!("Play button clicked"); + self.imp().player.borrow().play(); } #[template_callback] diff --git a/src/main.rs b/src/main.rs index 4be09ce..33f3869 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,7 @@ mod application; mod config; mod home_page; +mod player; mod playlist_page; mod tile; mod welcome_page; diff --git a/src/player.rs b/src/player.rs new file mode 100644 index 0000000..1c5e763 --- /dev/null +++ b/src/player.rs @@ -0,0 +1,52 @@ +use gtk::{glib, glib::Properties, prelude::*, subclass::prelude::*}; +use std::cell::Cell; + +mod imp { + use super::*; + + #[derive(Properties, Debug, Default)] + #[properties(wrapper_type = super::MusicusPlayer)] + pub struct MusicusPlayer { + #[property(get, set)] + pub active: Cell, + #[property(get, set)] + pub playing: Cell, + } + + #[glib::object_subclass] + impl ObjectSubclass for MusicusPlayer { + const NAME: &'static str = "MusicusPlayer"; + type Type = super::MusicusPlayer; + } + + #[glib::derived_properties] + impl ObjectImpl for MusicusPlayer {} +} + +glib::wrapper! { + pub struct MusicusPlayer(ObjectSubclass); +} + +impl MusicusPlayer { + pub fn new() -> Self { + glib::Object::new() + } + + pub fn play(&self) { + if !self.imp().active.get() { + self.set_property("active", true); + } + + self.set_property("playing", true); + } + + pub fn pause(&self) { + self.set_property("playing", false); + } +} + +impl Default for MusicusPlayer { + fn default() -> Self { + Self::new() + } +} diff --git a/src/window.rs b/src/window.rs index e459692..1aa208e 100644 --- a/src/window.rs +++ b/src/window.rs @@ -1,10 +1,10 @@ use crate::{ - home_page::MusicusHomePage, playlist_page::MusicusPlaylistPage, + home_page::MusicusHomePage, player::MusicusPlayer, playlist_page::MusicusPlaylistPage, welcome_page::MusicusWelcomePage, }; use adw::subclass::prelude::*; -use gtk::{gio, glib, prelude::*}; +use gtk::{gio, glib, glib::clone, prelude::*}; mod imp { use super::*; @@ -12,6 +12,8 @@ mod imp { #[derive(Debug, Default, gtk::CompositeTemplate)] #[template(file = "data/ui/window.blp")] pub struct MusicusWindow { + pub player: MusicusPlayer, + #[template_child] pub stack: TemplateChild, #[template_child] @@ -19,6 +21,8 @@ mod imp { #[template_child] pub player_bar_revealer: TemplateChild, #[template_child] + pub play_button: TemplateChild, + #[template_child] pub playlist_button: TemplateChild, } @@ -45,6 +49,30 @@ mod imp { fn constructed(&self) { self.parent_constructed(); self.obj().load_window_state(); + self.player + .bind_property("active", &self.player_bar_revealer.get(), "reveal-child") + .sync_create() + .build(); + + let play_button = self.play_button.get(); + + self.player + .connect_playing_notify(clone!(@weak play_button => move |player| { + play_button.set_icon_name(if player.playing() { + "media-playback-pause-symbolic" + } else { + "media-playback-start-symbolic" + }); + })); + + self.play_button + .connect_clicked(clone!(@weak self.player as player => move |_| { + if player.playing() { + player.pause(); + } else { + player.play(); + } + })); } } @@ -99,7 +127,9 @@ impl MusicusWindow { fn set_library_folder(&self, folder: &gio::File) { let path = folder.path(); log::info!("{path:?}"); - self.imp().navigation_view.replace_with_tags(&["home"]); + self.imp() + .navigation_view + .replace(&[MusicusHomePage::new(&self.imp().player).into()]); } #[template_callback]