From 0971f6f20fe7c59da1be69ef34e07b7944e8ca7e Mon Sep 17 00:00:00 2001 From: Jason Rodney Hansen Date: Sat, 29 Jun 2024 19:35:27 -0600 Subject: [PATCH] Open files with middle click * Directories open in new tab * All others open the file --- src/app.rs | 3 +++ src/dialog.rs | 3 +++ src/tab.rs | 35 ++++++++++++++++++++++++++++++++++- 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/app.rs b/src/app.rs index 9e57c20..094982c 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1737,6 +1737,9 @@ impl Application for App { } } } + tab::Command::OpenInNewTab(path) => { + commands.push(self.open_tab(Location::Path(path.clone()))); + } tab::Command::Scroll(id, offset) => { commands.push(scrollable::scroll_to(id, offset)); } diff --git a/src/dialog.rs b/src/dialog.rs index 547a4f9..a1a2348 100644 --- a/src/dialog.rs +++ b/src/dialog.rs @@ -638,6 +638,9 @@ impl Application for App { commands.push(self.update(Message::Open)); } } + tab::Command::OpenInNewTab(_path) => { + log::warn!("OpenInNewTab not supported in dialog"); + } tab::Command::Scroll(id, offset) => { commands.push(scrollable::scroll_to(id, offset)); } diff --git a/src/tab.rs b/src/tab.rs index a254aaf..7da78d3 100644 --- a/src/tab.rs +++ b/src/tab.rs @@ -537,6 +537,7 @@ pub enum Command { FocusButton(widget::Id), FocusTextInput(widget::Id), OpenFile(PathBuf), + OpenInNewTab(PathBuf), Scroll(widget::Id, AbsoluteOffset), DropFiles(PathBuf, ClipboardPaste), Timeout(Duration, Message), @@ -565,6 +566,7 @@ pub enum Message { LocationUp, Open, RightClick(usize), + MiddleClick(usize), Scroll(Viewport), SelectAll, Thumbnail(PathBuf, ItemThumbnail), @@ -1473,6 +1475,35 @@ impl Tab { } } } + Message::MiddleClick(click_i) => { + if mod_ctrl || mod_shift { + self.update(Message::Click(Some(click_i)), modifiers); + } else { + *self.cached_selected.borrow_mut() = None; + if let Some(ref mut items) = self.items_opt { + for (i, item) in items.iter_mut().enumerate() { + item.selected = i == click_i; + } + self.select_range = None; + } + if let Some(clicked_item) = + self.items_opt.as_ref().and_then(|items| items.get(click_i)) + { + if let Some(path) = &clicked_item.path_opt { + if clicked_item.metadata.is_dir() { + //cd = Some(Location::Path(path.clone())); + commands.push(Command::OpenInNewTab(path.clone())) + } else { + commands.push(Command::OpenFile(path.clone())); + } + } else { + log::warn!("no path for item {:?}", clicked_item); + } + } else { + log::warn!("no item for click index {:?}", click_i); + } + } + } Message::Scroll(viewport) => { self.scroll_opt = Some(viewport.absolute_offset()); } @@ -2070,7 +2101,8 @@ impl Tab { let mouse_area = crate::mouse_area::MouseArea::new(column) .on_press(move |_| Message::Click(Some(i))) .on_double_click(move |_| Message::DoubleClick(Some(i))) - .on_release(move |_| Message::ClickRelease(Some(i))); + .on_release(move |_| Message::ClickRelease(Some(i))) + .on_middle_press(move |_| Message::MiddleClick(i)); grid = grid.push(mouse_area); count += 1; @@ -2351,6 +2383,7 @@ impl Tab { .on_press(move |_| Message::Click(Some(i))) .on_double_click(move |_| Message::DoubleClick(Some(i))) .on_release(move |_| Message::ClickRelease(Some(i))) + .on_middle_press(move |_| Message::MiddleClick(i)) }; let mut button_row = button(row.into());