From 11e9ff8e38e7040473b244d5dc86336777f3d24a Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Mon, 30 Aug 2021 14:58:55 -0700 Subject: [PATCH] Adjust mpris player UI formatting --- src/mpris.rs | 17 ++++++++++----- src/mpris_player.rs | 53 +++++++++++++++++++++++---------------------- 2 files changed, 38 insertions(+), 32 deletions(-) diff --git a/src/mpris.rs b/src/mpris.rs index a65d6eea..8dbfcbbb 100644 --- a/src/mpris.rs +++ b/src/mpris.rs @@ -13,7 +13,7 @@ use crate::mpris_player::MprisPlayer; #[derive(Default)] pub struct MprisControlsInner { - box_: DerefCell, + listbox: DerefCell, dbus: OnceCell, players: RefCell>, } @@ -31,8 +31,8 @@ impl ObjectSubclass for MprisControlsInner { impl ObjectImpl for MprisControlsInner { fn constructed(&self, obj: &MprisControls) { - let box_ = cascade! { - gtk4::Box::new(gtk4::Orientation::Vertical, 0); + let listbox = cascade! { + gtk4::ListBox::new(); ..set_parent(obj); }; @@ -72,11 +72,11 @@ impl ObjectImpl for MprisControlsInner { let _ = obj.inner().dbus.set(dbus); })); - self.box_.set(box_); + self.listbox.set(listbox); } fn dispose(&self, _obj: &MprisControls) { - self.box_.unparent(); + self.listbox.unparent(); } } @@ -105,7 +105,12 @@ impl MprisControls { } }; - self.inner().box_.append(&player); // XXX + let row = cascade! { + gtk4::ListBoxRow::new(); + ..set_selectable(false); + ..set_child(Some(&player)); + }; + self.inner().listbox.append(&row); self.inner() .players diff --git a/src/mpris_player.rs b/src/mpris_player.rs index 3d85c56b..0bdd1003 100644 --- a/src/mpris_player.rs +++ b/src/mpris_player.rs @@ -1,6 +1,6 @@ use cascade::cascade; use gtk4::{ - gdk, gdk_pixbuf, gio, + gdk_pixbuf, gio, glib::{self, clone}, pango, prelude::*, @@ -17,8 +17,8 @@ pub struct MprisPlayerInner { play_pause_button: DerefCell, forward_button: DerefCell, player: DerefCell, - picture: DerefCell, - picture_uri: RefCell>, + image: DerefCell, + image_uri: RefCell>, title_label: DerefCell, artist_label: DerefCell, } @@ -36,16 +36,14 @@ impl ObjectSubclass for MprisPlayerInner { impl ObjectImpl for MprisPlayerInner { fn constructed(&self, obj: &MprisPlayer) { - let picture = cascade! { - gtk4::Picture::new(); - ..set_halign(gtk4::Align::Center); - ..set_valign(gtk4::Align::Center); - ..set_can_shrink(true); - ..set_size_request(32, 32); + let image = cascade! { + gtk4::Image::new(); + ..set_pixel_size(64); }; let title_label = cascade! { gtk4::Label::new(None); + ..set_halign(gtk4::Align::Start); ..set_ellipsize(pango::EllipsizeMode::End); ..set_max_width_chars(20); ..set_attributes(Some(&cascade! { @@ -56,6 +54,7 @@ impl ObjectImpl for MprisPlayerInner { let artist_label = cascade! { gtk4::Label::new(None); + ..set_halign(gtk4::Align::Start); ..set_ellipsize(pango::EllipsizeMode::End); ..set_max_width_chars(20); }; @@ -76,17 +75,20 @@ impl ObjectImpl for MprisPlayerInner { }; let box_ = cascade! { - gtk4::Box::new(gtk4::Orientation::Vertical, 0); + gtk4::Box::new(gtk4::Orientation::Horizontal, 6); ..set_parent(obj); - ..append(&picture); - ..append(&title_label); - ..append(&artist_label); + ..append(&image); ..append(&cascade! { - gtk4::Box::new(gtk4::Orientation::Horizontal, 0); - ..set_valign(gtk4::Align::Start); - ..append(&backward_button); - ..append(&play_pause_button); - ..append(&forward_button); + gtk4::Box::new(gtk4::Orientation::Vertical, 0); + ..append(&title_label); + ..append(&artist_label); + ..append(&cascade! { + gtk4::Box::new(gtk4::Orientation::Horizontal, 0); + ..set_valign(gtk4::Align::Start); + ..append(&backward_button); + ..append(&play_pause_button); + ..append(&forward_button); + }); }); }; @@ -94,7 +96,7 @@ impl ObjectImpl for MprisPlayerInner { self.backward_button.set(backward_button); self.play_pause_button.set(play_pause_button); self.forward_button.set(forward_button); - self.picture.set(picture); + self.image.set(image); self.title_label.set(title_label); self.artist_label.set(artist_label); } @@ -138,24 +140,23 @@ impl MprisPlayer { } async fn update_arturl(&self, arturl: Option<&str>) { - let mut picture_uri = self.inner().picture_uri.borrow_mut(); - if picture_uri.as_deref() == arturl { + let mut image_uri = self.inner().image_uri.borrow_mut(); + if image_uri.as_deref() == arturl { return; } - *picture_uri = arturl.map(String::from); - drop(picture_uri); + *image_uri = arturl.map(String::from); + drop(image_uri); let pixbuf = async { let file = gio::File::for_uri(&arturl?); let stream = file.read_async_future(glib::PRIORITY_DEFAULT).await.ok()?; - gdk_pixbuf::Pixbuf::from_stream_at_scale_async_future(&stream, 256, 256, false) + gdk_pixbuf::Pixbuf::from_stream_async_future(&stream) .await .ok() } .await; if let Some(pixbuf) = pixbuf { - let texture = gdk::Texture::for_pixbuf(&pixbuf); - self.inner().picture.set_paintable(Some(&texture)); + self.inner().image.set_from_pixbuf(Some(&pixbuf)); } }