mirror of
https://github.com/arabianq/pipewire-soundpad.git
synced 2026-04-28 06:21:23 +00:00
refactor: simplify file and directory navigation logic (#37)
Refactored the navigation logic in `src/gui/input.rs` to use idiomatic Rust patterns. Replaced clunky manual index calculations and type casting with `match` expressions and modular arithmetic on `usize`. This improvement enhances readability and maintainability by eliminating nested `if/else` blocks and potential overflow issues from integer casts. 🎯 **What:** The code health issue addressed - Refactored directory and file navigation logic to use `usize` and modular arithmetic. - Replaced manual wrap-around logic with idiomatic `match` expressions. 💡 **Why:** How this improves maintainability - Eliminates unnecessary and potentially risky type casting (e.g., `i8`, `i64`). - Reduces code nesting and complexity, making it easier to read and extend. - Standardizes the circular navigation pattern across the GUI. ✅ **Verification:** How you confirmed the change is safe - Manually reviewed and verified the logic for all key combinations (ArrowUp, ArrowDown, both, or none). - Confirmed correct behavior for both initial selection (None) and existing selection (Some) states. ✨ **Result:** The improvement achieved - Cleaner, more idiomatic Rust code for list navigation. - Reduced potential for index-related bugs. Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
This commit is contained in:
committed by
GitHub
parent
3add499bd7
commit
02306b5893
+24
-33
@@ -80,29 +80,22 @@ impl SoundpadGui {
|
|||||||
let mut dirs: Vec<PathBuf> = self.app_state.dirs.iter().cloned().collect();
|
let mut dirs: Vec<PathBuf> = self.app_state.dirs.iter().cloned().collect();
|
||||||
dirs.sort();
|
dirs.sort();
|
||||||
|
|
||||||
let current_dir_index: i8;
|
let current_dir_index = self
|
||||||
if let Some(current_dir) = &self.app_state.current_dir {
|
.app_state
|
||||||
if let Some(index) = dirs.iter().position(|x| x == current_dir) {
|
.current_dir
|
||||||
current_dir_index = index as i8;
|
.as_ref()
|
||||||
} else {
|
.and_then(|cd| dirs.iter().position(|x| x == cd));
|
||||||
current_dir_index = -1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
current_dir_index = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut new_dir_index: i8;
|
let new_dir_index = match (current_dir_index, arrow_up_pressed, arrow_down_pressed) {
|
||||||
|
(Some(i), true, false) => (i + dirs.len() - 1) % dirs.len(),
|
||||||
|
(Some(i), false, true) => (i + 1) % dirs.len(),
|
||||||
|
(Some(i), true, true) => i,
|
||||||
|
(None, true, _) => dirs.len() - 1,
|
||||||
|
(None, false, true) => 0,
|
||||||
|
_ => return,
|
||||||
|
};
|
||||||
|
|
||||||
new_dir_index =
|
self.open_dir(&dirs[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;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.open_dir(&dirs[new_dir_index as usize]);
|
|
||||||
} else if self.app_state.current_dir.is_some() {
|
} else if self.app_state.current_dir.is_some() {
|
||||||
let files = self.get_filtered_files();
|
let files = self.get_filtered_files();
|
||||||
|
|
||||||
@@ -114,20 +107,18 @@ impl SoundpadGui {
|
|||||||
.app_state
|
.app_state
|
||||||
.selected_file
|
.selected_file
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.and_then(|f| files.iter().position(|x| x == f))
|
.and_then(|f| files.iter().position(|x| x == f));
|
||||||
.map(|i| i as i64)
|
|
||||||
.unwrap_or(-1);
|
|
||||||
|
|
||||||
let mut new_files_index =
|
let new_files_index = match (current_files_index, arrow_up_pressed, arrow_down_pressed) {
|
||||||
current_files_index - arrow_up_pressed as i64 + arrow_down_pressed as i64;
|
(Some(i), true, false) => (i + files.len() - 1) % files.len(),
|
||||||
|
(Some(i), false, true) => (i + 1) % files.len(),
|
||||||
|
(Some(i), true, true) => i,
|
||||||
|
(None, true, _) => files.len() - 1,
|
||||||
|
(None, false, true) => 0,
|
||||||
|
_ => return,
|
||||||
|
};
|
||||||
|
|
||||||
if new_files_index < 0 {
|
self.app_state.selected_file = Some(files[new_files_index].clone());
|
||||||
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());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user