feat: apply logic to check num of selected files

This commit is contained in:
Zhang ShengYan 2024-09-26 19:29:30 +08:00
parent 914a296492
commit 59ea72a0da
6 changed files with 15 additions and 11 deletions

View file

@ -16,10 +16,6 @@ impl From<Cmd> for Opt {
impl Tab { impl Tab {
pub fn copy(&mut self, opt: impl Into<Opt>) { pub fn copy(&mut self, opt: impl Into<Opt>) {
let opt = opt.into() as Opt; let opt = opt.into() as Opt;
if !self.try_escape_visual() {
return;
}
let mut s = OsString::new(); let mut s = OsString::new();
let mut it = self.selected_or_hovered(true).peekable(); let mut it = self.selected_or_hovered(true).peekable();
while let Some(u) = it.next() { while let Some(u) = it.next() {

View file

@ -35,7 +35,7 @@ impl WhichSorter {
entities.push(match self.by { entities.push(match self.by {
SortBy::None => unreachable!(), SortBy::None => unreachable!(),
SortBy::Key => Cow::Owned(ctrl.on()), SortBy::Key => Cow::Owned(ctrl.on()),
SortBy::Desc => ctrl.desc_or_run(Plurality::Plural), SortBy::Desc => ctrl.desc_or_run(Plurality::default()),
}); });
} }

View file

@ -1,3 +1,4 @@
use crossterm::event::KeyCode;
use yazi_config::{KEYMAP, keymap::{Chord, Key}}; use yazi_config::{KEYMAP, keymap::{Chord, Key}};
use yazi_shared::{Layer, emit}; use yazi_shared::{Layer, emit};
@ -50,6 +51,13 @@ impl<'a> Router<'a> {
} }
if on.len() > 1 { if on.len() > 1 {
//for `copy` hotkeys starting with 'c', we need to escape visual mode first so that the `Which` UI can check how many files
// are selected to decide using plural or singular on command names.
if key.code == KeyCode::Char('c') {
if !self.app.cx.manager.active_mut().try_escape_visual() {
return false;
}
}
self.app.cx.which.show_with(key, layer); self.app.cx.which.show_with(key, layer);
} else { } else {
emit!(Seq(ctrl.to_seq(), layer)); emit!(Seq(ctrl.to_seq(), layer));

View file

@ -4,10 +4,11 @@ use yazi_config::{keymap::{Chord, Plurality}, THEME};
pub(super) struct Cand<'a> { pub(super) struct Cand<'a> {
cand: &'a Chord, cand: &'a Chord,
times: usize, times: usize,
selected: usize,
} }
impl<'a> Cand<'a> { impl<'a> Cand<'a> {
pub(super) fn new(cand: &'a Chord, times: usize) -> Self { Self { times, cand } } pub(super) fn new(cand: &'a Chord, times: usize, selected: usize) -> Self { Self { times, cand, selected } }
fn keys(&self) -> Vec<String> { fn keys(&self) -> Vec<String> {
self.cand.on[self.times..].iter().map(ToString::to_string).collect() self.cand.on[self.times..].iter().map(ToString::to_string).collect()
@ -32,7 +33,7 @@ impl Widget for Cand<'_> {
spans.push(Span::styled(&THEME.which.separator, THEME.which.separator_style)); spans.push(Span::styled(&THEME.which.separator, THEME.which.separator_style));
// Description // Description
spans.push(Span::styled(self.cand.desc_or_run(Plurality::Plural), THEME.which.desc)); spans.push(Span::styled(self.cand.desc_or_run(if self.selected > 1 { Plurality::Plural } else { Plurality::Singular }), THEME.which.desc));
Line::from(spans).render(area, buf); Line::from(spans).render(area, buf);
} }

View file

@ -48,14 +48,13 @@ impl Widget for Which<'_> {
yazi_plugin::elements::Clear::default().render(area, buf); yazi_plugin::elements::Clear::default().render(area, buf);
Block::new().style(THEME.which.mask).render(area, buf); Block::new().style(THEME.which.mask).render(area, buf);
let selected = self.cx.manager.selected_or_hovered(false).count();
for y in 0..area.height { for y in 0..area.height {
for (x, chunk) in chunks.iter().enumerate() { for (x, chunk) in chunks.iter().enumerate() {
let Some(cand) = which.cands.get(y as usize * cols + x) else { let Some(cand) = which.cands.get(y as usize * cols + x) else {
break; break;
}; };
Cand::new(cand, which.times, selected).render(Rect { y: chunk.y + y + 1, height: 1, ..*chunk }, buf);
Cand::new(cand, which.times).render(Rect { y: chunk.y + y + 1, height: 1, ..*chunk }, buf);
} }
} }
} }