From 3350c6be95dfd897e7fb9de42e5ba411081e4f8e Mon Sep 17 00:00:00 2001 From: Elias Projahn Date: Tue, 8 Feb 2022 18:18:29 +0100 Subject: [PATCH] main screen: Add button to start random playback --- backend/src/player.rs | 47 ++++++++++++++++++++----------- musicus/res/ui/main_screen.ui | 18 ++++++++++-- musicus/src/screens/main.rs | 10 +++++++ musicus/src/screens/player.rs | 2 +- musicus/src/widgets/player_bar.rs | 2 +- 5 files changed, 57 insertions(+), 22 deletions(-) diff --git a/backend/src/player.rs b/backend/src/player.rs index a77d822..0e6be54 100644 --- a/backend/src/player.rs +++ b/backend/src/player.rs @@ -110,18 +110,18 @@ impl Player { result .mpris .connect_play_pause(clone!(@weak result => move || { - result.play_pause(); + result.play_pause().unwrap(); })); result.mpris.connect_play(clone!(@weak result => move || { if !result.is_playing() { - result.play_pause(); + result.play_pause().unwrap(); } })); result.mpris.connect_pause(clone!(@weak result => move || { if result.is_playing() { - result.play_pause(); + result.play_pause().unwrap(); } })); @@ -223,7 +223,7 @@ impl Player { Ok(()) } - pub fn play_pause(&self) { + pub fn play_pause(&self) -> Result<()> { if self.is_playing() { self.player.pause(); self.playing.set(false); @@ -235,6 +235,10 @@ impl Player { #[cfg(target_os = "linux")] self.mpris.set_playback_status(PlaybackStatus::Paused); } else { + if self.current_track.get().is_none() { + self.next()?; + } + self.player.play(); self.playing.set(true); @@ -245,6 +249,8 @@ impl Player { #[cfg(target_os = "linux")] self.mpris.set_playback_status(PlaybackStatus::Playing); } + + Ok(()) } pub fn seek(&self, ms: u64) { @@ -287,23 +293,30 @@ impl Player { } pub fn next(&self) -> Result<()> { - let mut current_track = self.current_track.get().ok_or_else(|| { - Error::Other(String::from( - "Player tried to access non existant current track.", - )) - })?; + let current_track = self.current_track.get(); + let cb = self.generate_next_track_cb.borrow(); - if current_track + 1 < self.playlist.borrow().len() { - current_track += 1; - } else if let Some(cb) = &*self.generate_next_track_cb.borrow() { + if let Some(current_track) = current_track { + if current_track + 1 >= self.playlist.borrow().len() { + if let Some(cb) = &*cb { + let new_track = cb(); + self.add_item(new_track)?; + } else { + return Err(Error::Other(String::from("No existing next track."))); + } + } + + self.set_track(current_track + 1)?; + + Ok(()) + } else if let Some(cb) = &*cb { let new_track = cb(); self.add_item(new_track)?; - current_track += 1; - } else { - return Err(Error::Other(String::from("No existing next track."))); - } - self.set_track(current_track) + Ok(()) + } else { + Err(Error::Other(String::from("No existing next track."))) + } } pub fn set_track(&self, current_track: usize) -> Result<()> { diff --git a/musicus/res/ui/main_screen.ui b/musicus/res/ui/main_screen.ui index 7cd6ad2..50765c1 100644 --- a/musicus/res/ui/main_screen.ui +++ b/musicus/res/ui/main_screen.ui @@ -7,7 +7,7 @@ - + @@ -17,6 +17,18 @@ Welcome to Musicus! Get startet by selecting something from the sidebar or adding new things to your library using the button in the top left corner. true + + + true + crossfade + + + center + Play something + + + + @@ -40,7 +52,7 @@ Musicus @@ -104,7 +116,7 @@ - + diff --git a/musicus/src/screens/main.rs b/musicus/src/screens/main.rs index 708b05a..7d79b82 100644 --- a/musicus/src/screens/main.rs +++ b/musicus/src/screens/main.rs @@ -32,6 +32,8 @@ impl Screen<(), ()> for MainScreen { get_widget!(builder, gtk::Box, widget); get_widget!(builder, adw::Leaflet, leaflet); + get_widget!(builder, gtk::Revealer, play_button_revealer); + get_widget!(builder, gtk::Button, play_button); get_widget!(builder, gtk::Button, add_button); get_widget!(builder, gtk::SearchEntry, search_entry); get_widget!(builder, gtk::Stack, stack); @@ -126,6 +128,14 @@ impl Screen<(), ()> for MainScreen { search.is_empty() || title.contains(&search) })); + this.handle.backend.pl().add_playlist_cb(clone!(@weak play_button_revealer => move |new_playlist| { + play_button_revealer.set_reveal_child(new_playlist.is_empty()); + })); + + play_button.connect_clicked(clone!(@weak this => move |_| { + this.handle.backend.pl().play_pause().unwrap(); + })); + this.navigator.set_back_cb(clone!(@weak this => move || { this.leaflet.set_visible_child_name("sidebar"); })); diff --git a/musicus/src/screens/player.rs b/musicus/src/screens/player.rs index 6bc78c6..07e97b5 100644 --- a/musicus/src/screens/player.rs +++ b/musicus/src/screens/player.rs @@ -163,7 +163,7 @@ impl Screen<(), ()> for PlayerScreen { this.play_button .connect_clicked(clone!(@weak this => move |_| { - this.handle.backend.pl().play_pause(); + this.handle.backend.pl().play_pause().unwrap(); })); this.next_button diff --git a/musicus/src/widgets/player_bar.rs b/musicus/src/widgets/player_bar.rs index e25b4fe..3447256 100644 --- a/musicus/src/widgets/player_bar.rs +++ b/musicus/src/widgets/player_bar.rs @@ -47,7 +47,7 @@ impl PlayerBar { play_button.connect_clicked(clone!(@strong player => move |_| { if let Some(player) = &*player.borrow() { - player.play_pause(); + player.play_pause().unwrap(); } }));