aboutsummaryrefslogtreecommitdiffstats
path: root/default-plugins
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2025-02-20 10:03:34 +0100
committerGitHub <noreply@github.com>2025-02-20 10:03:34 +0100
commitd1a45093455ecc1291a226fb9cbb1eacb35ac01a (patch)
treee88ef9a7b5d20be6e995eb45029ff177666931d9 /default-plugins
parentdocs(changelog): resize shortcuts (diff)
downloadsl0ppij-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.rs10
-rw-r--r--default-plugins/strider/src/main.rs26
-rw-r--r--default-plugins/strider/src/state.rs79
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(