This commit is contained in:
sxyazi 2024-03-28 00:13:11 +08:00
parent 55c6aad3a7
commit e0f8b301d7
No known key found for this signature in database
9 changed files with 22 additions and 16 deletions

View file

@ -15,7 +15,7 @@ impl Manager {
}; };
let cwd = self.cwd().clone(); let cwd = self.cwd().clone();
let old: Vec<_> = self.selected_or_hovered(); let old: Vec<_> = self.selected_or_hovered(true);
let root = max_common_root(&old); let root = max_common_root(&old);
let old: Vec<_> = old.into_iter().map(|p| p.strip_prefix(&root).unwrap().to_owned()).collect(); let old: Vec<_> = old.into_iter().map(|p| p.strip_prefix(&root).unwrap().to_owned()).collect();

View file

@ -33,7 +33,7 @@ impl Manager {
}; };
let opt = opt.into() as Opt; let opt = opt.into() as Opt;
let selected = if opt.hovered { vec![&hovered] } else { self.selected_or_hovered() }; let selected = if opt.hovered { vec![&hovered] } else { self.selected_or_hovered(false) };
if Self::quit_with_selected(&selected) { if Self::quit_with_selected(&selected) {
return; return;
} }

View file

@ -27,7 +27,7 @@ impl Manager {
} }
let mut opt = opt.into() as Opt; let mut opt = opt.into() as Opt;
opt.targets = self.selected_or_hovered().into_iter().cloned().collect(); opt.targets = self.selected_or_hovered(false).into_iter().cloned().collect();
if opt.force { if opt.force {
return self.remove_do(opt, tasks); return self.remove_do(opt, tasks);

View file

@ -18,7 +18,7 @@ impl Manager {
return; return;
} }
let selected: HashSet<_> = self.selected_or_hovered().into_iter().cloned().collect(); let selected: HashSet<_> = self.selected_or_hovered(false).into_iter().cloned().collect();
if selected.is_empty() { if selected.is_empty() {
return; return;
} }

View file

@ -53,7 +53,9 @@ impl Manager {
pub fn hovered_folder(&self) -> Option<&Folder> { self.tabs.active().hovered_folder() } pub fn hovered_folder(&self) -> Option<&Folder> { self.tabs.active().hovered_folder() }
#[inline] #[inline]
pub fn selected_or_hovered(&self) -> Vec<&Url> { self.tabs.active().selected_or_hovered() } pub fn selected_or_hovered(&self, sorted: bool) -> Vec<&Url> {
self.tabs.active().selected_or_hovered(sorted)
}
#[inline] #[inline]
pub fn hovered_and_selected(&self) -> Vec<&Url> { self.tabs.active().hovered_and_selected() } pub fn hovered_and_selected(&self) -> Vec<&Url> { self.tabs.active().hovered_and_selected() }

View file

@ -20,7 +20,7 @@ impl Tab {
} }
let mut s = OsString::new(); let mut s = OsString::new();
let mut it = self.selected_or_hovered().into_iter().peekable(); let mut it = self.selected_or_hovered(true).into_iter().peekable();
while let Some(u) = it.next() { while let Some(u) = it.next() {
s.push(match opt.type_.as_str() { s.push(match opt.type_.as_str() {
"path" => u.as_os_str(), "path" => u.as_os_str(),

View file

@ -1,4 +1,4 @@
use std::collections::HashSet; use std::collections::BTreeSet;
use yazi_shared::{event::Cmd, render}; use yazi_shared::{event::Cmd, render};
@ -18,9 +18,9 @@ impl Tab {
let idx = self.current.cursor; let idx = self.current.cursor;
if opt.unset { if opt.unset {
self.mode = Mode::Unset(idx, HashSet::from([idx])); self.mode = Mode::Unset(idx, BTreeSet::from([idx]));
} else { } else {
self.mode = Mode::Select(idx, HashSet::from([idx])); self.mode = Mode::Select(idx, BTreeSet::from([idx]));
}; };
render!(); render!();
} }

View file

@ -1,15 +1,15 @@
use std::{collections::HashSet, fmt::Display, mem}; use std::{collections::BTreeSet, fmt::Display, mem};
#[derive(Clone, Debug, Default, Eq, PartialEq)] #[derive(Clone, Debug, Default, Eq, PartialEq)]
pub enum Mode { pub enum Mode {
#[default] #[default]
Normal, Normal,
Select(usize, HashSet<usize>), Select(usize, BTreeSet<usize>),
Unset(usize, HashSet<usize>), Unset(usize, BTreeSet<usize>),
} }
impl Mode { impl Mode {
pub fn visual_mut(&mut self) -> Option<(usize, &mut HashSet<usize>)> { pub fn visual_mut(&mut self) -> Option<(usize, &mut BTreeSet<usize>)> {
match self { match self {
Mode::Normal => None, Mode::Normal => None,
Mode::Select(start, indices) => Some((*start, indices)), Mode::Select(start, indices) => Some((*start, indices)),
@ -17,7 +17,7 @@ impl Mode {
} }
} }
pub fn take_visual(&mut self) -> Option<(usize, HashSet<usize>)> { pub fn take_visual(&mut self) -> Option<(usize, BTreeSet<usize>)> {
match mem::take(self) { match mem::take(self) {
Mode::Normal => None, Mode::Normal => None,
Mode::Select(start, indices) => Some((start, indices)), Mode::Select(start, indices) => Some((start, indices)),

View file

@ -58,11 +58,15 @@ impl Tab {
impl Tab { impl Tab {
// --- Current // --- Current
pub fn selected_or_hovered(&self) -> Vec<&Url> { pub fn selected_or_hovered(&self, sorted: bool) -> Vec<&Url> {
if self.selected.is_empty() { if self.selected.is_empty() {
self.current.hovered().map(|h| vec![&h.url]).unwrap_or_default() self.current.hovered().map(|h| vec![&h.url]).unwrap_or_default()
} else { } else if !sorted {
self.selected.keys().collect() self.selected.keys().collect()
} else {
let mut vec: Vec<_> = self.selected.iter().collect();
vec.sort_unstable_by(|a, b| a.1.cmp(b.1));
vec.into_iter().map(|(k, _)| k).collect()
} }
} }