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:
Tarasov Aleksandr
2026-03-08 02:40:39 +03:00
committed by GitHub
parent 3add499bd7
commit 02306b5893
+24 -33
View File
@@ -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());
} }
} }
} }