feat: allow noop for single-key chords by removing the mixing length limit (#2064)

This commit is contained in:
三咲雅 · Misaki Masa 2024-12-18 10:51:36 +08:00 committed by GitHub
parent 54918b506f
commit 635bb4be55
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -6,7 +6,7 @@ use serde::{Deserialize, Deserializer};
use yazi_shared::Layer;
use super::Chord;
use crate::Preset;
use crate::{Preset, keymap::Key};
#[derive(Debug)]
pub struct Keymap {
@ -72,17 +72,20 @@ impl<'de> Deserialize<'de> for Keymap {
}
fn mix(a: IndexSet<Chord>, b: IndexSet<Chord>, c: IndexSet<Chord>) -> Vec<Chord> {
let a_seen: HashSet<_> =
a.iter().filter(|&v| v.on.len() > 1).map(|v| [v.on[0], v.on[1]]).collect();
let b_seen: HashSet<_> =
b.iter().filter(|&v| v.on.len() > 1).map(|v| [v.on[0], v.on[1]]).collect();
#[inline]
fn on(Chord { on, .. }: &Chord) -> [Key; 2] {
[on.first().copied().unwrap_or_default(), on.get(1).copied().unwrap_or_default()]
}
let a_seen: HashSet<_> = a.iter().map(on).collect();
let b_seen: HashSet<_> = b.iter().map(on).collect();
Preset::mix(
a,
b.into_iter().filter(|v| v.on.len() < 2 || !a_seen.contains(&v.on[..2])),
c.into_iter().filter(|v| v.on.len() < 2 || !b_seen.contains(&v.on[..2])),
b.into_iter().filter(|v| !a_seen.contains(&on(v))),
c.into_iter().filter(|v| !b_seen.contains(&on(v))),
)
.filter(|c| !c.noop())
.filter(|chord| !chord.noop())
.collect()
}