mirror of
https://github.com/arabianq/pipewire-soundpad.git
synced 2026-04-28 06:21:23 +00:00
117 lines
3.9 KiB
Rust
117 lines
3.9 KiB
Rust
use crate::gui::SoundpadGui;
|
|
use eframe::{App, Frame as EFrame};
|
|
use egui::{CentralPanel, Context};
|
|
use pwsp::{
|
|
types::socket::Request,
|
|
utils::{daemon::get_daemon_config, gui::make_request_async},
|
|
};
|
|
use std::time::{Duration, Instant};
|
|
|
|
impl App for SoundpadGui {
|
|
fn update(&mut self, ctx: &Context, _frame: &mut EFrame) {
|
|
// Remove directories
|
|
for path in self.app_state.dirs_to_remove.drain() {
|
|
self.app_state.dirs.retain(|x| x != &path);
|
|
if let Some(current_dir) = &self.app_state.current_dir
|
|
&& current_dir == &path
|
|
{
|
|
self.app_state.current_dir = None;
|
|
self.app_state.files.clear();
|
|
}
|
|
}
|
|
|
|
// Save directories if changed
|
|
if !self.config.dirs.eq(&self.app_state.dirs) {
|
|
self.config.dirs = self.app_state.dirs.clone();
|
|
self.config.save_to_file().ok();
|
|
}
|
|
|
|
// Seek and volume requests
|
|
let mut seek_requests = vec![];
|
|
let mut volume_requests = vec![];
|
|
|
|
for (id, ui_state) in &mut self.app_state.track_ui_states {
|
|
if ui_state.position_dragged {
|
|
seek_requests.push((*id, ui_state.position_slider_value));
|
|
}
|
|
if ui_state.volume_dragged {
|
|
volume_requests.push((*id, ui_state.volume_slider_value));
|
|
ui_state.volume_dragged = false;
|
|
}
|
|
}
|
|
|
|
for (id, pos) in seek_requests {
|
|
make_request_async(Request::seek(pos, Some(id)));
|
|
if let Some(ui_state) = self.app_state.track_ui_states.get_mut(&id) {
|
|
ui_state.position_dragged = false;
|
|
ui_state.ignore_position_update_until =
|
|
Some(Instant::now() + Duration::from_millis(300));
|
|
}
|
|
}
|
|
|
|
for (id, vol) in volume_requests {
|
|
make_request_async(Request::set_volume(vol, Some(id)));
|
|
if let Some(ui_state) = self.app_state.track_ui_states.get_mut(&id) {
|
|
ui_state.volume_dragged = false;
|
|
ui_state.ignore_volume_update_until =
|
|
Some(Instant::now() + Duration::from_millis(300));
|
|
}
|
|
}
|
|
|
|
if self.app_state.volume_dragged {
|
|
make_request_async(Request::set_volume(
|
|
self.app_state.volume_slider_value,
|
|
None,
|
|
));
|
|
|
|
self.app_state.volume_dragged = false;
|
|
self.app_state.ignore_volume_update_until =
|
|
Some(Instant::now() + Duration::from_millis(300));
|
|
|
|
if self.config.save_volume {
|
|
let mut daemon_config = get_daemon_config();
|
|
daemon_config.default_volume = Some(self.app_state.volume_slider_value);
|
|
daemon_config.save_to_file().ok();
|
|
}
|
|
}
|
|
|
|
// Sync audio player state
|
|
{
|
|
let guard = self.audio_player_state_shared.lock().unwrap();
|
|
self.audio_player_state = guard.clone();
|
|
}
|
|
|
|
// Handle scale factor changes
|
|
let old_scale_factor = self.config.scale_factor;
|
|
let new_scale_factor = ctx.zoom_factor().clamp(0.5, 2.0);
|
|
|
|
ctx.set_zoom_factor(new_scale_factor);
|
|
self.config.scale_factor = new_scale_factor;
|
|
|
|
if new_scale_factor != old_scale_factor && self.config.save_scale_factor {
|
|
self.config.save_to_file().ok();
|
|
}
|
|
|
|
// Handle input
|
|
self.handle_input(ctx);
|
|
|
|
// Draw UI
|
|
CentralPanel::default().show(ctx, |ui| {
|
|
if !self.audio_player_state.is_daemon_running {
|
|
self.draw_waiting_for_daemon(ui);
|
|
return;
|
|
}
|
|
|
|
if self.app_state.show_settings {
|
|
self.draw_settings(ui);
|
|
return;
|
|
}
|
|
|
|
self.draw(ui).ok();
|
|
});
|
|
|
|
// Request repaint
|
|
ctx.request_repaint_after_secs(1.0 / 60.0);
|
|
}
|
|
}
|