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

View file

@ -87,7 +87,9 @@ mod imp {
#[template_callback]
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)]
pulse_bar: TemplateChild<gtk::ProgressBar>,
#[property(get, set)]
#[property(get, set, nullable)]
song: RefCell<Option<PlaybinSong>>,
#[property(get, set)]
playing_cover_art: RefCell<Option<gdk::Paintable>>,
@ -95,12 +95,20 @@ mod imp {
#[template_callback]
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]
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]
@ -126,7 +134,12 @@ mod imp {
#[template_callback]
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]
@ -151,6 +164,23 @@ mod imp {
fn window(&self) -> crate::ui::Window {
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 {

View file

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