diff options
| author | Aram Drevekenin <aram@poor.dev> | 2025-02-20 10:03:34 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-02-20 10:03:34 +0100 |
| commit | d1a45093455ecc1291a226fb9cbb1eacb35ac01a (patch) | |
| tree | e88ef9a7b5d20be6e995eb45029ff177666931d9 /default-plugins | |
| parent | docs(changelog): resize shortcuts (diff) | |
| download | sl0ppij-d1a45093455ecc1291a226fb9cbb1eacb35ac01a.tar.gz sl0ppij-d1a45093455ecc1291a226fb9cbb1eacb35ac01a.tar.xz sl0ppij-d1a45093455ecc1291a226fb9cbb1eacb35ac01a.zip | |
fix(ux): some filepicker improvements (#4007)
* allow closing plugin pane after replacing it
* start of strider improvements
* improve strider's ux
* fix selected text ui component
* style(fmt): rustfmt
* style(fmt): rustfmt
Diffstat (limited to 'default-plugins')
| -rw-r--r-- | default-plugins/strider/src/file_list_view.rs | 10 | ||||
| -rw-r--r-- | default-plugins/strider/src/main.rs | 26 | ||||
| -rw-r--r-- | default-plugins/strider/src/state.rs | 79 |
3 files changed, 86 insertions, 29 deletions
diff --git a/default-plugins/strider/src/file_list_view.rs b/default-plugins/strider/src/file_list_view.rs index 9a2a388e..ccbbe292 100644 --- a/default-plugins/strider/src/file_list_view.rs +++ b/default-plugins/strider/src/file_list_view.rs @@ -30,14 +30,14 @@ impl FileListView { self.path.pop(); self.path_is_dir = true; self.files.clear(); - self.reset_selected(); + self.clear_selected(); refresh_directory(&self.path); } pub fn descend_to_root_path(&mut self) { self.path.clear(); self.path_is_dir = true; self.files.clear(); - self.reset_selected(); + self.clear_selected(); refresh_directory(&self.path); } pub fn enter_dir(&mut self, entry: &FsEntry) { @@ -46,10 +46,10 @@ impl FileListView { self.path = path; self.path_is_dir = is_dir; self.files.clear(); - self.reset_selected(); + self.clear_selected(); } - pub fn reset_selected(&mut self) { - *self.selected_mut() = self.selected().unwrap_or(0); + pub fn clear_selected(&mut self) { + self.cursor_hist.remove(&self.path); } pub fn update_files( &mut self, diff --git a/default-plugins/strider/src/main.rs b/default-plugins/strider/src/main.rs index b1c2308b..cd9dda4d 100644 --- a/default-plugins/strider/src/main.rs +++ b/default-plugins/strider/src/main.rs @@ -32,7 +32,7 @@ impl ZellijPlugin for State { EventType::Timer, EventType::FileSystemUpdate, ]); - self.file_list_view.reset_selected(); + self.file_list_view.clear_selected(); // the caller_cwd might be different from the initial_cwd if this plugin was defined as an // alias, with access to a certain part of the file system (often broader) and was called // from an individual pane somewhere inside this broad scope - in this case, we want to @@ -73,7 +73,11 @@ impl ZellijPlugin for State { should_render = true; }, BareKey::Esc if key.has_no_modifiers() => { - self.clear_search_term_or_descend(); + if self.is_searching { + self.clear_search_term(); + } else { + self.file_list_view.clear_selected(); + } should_render = true; }, BareKey::Char('c') if key.has_modifiers(&[KeyModifier::Ctrl]) => { @@ -87,15 +91,11 @@ impl ZellijPlugin for State { self.move_selection_down(); should_render = true; }, - BareKey::Enter - if key.has_no_modifiers() && self.handling_filepick_request_from.is_some() => - { - self.send_filepick_response(); - }, - BareKey::Enter if key.has_no_modifiers() => { - self.open_selected_path(); + BareKey::Right | BareKey::Tab | BareKey::Enter if key.has_no_modifiers() => { + self.traverse_dir(); + should_render = true; }, - BareKey::Right | BareKey::Tab if key.has_no_modifiers() => { + BareKey::Right if key.has_no_modifiers() => { self.traverse_dir(); should_render = true; }, @@ -123,6 +123,12 @@ impl ZellijPlugin for State { self.handle_left_click(line); should_render = true; }, + Mouse::Hover(line, _) => { + if line >= 0 { + self.handle_mouse_hover(line); + should_render = true; + } + }, _ => {}, }, _ => { diff --git a/default-plugins/strider/src/state.rs b/default-plugins/strider/src/state.rs index 87f70d4b..0bf5b268 100644 --- a/default-plugins/strider/src/state.rs +++ b/default-plugins/strider/src/state.rs @@ -14,9 +14,6 @@ pub struct State { pub file_list_view: FileListView, pub search_view: SearchView, pub hide_hidden_files: bool, - pub loading: bool, - pub loading_animation_offset: u8, - pub should_open_floating: bool, pub current_rows: Option<usize>, pub handling_filepick_request_from: Option<(PipeSource, BTreeMap<String, String>)>, pub initial_cwd: PathBuf, // TODO: get this from zellij @@ -50,6 +47,12 @@ impl State { .update_search_results(&self.search_term, &self.file_list_view.files); } } + pub fn clear_search_term(&mut self) { + self.search_term.clear(); + self.search_view + .update_search_results(&self.search_term, &self.file_list_view.files); + self.is_searching = false; + } pub fn clear_search_term_or_descend(&mut self) { if self.search_term.is_empty() { self.descend_to_previous_path(); @@ -85,7 +88,7 @@ impl State { ); let prev_selected = self.search_view.selected_search_result; self.search_view.selected_search_result = - (line as usize).saturating_sub(2) + start_index; + (line as usize).saturating_sub(4) + start_index; if prev_selected == self.search_view.selected_search_result { self.traverse_dir(); } @@ -97,13 +100,35 @@ impl State { ); let prev_selected = self.file_list_view.selected(); *self.file_list_view.selected_mut() = - (line as usize).saturating_sub(2) + start_index; + (line as usize).saturating_sub(4) + start_index; if prev_selected == self.file_list_view.selected() { self.traverse_dir(); } } } } + pub fn handle_mouse_hover(&mut self, line: isize) { + if let Some(current_rows) = self.current_rows { + let rows_for_list = current_rows.saturating_sub(5); + if self.is_searching { + let (start_index, _selected_index_in_range, _end_index) = calculate_list_bounds( + self.search_view.search_result_count(), + rows_for_list, + Some(self.search_view.selected_search_result), + ); + self.search_view.selected_search_result = + (line as usize).saturating_sub(4) + start_index; + } else { + let (start_index, _selected_index_in_range, _end_index) = calculate_list_bounds( + self.file_list_view.files.len(), + rows_for_list, + self.file_list_view.selected(), + ); + *self.file_list_view.selected_mut() = + (line as usize).saturating_sub(4) + start_index; + } + } + } pub fn descend_to_previous_path(&mut self) { self.search_term.clear(); self.search_view.clear_and_reset_selection(); @@ -134,8 +159,17 @@ impl State { FsEntry::File(_p, _) => { self.file_list_view.enter_dir(&entry); self.search_view.clear_and_reset_selection(); + if self.handling_filepick_request_from.is_some() { + self.send_filepick_response(); + } else { + self.open_selected_path(); + } }, } + } else if self.handling_filepick_request_from.is_some() { + self.send_filepick_response(); + } else { + self.open_selected_path(); } self.is_searching = false; self.search_term.clear(); @@ -147,20 +181,37 @@ impl State { } pub fn open_selected_path(&mut self) { if self.file_list_view.path_is_dir { - open_terminal(&self.file_list_view.path); + if self.close_on_selection { + open_terminal_in_place_of_plugin(&self.file_list_view.path, true); + } else { + open_terminal(&self.file_list_view.path); + } } else { if let Some(parent_folder) = self.file_list_view.path.parent() { - open_file( - FileToOpen::new(&self.file_list_view.path).with_cwd(parent_folder.into()), - BTreeMap::new(), - ); + if self.close_on_selection { + open_file_in_place_of_plugin( + FileToOpen::new(&self.file_list_view.path).with_cwd(parent_folder.into()), + true, + BTreeMap::new(), + ); + } else { + open_file( + FileToOpen::new(&self.file_list_view.path).with_cwd(parent_folder.into()), + BTreeMap::new(), + ); + } } else { - open_file(FileToOpen::new(&self.file_list_view.path), BTreeMap::new()); + if self.close_on_selection { + open_file_in_place_of_plugin( + FileToOpen::new(&self.file_list_view.path), + true, + BTreeMap::new(), + ); + } else { + open_file(FileToOpen::new(&self.file_list_view.path), BTreeMap::new()); + } } } - if self.close_on_selection { - close_self(); - } } pub fn send_filepick_response(&mut self) { let selected_path = self.initial_cwd.join( |
