Adjust mpris player UI formatting
This commit is contained in:
parent
2c43d72b5a
commit
11e9ff8e38
2 changed files with 38 additions and 32 deletions
17
src/mpris.rs
17
src/mpris.rs
|
|
@ -13,7 +13,7 @@ use crate::mpris_player::MprisPlayer;
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
pub struct MprisControlsInner {
|
pub struct MprisControlsInner {
|
||||||
box_: DerefCell<gtk4::Box>,
|
listbox: DerefCell<gtk4::ListBox>,
|
||||||
dbus: OnceCell<DBus>,
|
dbus: OnceCell<DBus>,
|
||||||
players: RefCell<HashMap<String, MprisPlayer>>,
|
players: RefCell<HashMap<String, MprisPlayer>>,
|
||||||
}
|
}
|
||||||
|
|
@ -31,8 +31,8 @@ impl ObjectSubclass for MprisControlsInner {
|
||||||
|
|
||||||
impl ObjectImpl for MprisControlsInner {
|
impl ObjectImpl for MprisControlsInner {
|
||||||
fn constructed(&self, obj: &MprisControls) {
|
fn constructed(&self, obj: &MprisControls) {
|
||||||
let box_ = cascade! {
|
let listbox = cascade! {
|
||||||
gtk4::Box::new(gtk4::Orientation::Vertical, 0);
|
gtk4::ListBox::new();
|
||||||
..set_parent(obj);
|
..set_parent(obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -72,11 +72,11 @@ impl ObjectImpl for MprisControlsInner {
|
||||||
let _ = obj.inner().dbus.set(dbus);
|
let _ = obj.inner().dbus.set(dbus);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
self.box_.set(box_);
|
self.listbox.set(listbox);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn dispose(&self, _obj: &MprisControls) {
|
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()
|
self.inner()
|
||||||
.players
|
.players
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
use cascade::cascade;
|
use cascade::cascade;
|
||||||
use gtk4::{
|
use gtk4::{
|
||||||
gdk, gdk_pixbuf, gio,
|
gdk_pixbuf, gio,
|
||||||
glib::{self, clone},
|
glib::{self, clone},
|
||||||
pango,
|
pango,
|
||||||
prelude::*,
|
prelude::*,
|
||||||
|
|
@ -17,8 +17,8 @@ pub struct MprisPlayerInner {
|
||||||
play_pause_button: DerefCell<gtk4::Button>,
|
play_pause_button: DerefCell<gtk4::Button>,
|
||||||
forward_button: DerefCell<gtk4::Button>,
|
forward_button: DerefCell<gtk4::Button>,
|
||||||
player: DerefCell<Player>,
|
player: DerefCell<Player>,
|
||||||
picture: DerefCell<gtk4::Picture>,
|
image: DerefCell<gtk4::Image>,
|
||||||
picture_uri: RefCell<Option<String>>,
|
image_uri: RefCell<Option<String>>,
|
||||||
title_label: DerefCell<gtk4::Label>,
|
title_label: DerefCell<gtk4::Label>,
|
||||||
artist_label: DerefCell<gtk4::Label>,
|
artist_label: DerefCell<gtk4::Label>,
|
||||||
}
|
}
|
||||||
|
|
@ -36,16 +36,14 @@ impl ObjectSubclass for MprisPlayerInner {
|
||||||
|
|
||||||
impl ObjectImpl for MprisPlayerInner {
|
impl ObjectImpl for MprisPlayerInner {
|
||||||
fn constructed(&self, obj: &MprisPlayer) {
|
fn constructed(&self, obj: &MprisPlayer) {
|
||||||
let picture = cascade! {
|
let image = cascade! {
|
||||||
gtk4::Picture::new();
|
gtk4::Image::new();
|
||||||
..set_halign(gtk4::Align::Center);
|
..set_pixel_size(64);
|
||||||
..set_valign(gtk4::Align::Center);
|
|
||||||
..set_can_shrink(true);
|
|
||||||
..set_size_request(32, 32);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let title_label = cascade! {
|
let title_label = cascade! {
|
||||||
gtk4::Label::new(None);
|
gtk4::Label::new(None);
|
||||||
|
..set_halign(gtk4::Align::Start);
|
||||||
..set_ellipsize(pango::EllipsizeMode::End);
|
..set_ellipsize(pango::EllipsizeMode::End);
|
||||||
..set_max_width_chars(20);
|
..set_max_width_chars(20);
|
||||||
..set_attributes(Some(&cascade! {
|
..set_attributes(Some(&cascade! {
|
||||||
|
|
@ -56,6 +54,7 @@ impl ObjectImpl for MprisPlayerInner {
|
||||||
|
|
||||||
let artist_label = cascade! {
|
let artist_label = cascade! {
|
||||||
gtk4::Label::new(None);
|
gtk4::Label::new(None);
|
||||||
|
..set_halign(gtk4::Align::Start);
|
||||||
..set_ellipsize(pango::EllipsizeMode::End);
|
..set_ellipsize(pango::EllipsizeMode::End);
|
||||||
..set_max_width_chars(20);
|
..set_max_width_chars(20);
|
||||||
};
|
};
|
||||||
|
|
@ -76,17 +75,20 @@ impl ObjectImpl for MprisPlayerInner {
|
||||||
};
|
};
|
||||||
|
|
||||||
let box_ = cascade! {
|
let box_ = cascade! {
|
||||||
gtk4::Box::new(gtk4::Orientation::Vertical, 0);
|
gtk4::Box::new(gtk4::Orientation::Horizontal, 6);
|
||||||
..set_parent(obj);
|
..set_parent(obj);
|
||||||
..append(&picture);
|
..append(&image);
|
||||||
..append(&title_label);
|
|
||||||
..append(&artist_label);
|
|
||||||
..append(&cascade! {
|
..append(&cascade! {
|
||||||
gtk4::Box::new(gtk4::Orientation::Horizontal, 0);
|
gtk4::Box::new(gtk4::Orientation::Vertical, 0);
|
||||||
..set_valign(gtk4::Align::Start);
|
..append(&title_label);
|
||||||
..append(&backward_button);
|
..append(&artist_label);
|
||||||
..append(&play_pause_button);
|
..append(&cascade! {
|
||||||
..append(&forward_button);
|
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.backward_button.set(backward_button);
|
||||||
self.play_pause_button.set(play_pause_button);
|
self.play_pause_button.set(play_pause_button);
|
||||||
self.forward_button.set(forward_button);
|
self.forward_button.set(forward_button);
|
||||||
self.picture.set(picture);
|
self.image.set(image);
|
||||||
self.title_label.set(title_label);
|
self.title_label.set(title_label);
|
||||||
self.artist_label.set(artist_label);
|
self.artist_label.set(artist_label);
|
||||||
}
|
}
|
||||||
|
|
@ -138,24 +140,23 @@ impl MprisPlayer {
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn update_arturl(&self, arturl: Option<&str>) {
|
async fn update_arturl(&self, arturl: Option<&str>) {
|
||||||
let mut picture_uri = self.inner().picture_uri.borrow_mut();
|
let mut image_uri = self.inner().image_uri.borrow_mut();
|
||||||
if picture_uri.as_deref() == arturl {
|
if image_uri.as_deref() == arturl {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
*picture_uri = arturl.map(String::from);
|
*image_uri = arturl.map(String::from);
|
||||||
drop(picture_uri);
|
drop(image_uri);
|
||||||
|
|
||||||
let pixbuf = async {
|
let pixbuf = async {
|
||||||
let file = gio::File::for_uri(&arturl?);
|
let file = gio::File::for_uri(&arturl?);
|
||||||
let stream = file.read_async_future(glib::PRIORITY_DEFAULT).await.ok()?;
|
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
|
.await
|
||||||
.ok()
|
.ok()
|
||||||
}
|
}
|
||||||
.await;
|
.await;
|
||||||
if let Some(pixbuf) = pixbuf {
|
if let Some(pixbuf) = pixbuf {
|
||||||
let texture = gdk::Texture::for_pixbuf(&pixbuf);
|
self.inner().image.set_from_pixbuf(Some(&pixbuf));
|
||||||
self.inner().picture.set_paintable(Some(&texture));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue