From 77f33c0acc8ae4b6b205094e1064c381f3f27033 Mon Sep 17 00:00:00 2001 From: Jonatan Pettersson Date: Sun, 4 Jan 2026 21:34:10 +0100 Subject: [PATCH 1/3] feat: Add open button to multi preview --- src/tab.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/tab.rs b/src/tab.rs index b428b5e..e34c584 100644 --- a/src/tab.rs +++ b/src/tab.rs @@ -6003,6 +6003,8 @@ impl Tab { column = column.push(details); + column = column.push(widget::button::standard(fl!("open")).on_press(Message::Open(None))); + column.into() } pub fn view<'a>( From 03c5124859d41e656527d58cf9fdc78bc0aa813b Mon Sep 17 00:00:00 2001 From: Jonatan Pettersson Date: Tue, 6 Jan 2026 20:12:04 +0100 Subject: [PATCH 2/3] feat: open multiple dirs in separate tabs --- src/tab.rs | 83 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 68 insertions(+), 15 deletions(-) diff --git a/src/tab.rs b/src/tab.rs index e34c584..3e3ac0f 100644 --- a/src/tab.rs +++ b/src/tab.rs @@ -3785,24 +3785,77 @@ impl Tab { commands.push(Command::OpenFile(vec![path])); } } + // Open selected items None => { - if let Some(ref mut items) = self.items_opt { - let mut open_files = Vec::new(); - for item in items.iter() { - if item.selected { - if let Some(location) = &item.location_opt { - if item.metadata.is_dir() { - //TODO: allow opening multiple tabs? - cd = Some(location.clone()); - } else if let Some(path) = location.path_opt() { - open_files.push(path.clone()); - } - } else { - //TODO: open properties? - } - } + enum ResolveResult { + Open(Option), + OpenInTab(Option), + OpenTrash, + OpenProperties, + Cd(Location), + Skip, + } + fn resolve_item( + item: &Item, + mode: &Mode, + is_only_one_selected: bool, + ) -> ResolveResult { + if !item.selected { + return ResolveResult::Skip; } + let location = match &item.location_opt { + Some(l) => l, + None => return ResolveResult::OpenProperties, + }; + + let path_opt = location.path_opt(); + + if item.metadata.is_dir() { + match mode { + Mode::App => { + if is_only_one_selected { + return ResolveResult::Cd(location.clone()); + } else { + return ResolveResult::OpenInTab(path_opt.cloned()); + } + } + Mode::Desktop => { + return match location { + Location::Trash => ResolveResult::OpenTrash, + _ => ResolveResult::Open(path_opt.cloned()), + }; + } + Mode::Dialog(_) => { + if is_only_one_selected { + return ResolveResult::Cd(location.clone()); + } else { + return ResolveResult::Skip; + } + } + } + } else { + return ResolveResult::Open(path_opt.cloned()); + } + } + let mut open_files = Vec::new(); + if let Some(items) = self.items_opt.as_ref() { + let selected_count = items.iter().filter(|i| i.selected).count(); + + for item in items.iter() { + match resolve_item(item, &self.mode, selected_count == 1) { + ResolveResult::Open(Some(p)) => open_files.push(p), + ResolveResult::OpenInTab(Some(p)) => { + commands.push(Command::OpenInNewTab(p)) + } + ResolveResult::Cd(loc) => cd = Some(loc), + ResolveResult::OpenTrash => commands.push(Command::OpenTrash), + ResolveResult::OpenProperties => {} //TODO: open properties? + _ => {} + } + } + } + if !open_files.is_empty() { commands.push(Command::OpenFile(open_files)); } } From c75845e3d30fb3806bb000705f794de2068d3cd2 Mon Sep 17 00:00:00 2001 From: Jonatan Pettersson Date: Wed, 7 Jan 2026 20:03:31 +0100 Subject: [PATCH 3/3] fix: handle hidden items during shift-click --- src/tab.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/tab.rs b/src/tab.rs index 3e3ac0f..b9fe876 100644 --- a/src/tab.rs +++ b/src/tab.rs @@ -3299,7 +3299,13 @@ impl Tab { .take(max_real - min_real + 1) { if let Some(item) = items.get_mut(index) { - item.selected = true; + if item.hidden { + if self.config.show_hidden { + item.selected = true; + } + } else { + item.selected = true; + } } } }