This commit is contained in:
Erica Z 2024-11-05 15:38:46 +01:00
parent cad786213c
commit 930430d5ec
4 changed files with 55 additions and 13 deletions

View file

@ -46,7 +46,7 @@ template $AudreyUiPlaybar: Adw.Bin {
xalign: 0; xalign: 0;
halign: start; halign: start;
label: bind template.song as <$AudreyPlaybinSong>.title; label: bind $song_title(template.song) as <string>;
ellipsize: end; ellipsize: end;
} }
@ -56,7 +56,7 @@ template $AudreyUiPlaybar: Adw.Bin {
] ]
xalign: 0; xalign: 0;
label: bind template.song as <$AudreyPlaybinSong>.artist; label: bind $song_artist(template.song) as <string>;
ellipsize: end; ellipsize: end;
} }
@ -66,7 +66,7 @@ template $AudreyUiPlaybar: Adw.Bin {
] ]
xalign: 0; xalign: 0;
label: bind template.song as <$AudreyPlaybinSong>.album; label: bind $song_album(template.song) as <string>;
ellipsize: end; ellipsize: end;
} }
} }

View file

@ -87,7 +87,9 @@ mod imp {
#[template_callback] #[template_callback]
fn on_row_activated(&self, position: u32) { fn on_row_activated(&self, position: u32) {
self.obj().window().playlist_play_index(position as i64); self.obj()
.window()
.playlist_play_index(Some(position as i64));
} }
} }

View file

@ -15,7 +15,7 @@ mod imp {
#[property(get)] #[property(get)]
pulse_bar: TemplateChild<gtk::ProgressBar>, pulse_bar: TemplateChild<gtk::ProgressBar>,
#[property(get, set)] #[property(get, set, nullable)]
song: RefCell<Option<PlaybinSong>>, song: RefCell<Option<PlaybinSong>>,
#[property(get, set)] #[property(get, set)]
playing_cover_art: RefCell<Option<gdk::Paintable>>, playing_cover_art: RefCell<Option<gdk::Paintable>>,
@ -95,12 +95,20 @@ mod imp {
#[template_callback] #[template_callback]
fn on_skip_forward_clicked(&self) { fn on_skip_forward_clicked(&self) {
self.window().playlist_next(); if self.window().playlist_pos() + 1 < self.window().playlist_count() as i32 {
self.window().playlist_next();
} else {
self.window().playlist_play_index(None);
}
} }
#[template_callback] #[template_callback]
fn on_skip_backward_clicked(&self) { fn on_skip_backward_clicked(&self) {
self.window().playlist_prev(); if self.window().playlist_pos() > 0 {
self.window().playlist_prev();
} else {
self.window().playlist_play_index(None);
}
} }
#[template_callback] #[template_callback]
@ -126,7 +134,12 @@ mod imp {
#[template_callback] #[template_callback]
fn on_play_pause_clicked(&self, _button: &gtk::Button) { fn on_play_pause_clicked(&self, _button: &gtk::Button) {
self.window().set_pause(!self.window().pause()); if self.window().idle_active() {
self.window().playlist_play_index(Some(0));
self.window().set_pause(false);
} else {
self.window().set_pause(!self.window().pause());
}
} }
#[template_callback] #[template_callback]
@ -151,6 +164,23 @@ mod imp {
fn window(&self) -> crate::ui::Window { fn window(&self) -> crate::ui::Window {
self.obj().root().unwrap().dynamic_cast().unwrap() self.obj().root().unwrap().dynamic_cast().unwrap()
} }
// these are nedeed because with regular bindings, if song becomes None, the labes are not
// updated
#[template_callback]
fn song_title(&self, song: Option<&PlaybinSong>) -> String {
song.map(PlaybinSong::title).unwrap_or("".to_string())
}
#[template_callback]
fn song_artist(&self, song: Option<&PlaybinSong>) -> String {
song.map(PlaybinSong::artist).unwrap_or("".to_string())
}
#[template_callback]
fn song_album(&self, song: Option<&PlaybinSong>) -> String {
song.map(PlaybinSong::album).unwrap_or("".to_string())
}
} }
impl Drop for Playbar { impl Drop for Playbar {

View file

@ -305,6 +305,8 @@ mod imp {
Event::EndFile(event) => { Event::EndFile(event) => {
event!(Level::INFO, "end file event: {event:?}"); event!(Level::INFO, "end file event: {event:?}");
window.notify("song");
window.imp().buffering_end();
if let Err(err) = event.reason { if let Err(err) = event.reason {
event!(Level::ERROR, "end file error: {err}"); event!(Level::ERROR, "end file error: {err}");
@ -575,11 +577,19 @@ impl Window {
todo!() todo!()
} }
pub fn playlist_play_index(&self, index: i64) { pub fn playlist_play_index(&self, index: Option<i64>) {
self.imp() match index.as_ref() {
.mpv Some(index) => self
.command(["playlist-play-index", &index.to_string()]) .imp()
.unwrap(); .mpv
.command(["playlist-play-index", &index.to_string()])
.unwrap(),
None => self
.imp()
.mpv
.command(["playlist-play-index", "none"])
.unwrap(),
};
} }
pub fn playlist_remove(&self, index: i64) { pub fn playlist_remove(&self, index: i64) {