From 531a49dbdf73022cbea3d144c7a565805b484106 Mon Sep 17 00:00:00 2001 From: arabian Date: Fri, 2 Jan 2026 03:18:51 +0300 Subject: [PATCH] feat: implemented loop support in pwsp-gui --- src/gui/draw.rs | 18 +++++++++++++++++- src/gui/mod.rs | 7 +++++++ src/types/gui.rs | 1 + src/utils/gui.rs | 7 +++++++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/gui/draw.rs b/src/gui/draw.rs index 57285f4..52e7346 100644 --- a/src/gui/draw.rs +++ b/src/gui/draw.rs @@ -108,6 +108,22 @@ impl SoundpadGui { } // -------------------------------- + // ---------- Loop Button ---------- + let loop_button = Button::new( + RichText::new(match self.audio_player_state.looped { + true => icons::ICON_REPEAT_ONE, + false => icons::ICON_REPEAT, + }) + .size(18.0), + ) + .frame(false); + + let loop_button_response = ui.add_sized([15.0, 30.0], loop_button); + if loop_button_response.clicked() { + self.toggle_loop(); + } + // -------------------------------- + // ---------- Position Slider ---------- let position_slider = Slider::new( &mut self.app_state.position_slider_value, @@ -150,7 +166,7 @@ impl SoundpadGui { icons::ICON_VOLUME_DOWN }; let volume_icon = Label::new(RichText::new(volume_icon).size(18.0)); - ui.add_sized([30.0, 25.0], volume_icon); + ui.add_sized([30.0, 30.0], volume_icon); // -------------------------------- // ---------- Volume Slider ---------- diff --git a/src/gui/mod.rs b/src/gui/mod.rs index 60f93ca..eec643f 100644 --- a/src/gui/mod.rs +++ b/src/gui/mod.rs @@ -125,6 +125,13 @@ impl SoundpadGui { daemon_config.save_to_file().ok(); } } + + pub fn toggle_loop(&mut self) { + make_request_sync(Request::set_loop( + &(!self.audio_player_state.looped).to_string(), + )) + .ok(); + } } pub async fn run() -> Result<(), Box> { diff --git a/src/types/gui.rs b/src/types/gui.rs index cbb1a8a..0fbe641 100644 --- a/src/types/gui.rs +++ b/src/types/gui.rs @@ -36,6 +36,7 @@ pub struct AudioPlayerState { pub current_file_path: PathBuf, pub is_paused: bool, + pub looped: bool, pub volume: f32, pub new_volume: Option, diff --git a/src/utils/gui.rs b/src/utils/gui.rs index 060abd4..73f0563 100644 --- a/src/utils/gui.rs +++ b/src/utils/gui.rs @@ -53,6 +53,7 @@ pub fn start_app_state_thread(audio_player_state_shared: Arc serde_json::from_str::(&state_res.message).unwrap(), @@ -116,6 +118,10 @@ pub fn start_app_state_thread(audio_player_state_shared: Arc>(), false => HashMap::new(), }; + let looped = match looped_res.status { + true => looped_res.message.parse::().unwrap_or_default(), + false => false, + }; { let mut guard = audio_player_state_shared.lock().unwrap(); @@ -146,6 +152,7 @@ pub fn start_app_state_thread(audio_player_state_shared: Arc 0.0 { duration } else { 1.0 }; guard.current_input = current_input; guard.all_inputs = all_inputs; + guard.looped = looped; } sleep(sleep_duration).await;