From e0f8b301d71963a85184213aef20b466a336202d Mon Sep 17 00:00:00 2001 From: sxyazi Date: Thu, 28 Mar 2024 00:13:11 +0800 Subject: [PATCH] .. --- yazi-core/src/manager/commands/bulk_rename.rs | 2 +- yazi-core/src/manager/commands/open.rs | 2 +- yazi-core/src/manager/commands/remove.rs | 2 +- yazi-core/src/manager/commands/yank.rs | 2 +- yazi-core/src/manager/manager.rs | 4 +++- yazi-core/src/tab/commands/copy.rs | 2 +- yazi-core/src/tab/commands/visual_mode.rs | 6 +++--- yazi-core/src/tab/mode.rs | 10 +++++----- yazi-core/src/tab/tab.rs | 8 ++++++-- 9 files changed, 22 insertions(+), 16 deletions(-) diff --git a/yazi-core/src/manager/commands/bulk_rename.rs b/yazi-core/src/manager/commands/bulk_rename.rs index 8d3e31cc..869d2545 100644 --- a/yazi-core/src/manager/commands/bulk_rename.rs +++ b/yazi-core/src/manager/commands/bulk_rename.rs @@ -15,7 +15,7 @@ impl Manager { }; 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 old: Vec<_> = old.into_iter().map(|p| p.strip_prefix(&root).unwrap().to_owned()).collect(); diff --git a/yazi-core/src/manager/commands/open.rs b/yazi-core/src/manager/commands/open.rs index 926ca773..d4e5f586 100644 --- a/yazi-core/src/manager/commands/open.rs +++ b/yazi-core/src/manager/commands/open.rs @@ -33,7 +33,7 @@ impl Manager { }; 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) { return; } diff --git a/yazi-core/src/manager/commands/remove.rs b/yazi-core/src/manager/commands/remove.rs index 6ff0d18f..35381403 100644 --- a/yazi-core/src/manager/commands/remove.rs +++ b/yazi-core/src/manager/commands/remove.rs @@ -27,7 +27,7 @@ impl Manager { } 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 { return self.remove_do(opt, tasks); diff --git a/yazi-core/src/manager/commands/yank.rs b/yazi-core/src/manager/commands/yank.rs index 5383382d..ac6390b3 100644 --- a/yazi-core/src/manager/commands/yank.rs +++ b/yazi-core/src/manager/commands/yank.rs @@ -18,7 +18,7 @@ impl Manager { 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() { return; } diff --git a/yazi-core/src/manager/manager.rs b/yazi-core/src/manager/manager.rs index b1fea58c..eab2304f 100644 --- a/yazi-core/src/manager/manager.rs +++ b/yazi-core/src/manager/manager.rs @@ -53,7 +53,9 @@ impl Manager { pub fn hovered_folder(&self) -> Option<&Folder> { self.tabs.active().hovered_folder() } #[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] pub fn hovered_and_selected(&self) -> Vec<&Url> { self.tabs.active().hovered_and_selected() } diff --git a/yazi-core/src/tab/commands/copy.rs b/yazi-core/src/tab/commands/copy.rs index 8e47ea24..ba22eff8 100644 --- a/yazi-core/src/tab/commands/copy.rs +++ b/yazi-core/src/tab/commands/copy.rs @@ -20,7 +20,7 @@ impl Tab { } 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() { s.push(match opt.type_.as_str() { "path" => u.as_os_str(), diff --git a/yazi-core/src/tab/commands/visual_mode.rs b/yazi-core/src/tab/commands/visual_mode.rs index 6d618525..8e19ace5 100644 --- a/yazi-core/src/tab/commands/visual_mode.rs +++ b/yazi-core/src/tab/commands/visual_mode.rs @@ -1,4 +1,4 @@ -use std::collections::HashSet; +use std::collections::BTreeSet; use yazi_shared::{event::Cmd, render}; @@ -18,9 +18,9 @@ impl Tab { let idx = self.current.cursor; if opt.unset { - self.mode = Mode::Unset(idx, HashSet::from([idx])); + self.mode = Mode::Unset(idx, BTreeSet::from([idx])); } else { - self.mode = Mode::Select(idx, HashSet::from([idx])); + self.mode = Mode::Select(idx, BTreeSet::from([idx])); }; render!(); } diff --git a/yazi-core/src/tab/mode.rs b/yazi-core/src/tab/mode.rs index 98f27139..05c8d8e5 100644 --- a/yazi-core/src/tab/mode.rs +++ b/yazi-core/src/tab/mode.rs @@ -1,15 +1,15 @@ -use std::{collections::HashSet, fmt::Display, mem}; +use std::{collections::BTreeSet, fmt::Display, mem}; #[derive(Clone, Debug, Default, Eq, PartialEq)] pub enum Mode { #[default] Normal, - Select(usize, HashSet), - Unset(usize, HashSet), + Select(usize, BTreeSet), + Unset(usize, BTreeSet), } impl Mode { - pub fn visual_mut(&mut self) -> Option<(usize, &mut HashSet)> { + pub fn visual_mut(&mut self) -> Option<(usize, &mut BTreeSet)> { match self { Mode::Normal => None, Mode::Select(start, indices) => Some((*start, indices)), @@ -17,7 +17,7 @@ impl Mode { } } - pub fn take_visual(&mut self) -> Option<(usize, HashSet)> { + pub fn take_visual(&mut self) -> Option<(usize, BTreeSet)> { match mem::take(self) { Mode::Normal => None, Mode::Select(start, indices) => Some((start, indices)), diff --git a/yazi-core/src/tab/tab.rs b/yazi-core/src/tab/tab.rs index 93339a87..279dc7fe 100644 --- a/yazi-core/src/tab/tab.rs +++ b/yazi-core/src/tab/tab.rs @@ -58,11 +58,15 @@ impl Tab { impl Tab { // --- Current - pub fn selected_or_hovered(&self) -> Vec<&Url> { + pub fn selected_or_hovered(&self, sorted: bool) -> Vec<&Url> { if self.selected.is_empty() { self.current.hovered().map(|h| vec![&h.url]).unwrap_or_default() - } else { + } else if !sorted { 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() } }