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
+
+
+
@@ -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();
}
}));