Merge pull request #1499 from jpttrssn/multi-preview-open

feat: Add open button to multi preview
This commit is contained in:
Jeremy Soller 2026-01-14 11:32:21 -07:00 committed by GitHub
commit a3b80d6fde
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -3323,7 +3323,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;
}
}
}
}
@ -3828,24 +3834,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<PathBuf>),
OpenInTab(Option<PathBuf>),
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));
}
}
@ -6049,6 +6108,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>(