feat(shortcuts): search by key bindings

This commit is contained in:
Jason Hansen 2025-05-28 09:19:37 -06:00 • committed by GitHub
parent 7df9700a94
commit 908432d32b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 47 additions and 74 deletions

View file

@ -3,6 +3,7 @@
// SPDX-License-Identifier: GPL-3.0-only
use std::{
borrow::Cow,
collections::{BTreeMap, BTreeSet},
path::{Path, PathBuf},
sync::Arc,
@ -300,7 +301,7 @@ fn apps() -> Section<crate::pages::Message> {
Message::Surface,
|a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)),
)
.icons(&meta.icons),
.icons(Cow::Borrowed(&meta.icons)),
)
.min_item_width(300.0)
})
@ -316,7 +317,7 @@ fn apps() -> Section<crate::pages::Message> {
Message::Surface,
|a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)),
)
.icons(&meta.icons),
.icons(Cow::Borrowed(&meta.icons)),
)
})
.add({
@ -331,7 +332,7 @@ fn apps() -> Section<crate::pages::Message> {
Message::Surface,
|a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)),
)
.icons(&meta.icons),
.icons(Cow::Borrowed(&meta.icons)),
)
})
.add({
@ -346,7 +347,7 @@ fn apps() -> Section<crate::pages::Message> {
Message::Surface,
|a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)),
)
.icons(&meta.icons),
.icons(Cow::Borrowed(&meta.icons)),
)
})
.add({
@ -361,7 +362,7 @@ fn apps() -> Section<crate::pages::Message> {
Message::Surface,
|a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)),
)
.icons(&meta.icons),
.icons(Cow::Borrowed(&meta.icons)),
)
})
.add({
@ -376,7 +377,7 @@ fn apps() -> Section<crate::pages::Message> {
Message::Surface,
|a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)),
)
.icons(&meta.icons),
.icons(Cow::Borrowed(&meta.icons)),
)
})
.add({
@ -391,7 +392,7 @@ fn apps() -> Section<crate::pages::Message> {
Message::Surface,
|a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)),
)
.icons(&meta.icons),
.icons(Cow::Borrowed(&meta.icons)),
)
})
.add({
@ -406,7 +407,7 @@ fn apps() -> Section<crate::pages::Message> {
Message::Surface,
|a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)),
)
.icons(&meta.icons),
.icons(Cow::Borrowed(&meta.icons)),
)
})
.add({
@ -421,7 +422,7 @@ fn apps() -> Section<crate::pages::Message> {
Message::Surface,
|a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)),
)
.icons(&meta.icons),
.icons(Cow::Borrowed(&meta.icons)),
)
})
.apply(Element::from)

View file

@ -1276,7 +1276,7 @@ pub fn display_configuration() -> Section<crate::pages::Message> {
widget::settings::item(
&descriptions[scale],
dropdown::popup_dropdown(
&DPI_SCALE_LABELS,
DPI_SCALE_LABELS.as_slice(),
page.cache.scale_selected,
Message::Scale,
cosmic::iced::window::Id::RESERVED,

View file

@ -25,9 +25,11 @@ use cosmic_settings_config::shortcuts::{self, Action, Shortcuts};
use cosmic_settings_page::Section;
use cosmic_settings_page::{self as page, section};
use itertools::Itertools;
use sctk::seat::keyboard::Keysym;
use shortcuts::action::System as SystemAction;
use slab::Slab;
use slotmap::{DefaultKey, Key, SecondaryMap, SlotMap};
use std::collections::BTreeSet;
use std::io;
pub struct Page {
@ -320,6 +322,10 @@ impl Search {
let id = self.actions.insert(action.clone());
self.localized.insert(id, localized);
}
// Remove unicode isolation characters to fix searching localized text that has them.
for (_, localized) in self.localized.iter_mut() {
*localized = localized.replace("\u{2068}", "").replace("\u{2069}", "");
}
}
fn retrieve_custom_actions(&self) -> Vec<(Binding, Action)> {
@ -341,10 +347,29 @@ impl Search {
}
fn shortcut_models(&mut self) -> Slab<ShortcutModel> {
let shortcut_search_actions = match Binding::from_str_partial(&self.input) {
Ok(input_binding) => self
.shortcuts
.iter()
.filter_map(|(binding, action)| {
if input_binding.is_subset(binding) {
Some(action)
} else {
None
}
})
.collect::<BTreeSet<_>>(),
Err(_) => Default::default(),
};
let input = self.input.to_lowercase();
self.actions
.iter()
.filter(|(id, _)| self.localized[*id].to_lowercase().contains(&input))
.filter(|(id, action)| {
self.localized[*id].to_lowercase().contains(&input)
|| shortcut_search_actions.contains(action)
})
.fold(Slab::new(), |mut slab, (_, action)| {
slab.insert(ShortcutModel::new(
&self.defaults,