Base code for now playing (I regret doing this with relm4)
This commit is contained in:
parent
af3470df11
commit
4c562d041f
1 changed files with 45 additions and 1 deletions
|
|
@ -5,7 +5,7 @@ use libpulse_binding::{
|
||||||
volume::Volume,
|
volume::Volume,
|
||||||
};
|
};
|
||||||
use pulsectl::{
|
use pulsectl::{
|
||||||
controllers::{types::DeviceInfo, DeviceControl, SinkController, SourceController},
|
controllers::{types::DeviceInfo, AppControl, DeviceControl, SinkController, SourceController},
|
||||||
Handler,
|
Handler,
|
||||||
};
|
};
|
||||||
use relm4::{
|
use relm4::{
|
||||||
|
|
@ -26,6 +26,7 @@ pub enum AppInput {
|
||||||
Outputs,
|
Outputs,
|
||||||
InputVolume,
|
InputVolume,
|
||||||
OutputVolume,
|
OutputVolume,
|
||||||
|
NowPlaying,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct App {
|
pub struct App {
|
||||||
|
|
@ -34,6 +35,7 @@ pub struct App {
|
||||||
default_output: Option<DeviceInfo>,
|
default_output: Option<DeviceInfo>,
|
||||||
outputs: Vec<DeviceInfo>,
|
outputs: Vec<DeviceInfo>,
|
||||||
handler: Handler,
|
handler: Handler,
|
||||||
|
update_now_playing: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for App {
|
impl Default for App {
|
||||||
|
|
@ -61,6 +63,7 @@ impl Default for App {
|
||||||
default_output,
|
default_output,
|
||||||
outputs,
|
outputs,
|
||||||
handler,
|
handler,
|
||||||
|
update_now_playing: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -196,6 +199,34 @@ impl App {
|
||||||
widgets.outputs.container_add(&item);
|
widgets.outputs.container_add(&item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn update_now_playing(&self, widgets: &AppWidgets) {
|
||||||
|
let mut output_controller =
|
||||||
|
SinkController::create().expect("failed to create output controller");
|
||||||
|
let apps = output_controller.list_applications().unwrap_or_default();
|
||||||
|
while let Some(row) = widgets.playing_apps.row_at_index(0) {
|
||||||
|
widgets.playing_apps.remove(&row);
|
||||||
|
}
|
||||||
|
for app in apps {
|
||||||
|
let icon_name = app
|
||||||
|
.proplist
|
||||||
|
.get_str("application.icon_name")
|
||||||
|
.unwrap_or_default();
|
||||||
|
let name = app.name.unwrap_or_default();
|
||||||
|
view! {
|
||||||
|
GtkBox {
|
||||||
|
set_orientation: Orientation::Horizontal,
|
||||||
|
append: icon = &Image {
|
||||||
|
set_icon_name: Some(&icon_name),
|
||||||
|
set_pixel_size: 24,
|
||||||
|
},
|
||||||
|
append: title = &Label {
|
||||||
|
set_label: &name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[component(pub)]
|
#[component(pub)]
|
||||||
|
|
@ -292,6 +323,12 @@ impl SimpleComponent for App {
|
||||||
set_activate_on_single_click: true
|
set_activate_on_single_click: true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
&Separator {
|
||||||
|
set_orientation: Orientation::Horizontal,
|
||||||
|
},
|
||||||
|
append: playing_apps = &ListBox {
|
||||||
|
set_selection_mode: gtk::SelectionMode::None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -329,6 +366,9 @@ impl SimpleComponent for App {
|
||||||
AppInput::OutputVolume => {
|
AppInput::OutputVolume => {
|
||||||
self.update_default_output();
|
self.update_default_output();
|
||||||
}
|
}
|
||||||
|
AppInput::NowPlaying => {
|
||||||
|
self.update_now_playing = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -339,5 +379,9 @@ impl SimpleComponent for App {
|
||||||
if self.inputs.is_empty() {
|
if self.inputs.is_empty() {
|
||||||
model.update_inputs(widgets);
|
model.update_inputs(widgets);
|
||||||
}
|
}
|
||||||
|
if self.update_now_playing {
|
||||||
|
model.update_now_playing(widgets);
|
||||||
|
self.update_now_playing = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue