mirror of
https://github.com/johrpan/musicus.git
synced 2025-10-26 11:47:25 +01:00
Add player mockup
This commit is contained in:
parent
ba5958d549
commit
00bd7027a6
5 changed files with 105 additions and 9 deletions
|
|
@ -14,8 +14,6 @@ template $MusicusWindow : Adw.ApplicationWindow {
|
||||||
$MusicusWelcomePage {
|
$MusicusWelcomePage {
|
||||||
folder-selected => $set_library_folder() swapped;
|
folder-selected => $set_library_folder() swapped;
|
||||||
}
|
}
|
||||||
|
|
||||||
$MusicusHomePage {}
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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, _: >k::Button) {
|
fn play(&self, _: >k::Button) {
|
||||||
log::info!("Play button clicked");
|
log::info!("Play button clicked");
|
||||||
|
self.imp().player.borrow().play();
|
||||||
}
|
}
|
||||||
|
|
||||||
#[template_callback]
|
#[template_callback]
|
||||||
|
|
|
||||||
|
|
@ -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
52
src/player.rs
Normal 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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue