Add player mockup

This commit is contained in:
Elias Projahn 2023-09-29 21:18:28 +02:00
parent ba5958d549
commit 00bd7027a6
5 changed files with 105 additions and 9 deletions

View file

@ -14,8 +14,6 @@ template $MusicusWindow : Adw.ApplicationWindow {
$MusicusWelcomePage { $MusicusWelcomePage {
folder-selected => $set_library_folder() swapped; folder-selected => $set_library_folder() swapped;
} }
$MusicusHomePage {}
}; };
} }

View file

@ -1,14 +1,20 @@
use crate::player::MusicusPlayer;
use adw::subclass::{navigation_page::NavigationPageImpl, prelude::*}; use adw::subclass::{navigation_page::NavigationPageImpl, prelude::*};
use gtk::{glib, prelude::*}; use gtk::{glib, glib::Properties, prelude::*};
use std::cell::RefCell;
mod imp { mod imp {
use crate::tile::MusicusTile; use crate::tile::MusicusTile;
use super::*; 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")] #[template(file = "data/ui/home_page.blp")]
pub struct MusicusHomePage { pub struct MusicusHomePage {
#[property(get, set)]
pub player: RefCell<MusicusPlayer>,
#[template_child] #[template_child]
pub search_entry: TemplateChild<gtk::SearchEntry>, pub search_entry: TemplateChild<gtk::SearchEntry>,
#[template_child] #[template_child]
@ -37,12 +43,20 @@ mod imp {
} }
} }
#[glib::derived_properties]
impl ObjectImpl for MusicusHomePage { impl ObjectImpl for MusicusHomePage {
fn constructed(&self) { fn constructed(&self) {
self.parent_constructed(); self.parent_constructed();
self.search_entry self.search_entry
.set_key_capture_widget(Some(self.obj().as_ref())); .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 { for _ in 0..9 {
self.persons_flow_box.append(&MusicusTile::new()); self.persons_flow_box.append(&MusicusTile::new());
self.works_flow_box.append(&MusicusTile::new()); self.works_flow_box.append(&MusicusTile::new());
@ -62,13 +76,14 @@ glib::wrapper! {
#[gtk::template_callbacks] #[gtk::template_callbacks]
impl MusicusHomePage { impl MusicusHomePage {
pub fn new() -> Self { pub fn new(player: &MusicusPlayer) -> Self {
glib::Object::new() glib::Object::builder().property("player", player).build()
} }
#[template_callback] #[template_callback]
fn play(&self, _: &gtk::Button) { fn play(&self, _: &gtk::Button) {
log::info!("Play button clicked"); log::info!("Play button clicked");
self.imp().player.borrow().play();
} }
#[template_callback] #[template_callback]

View file

@ -1,6 +1,7 @@
mod application; mod application;
mod config; mod config;
mod home_page; mod home_page;
mod player;
mod playlist_page; mod playlist_page;
mod tile; mod tile;
mod welcome_page; mod welcome_page;

52
src/player.rs Normal file
View file

@ -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<bool>,
#[property(get, set)]
pub playing: Cell<bool>,
}
#[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<imp::MusicusPlayer>);
}
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()
}
}

View file

@ -1,10 +1,10 @@
use crate::{ use crate::{
home_page::MusicusHomePage, playlist_page::MusicusPlaylistPage, home_page::MusicusHomePage, player::MusicusPlayer, playlist_page::MusicusPlaylistPage,
welcome_page::MusicusWelcomePage, welcome_page::MusicusWelcomePage,
}; };
use adw::subclass::prelude::*; use adw::subclass::prelude::*;
use gtk::{gio, glib, prelude::*}; use gtk::{gio, glib, glib::clone, prelude::*};
mod imp { mod imp {
use super::*; use super::*;
@ -12,6 +12,8 @@ mod imp {
#[derive(Debug, Default, gtk::CompositeTemplate)] #[derive(Debug, Default, gtk::CompositeTemplate)]
#[template(file = "data/ui/window.blp")] #[template(file = "data/ui/window.blp")]
pub struct MusicusWindow { pub struct MusicusWindow {
pub player: MusicusPlayer,
#[template_child] #[template_child]
pub stack: TemplateChild<gtk::Stack>, pub stack: TemplateChild<gtk::Stack>,
#[template_child] #[template_child]
@ -19,6 +21,8 @@ mod imp {
#[template_child] #[template_child]
pub player_bar_revealer: TemplateChild<gtk::Revealer>, pub player_bar_revealer: TemplateChild<gtk::Revealer>,
#[template_child] #[template_child]
pub play_button: TemplateChild<gtk::Button>,
#[template_child]
pub playlist_button: TemplateChild<gtk::ToggleButton>, pub playlist_button: TemplateChild<gtk::ToggleButton>,
} }
@ -45,6 +49,30 @@ mod imp {
fn constructed(&self) { fn constructed(&self) {
self.parent_constructed(); self.parent_constructed();
self.obj().load_window_state(); 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) { fn set_library_folder(&self, folder: &gio::File) {
let path = folder.path(); let path = folder.path();
log::info!("{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] #[template_callback]