diff --git a/deckapp/src/main.rs b/deckapp/src/main.rs index eee7641..b1f97a5 100644 --- a/deckapp/src/main.rs +++ b/deckapp/src/main.rs @@ -1,4 +1,4 @@ -use std::{process::Command, string::FromUtf8Error, thread, time::Duration}; +use std::{process::Command, thread, time::Duration}; use lib::{tcp::start_server, ClientMessage, ServerMessage}; use log::info; @@ -18,6 +18,10 @@ fn main() { sender_s .send(ServerMessage::NowPlaying(get_np().unwrap())) .unwrap(); + thread::sleep(Duration::from_millis(200)); + sender_s + .send(ServerMessage::Playing(get_playing().unwrap())) + .unwrap(); } if receiver_c.is_empty() { thread::sleep(Duration::from_millis(200)); @@ -48,14 +52,20 @@ fn main() { } } -fn get_np() -> Result { +fn get_np() -> anyhow::Result { let output = Command::new("playerctl") .arg("metadata") .arg("-f") .arg("{{title}} - {{artist}}") - .output() - .unwrap() + .output()? .stdout; let title = String::from_utf8(output)?; Ok(title.trim().to_string()) } + +fn get_playing() -> anyhow::Result { + let output = Command::new("playerctl").arg("status").output()?.stdout; + + let res = String::from_utf8(output)?; + Ok(res.contains("Playing")) +} diff --git a/deckui/src/main.rs b/deckui/src/main.rs index 4081c3a..b4a23d3 100644 --- a/deckui/src/main.rs +++ b/deckui/src/main.rs @@ -1,4 +1,4 @@ -use std::{net::IpAddr, str::FromStr, thread, time::Duration, process::exit}; +use std::{net::IpAddr, process::exit, str::FromStr, thread, time::Duration}; use lib::{tcp::start_client, ServerMessage}; use log::info; @@ -6,25 +6,24 @@ use log::info; slint::include_modules!(); fn main() -> Result<(), slint::PlatformError> { - - env_logger::init_from_env( + env_logger::init_from_env( env_logger::Env::default().filter_or(env_logger::DEFAULT_FILTER_ENV, "info"), ); - + let mut retries = 1; - let (sender_co, receiver_s) = loop{ + let (sender_co, receiver_s) = loop { let res = start_client(IpAddr::from_str("192.168.0.101").unwrap()); - if let Ok((s,r)) = res{ - break (s,r) + if let Ok((s, r)) = res { + break (s, r); } - println!("Failde to connect retrying in {} ms", 200*retries); - thread::sleep(Duration::from_millis(200*retries)); - retries*=5; + println!("Failde to connect retrying in {} ms", 200 * retries); + thread::sleep(Duration::from_millis(200 * retries)); + retries *= 5; if retries >= 500 { println!("Could not connect to server exiting..."); exit(1); } - }; + }; info!("Connected to Server"); @@ -47,22 +46,25 @@ fn main() -> Result<(), slint::PlatformError> { }); let ui_handle = ui.as_weak(); - thread::spawn(move || { - loop { - if receiver_s.is_empty(){ - thread::sleep(Duration::from_millis(200)); - continue; - } - let msg = receiver_s.recv().unwrap(); - info!("Received : {msg:?}"); - match msg { - ServerMessage::NowPlaying(title) => ui_handle.upgrade_in_event_loop(move |handle| handle.set_now_playing(title.into())).unwrap(), - - }; - + thread::spawn(move || loop { + if receiver_s.is_empty() { + thread::sleep(Duration::from_millis(200)); + continue; } + let msg = receiver_s.recv().unwrap(); + info!("Received : {msg:?}"); + match msg { + ServerMessage::NowPlaying(title) => ui_handle + .upgrade_in_event_loop(move |handle| handle.set_now_playing(title.into())) + .unwrap(), + ServerMessage::Playing(bool) => ui_handle + .upgrade_in_event_loop(move |handle| { + handle.global::().set_playing(bool) + }) + .unwrap(), + }; }); - + info!("Launching UI"); ui.run() } diff --git a/deckui/ui/widgets/mediacontrols.slint b/deckui/ui/widgets/mediacontrols.slint index cc5ac85..82dc251 100644 --- a/deckui/ui/widgets/mediacontrols.slint +++ b/deckui/ui/widgets/mediacontrols.slint @@ -5,6 +5,7 @@ export global MediaLogic { pure callback play-pause(); pure callback next(); pure callback previous(); + in-out property playing; } export component MediaControls inherits Clickable { @@ -20,9 +21,9 @@ export component MediaControls inherits Clickable { } Clickable { - icon: playing ? @image-url("../../icons/pause.png"): @image-url("../../icons/play.png"); + icon: MediaLogic.playing ? @image-url("../../icons/pause.png"): @image-url("../../icons/play.png"); action => { - root.playing = !root.playing; + MediaLogic.playing = !MediaLogic.playing; MediaLogic.play-pause(); } } @@ -32,11 +33,6 @@ export component MediaControls inherits Clickable { MediaLogic.next(); } } - - - - } - } diff --git a/lib/src/lib.rs b/lib/src/lib.rs index 3ec8c31..6b9d69a 100644 --- a/lib/src/lib.rs +++ b/lib/src/lib.rs @@ -3,7 +3,6 @@ use std::fmt::{Debug, Display}; use serde::{Deserialize, Serialize}; - #[derive(Serialize, Deserialize, Debug)] pub enum ClientMessage { Next, @@ -14,6 +13,7 @@ pub enum ClientMessage { #[derive(Serialize, Deserialize, Debug)] pub enum ServerMessage { NowPlaying(String), + Playing(bool), } pub enum Origin { diff --git a/lib/src/tcp/mod.rs b/lib/src/tcp/mod.rs index 490ce2c..ad8bd15 100644 --- a/lib/src/tcp/mod.rs +++ b/lib/src/tcp/mod.rs @@ -80,8 +80,6 @@ where Ok(()) } - - pub fn start_server() -> Result<(Sender, Receiver)> { let (sender_c, reciever_c) = channel::bounded(4); let (sender_s, reciever_s) = channel::bounded(4); @@ -127,4 +125,3 @@ pub fn start_client(ip: IpAddr) -> Result<(Sender, Receiver