From 03df631690a9940396810141f7cc44a948bbca6d Mon Sep 17 00:00:00 2001 From: arabian Date: Wed, 28 Jan 2026 00:28:08 +0300 Subject: [PATCH] refactor: enhance search field focus functionality and input handling --- src/gui/draw.rs | 9 ++- src/gui/input.rs | 182 +++++++++++++++++++++++----------------------- src/gui/update.rs | 7 -- src/types/gui.rs | 6 +- 4 files changed, 103 insertions(+), 101 deletions(-) diff --git a/src/gui/draw.rs b/src/gui/draw.rs index 381e238..00fafe3 100644 --- a/src/gui/draw.rs +++ b/src/gui/draw.rs @@ -356,12 +356,17 @@ impl SoundpadGui { fn draw_files(&mut self, ui: &mut Ui, area_size: Vec2) { ui.vertical(|ui| { ui.horizontal(|ui| { - let search_field = ui.add_sized( + let search_field_response = ui.add_sized( [ui.available_width(), 22.0], TextEdit::singleline(&mut self.app_state.search_query).hint_text("Search..."), ); - self.app_state.search_field_id = Some(search_field.id); + if self.app_state.force_focus_search { + search_field_response.request_focus(); + self.app_state.force_focus_search = false; + } + + self.app_state.search_field_id = Some(search_field_response.id); }); ui.separator(); diff --git a/src/gui/input.rs b/src/gui/input.rs index dc27399..947187d 100644 --- a/src/gui/input.rs +++ b/src/gui/input.rs @@ -1,122 +1,126 @@ use crate::gui::SoundpadGui; -use egui::{Context, Key}; +use egui::{Context, Id, Key, Modifiers}; use std::path::PathBuf; impl SoundpadGui { + fn key_pressed(&self, ctx: &Context, key: Key) -> bool { + ctx.input(|i| i.key_pressed(key)) + } + + fn modifiers(&self, ctx: &Context) -> Modifiers { + ctx.input(|i| i.modifiers) + } + pub fn handle_input(&mut self, ctx: &Context) { - if ctx.memory(|reader| { reader.focused() }.is_some()) { - return; + let modifiers = self.modifiers(ctx); + + // Close app on espace + if self.key_pressed(ctx, Key::Escape) { + std::process::exit(0); } - ctx.input(|i| { - // Close app on espace - if i.key_pressed(Key::Escape) { - std::process::exit(0); + // Open/close settings + if self.key_pressed(ctx, Key::I) { + self.app_state.show_settings = !self.app_state.show_settings; + } + + if self.key_pressed(ctx, Key::Enter) && self.app_state.selected_file.is_some() { + let path = &self.app_state.selected_file.clone().unwrap(); + if modifiers.ctrl { + self.play_file(path, true); + } else if modifiers.shift + && let Some(last_track) = self.audio_player_state.tracks.last() + { + self.stop(Some(last_track.id)); + self.play_file(path, true); + } else { + self.play_file(path, false); + } + } + + if !self.app_state.show_settings { + // Pause / resume audio on space + if self.key_pressed(ctx, Key::Space) { + self.play_toggle(); } - // Open/close settings - if i.key_pressed(Key::I) { - self.app_state.show_settings = !self.app_state.show_settings; + // Stop all audio tracks on backspace + if self.key_pressed(ctx, Key::Backspace) { + self.stop(None); } - if i.key_pressed(Key::Enter) && self.app_state.selected_file.is_some() { - let path = &self.app_state.selected_file.clone().unwrap(); - if i.modifiers.ctrl { - self.play_file(path, true); - } else if i.modifiers.shift - && let Some(last_track) = self.audio_player_state.tracks.last() - { - self.stop(Some(last_track.id)); - self.play_file(path, true); - } else { - self.play_file(path, false); - } + // Focus search field + if self.key_pressed(ctx, Key::Slash) { + self.app_state.force_focus_search = true; } - if !self.app_state.show_settings { - // Pause / resume audio on space - if i.key_pressed(Key::Space) { - self.play_toggle(); - } + // Iterate through dirs if there are some + if modifiers.ctrl { + let arrow_up_pressed = self.key_pressed(ctx, Key::ArrowUp); + let arrow_down_pressed = self.key_pressed(ctx, Key::ArrowDown); - // Stop all audio tracks on backspace - if i.key_pressed(Key::Backspace) { - self.stop(None); - } + if arrow_up_pressed || arrow_down_pressed { + if modifiers.shift && !self.app_state.dirs.is_empty() { + let mut dirs: Vec = self.app_state.dirs.iter().cloned().collect(); + dirs.sort(); - // Focus search field - if i.key_pressed(Key::Slash) && self.app_state.search_field_id.is_some() { - self.app_state.force_focus_id = self.app_state.search_field_id; - } - - // Iterate through dirs if there are some - if i.modifiers.ctrl { - let arrow_up_pressed = i.key_pressed(Key::ArrowUp); - let arrow_down_pressed = i.key_pressed(Key::ArrowDown); - - if arrow_up_pressed || arrow_down_pressed { - if i.modifiers.shift && !self.app_state.dirs.is_empty() { - let mut dirs: Vec = - self.app_state.dirs.iter().cloned().collect(); - dirs.sort(); - - let current_dir_index: i8; - if let Some(current_dir) = &self.app_state.current_dir { - if let Some(index) = dirs.iter().position(|x| x == current_dir) { - current_dir_index = index as i8; - } else { - current_dir_index = -1; - } + let current_dir_index: i8; + if let Some(current_dir) = &self.app_state.current_dir { + if let Some(index) = dirs.iter().position(|x| x == current_dir) { + current_dir_index = index as i8; } else { current_dir_index = -1; } + } else { + current_dir_index = -1; + } - let mut new_dir_index: i8; + let mut new_dir_index: i8; - new_dir_index = current_dir_index - arrow_up_pressed as i8 - + arrow_down_pressed as i8; + new_dir_index = + current_dir_index - arrow_up_pressed as i8 + arrow_down_pressed as i8; - if new_dir_index < 0 { - new_dir_index = (dirs.len() - 1) as i8; - } else if new_dir_index >= dirs.len() as i8 { - new_dir_index = 0; - } + if new_dir_index < 0 { + new_dir_index = (dirs.len() - 1) as i8; + } else if new_dir_index >= dirs.len() as i8 { + new_dir_index = 0; + } - self.open_dir(&dirs[new_dir_index as usize]); - } else if self.app_state.current_dir.is_some() { - let mut files: Vec = - self.app_state.files.iter().cloned().collect(); - files.sort(); + self.open_dir(&dirs[new_dir_index as usize]); + } else if self.app_state.current_dir.is_some() { + let mut files: Vec = + self.app_state.files.iter().cloned().collect(); + files.sort(); - let current_files_index: i64; - if let Some(selected_file) = &self.app_state.selected_file { - if let Some(index) = files.iter().position(|x| x == selected_file) { - current_files_index = index as i64; - } else { - current_files_index = -1; - } + let current_files_index: i64; + if let Some(selected_file) = &self.app_state.selected_file { + if let Some(index) = files.iter().position(|x| x == selected_file) { + current_files_index = index as i64; } else { current_files_index = -1; } - - let mut new_files_index: i64; - - new_files_index = current_files_index - arrow_up_pressed as i64 - + arrow_down_pressed as i64; - - if new_files_index < 0 { - new_files_index = (files.len() - 1) as i64; - } else if new_files_index >= files.len() as i64 { - new_files_index = 0; - } - - self.app_state.selected_file = - Some(files[new_files_index as usize].clone()); + } else { + current_files_index = -1; } + + let mut new_files_index: i64; + + new_files_index = current_files_index - arrow_up_pressed as i64 + + arrow_down_pressed as i64; + + if new_files_index < 0 { + new_files_index = (files.len() - 1) as i64; + } else if new_files_index >= files.len() as i64 { + new_files_index = 0; + } + + self.app_state.selected_file = + Some(files[new_files_index as usize].clone()); } } } - }); + } + // }); } } diff --git a/src/gui/update.rs b/src/gui/update.rs index faa161f..91bb61e 100644 --- a/src/gui/update.rs +++ b/src/gui/update.rs @@ -86,13 +86,6 @@ impl App for SoundpadGui { } self.draw(ui).ok(); - - if let Some(force_focus_id) = self.app_state.force_focus_id { - ui.memory_mut(|reder| { - reder.request_focus(force_focus_id); - }); - self.app_state.force_focus_id = None; - } }); ctx.request_repaint_after_secs(1.0 / 60.0); diff --git a/src/types/gui.rs b/src/types/gui.rs index 728f502..9425353 100644 --- a/src/types/gui.rs +++ b/src/types/gui.rs @@ -28,9 +28,12 @@ pub struct AppState { pub show_settings: bool, pub volume_dragged: bool, + pub force_focus_search: bool, pub volume_slider_value: f32, + pub search_field_id: Option, + pub ignore_volume_update_until: Option, pub current_dir: Option, @@ -38,9 +41,6 @@ pub struct AppState { pub selected_file: Option, pub files: HashSet, - - pub search_field_id: Option, - pub force_focus_id: Option, } #[derive(Default, Debug, Clone)]