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

73
Cargo.lock generated
View file

@ -1516,7 +1516,7 @@ dependencies = [
[[package]]
name = "cosmic-config"
version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#1fce5df160f595d1b1e5a8e2bb2a24775419f82d"
source = "git+https://github.com/pop-os/libcosmic#a55ed23ba8d8f8f72599daf0824074986057bdff"
dependencies = [
"atomicwrites",
"cosmic-config-derive",
@ -1538,7 +1538,7 @@ dependencies = [
[[package]]
name = "cosmic-config-derive"
version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#1fce5df160f595d1b1e5a8e2bb2a24775419f82d"
source = "git+https://github.com/pop-os/libcosmic#a55ed23ba8d8f8f72599daf0824074986057bdff"
dependencies = [
"quote",
"syn 1.0.109",
@ -1740,7 +1740,7 @@ dependencies = [
[[package]]
name = "cosmic-settings-config"
version = "0.1.0"
source = "git+https://github.com/pop-os/cosmic-settings-daemon#ed1bc9e39e0380ea7e40233bb63960eeb674be34"
source = "git+https://github.com/pop-os/cosmic-settings-daemon#eb886de5527f9b5d2f225708d63d9d36fbb63a64"
dependencies = [
"cosmic-config",
"ron 0.9.0",
@ -1762,7 +1762,7 @@ dependencies = [
[[package]]
name = "cosmic-settings-daemon-config"
version = "0.1.0"
source = "git+https://github.com/pop-os/cosmic-settings-daemon#ed1bc9e39e0380ea7e40233bb63960eeb674be34"
source = "git+https://github.com/pop-os/cosmic-settings-daemon#eb886de5527f9b5d2f225708d63d9d36fbb63a64"
dependencies = [
"cosmic-config",
"ron 0.8.1",
@ -3229,7 +3229,7 @@ dependencies = [
"js-sys",
"log",
"wasm-bindgen",
"windows-core 0.61.2",
"windows-core 0.57.0",
]
[[package]]
@ -3262,7 +3262,7 @@ dependencies = [
[[package]]
name = "iced_accessibility"
version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#1fce5df160f595d1b1e5a8e2bb2a24775419f82d"
source = "git+https://github.com/pop-os/libcosmic#a55ed23ba8d8f8f72599daf0824074986057bdff"
dependencies = [
"accesskit",
"accesskit_winit",
@ -3271,7 +3271,7 @@ dependencies = [
[[package]]
name = "iced_core"
version = "0.14.0-dev"
source = "git+https://github.com/pop-os/libcosmic#1fce5df160f595d1b1e5a8e2bb2a24775419f82d"
source = "git+https://github.com/pop-os/libcosmic#a55ed23ba8d8f8f72599daf0824074986057bdff"
dependencies = [
"bitflags 2.9.1",
"bytes",
@ -3296,7 +3296,7 @@ dependencies = [
[[package]]
name = "iced_futures"
version = "0.14.0-dev"
source = "git+https://github.com/pop-os/libcosmic#1fce5df160f595d1b1e5a8e2bb2a24775419f82d"
source = "git+https://github.com/pop-os/libcosmic#a55ed23ba8d8f8f72599daf0824074986057bdff"
dependencies = [
"futures",
"iced_core",
@ -8451,7 +8451,7 @@ version = "0.54.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65"
dependencies = [
"windows-result 0.1.2",
"windows-result",
"windows-targets 0.52.6",
]
@ -8463,23 +8463,10 @@ checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d"
dependencies = [
"windows-implement 0.57.0",
"windows-interface 0.57.0",
"windows-result 0.1.2",
"windows-result",
"windows-targets 0.52.6",
]
[[package]]
name = "windows-core"
version = "0.61.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3"
dependencies = [
"windows-implement 0.60.0",
"windows-interface 0.59.1",
"windows-link",
"windows-result 0.3.4",
"windows-strings",
]
[[package]]
name = "windows-implement"
version = "0.53.0"
@ -8502,17 +8489,6 @@ dependencies = [
"syn 2.0.101",
]
[[package]]
name = "windows-implement"
version = "0.60.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.101",
]
[[package]]
name = "windows-interface"
version = "0.53.0"
@ -8535,17 +8511,6 @@ dependencies = [
"syn 2.0.101",
]
[[package]]
name = "windows-interface"
version = "0.59.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.101",
]
[[package]]
name = "windows-link"
version = "0.1.1"
@ -8561,24 +8526,6 @@ dependencies = [
"windows-targets 0.52.6",
]
[[package]]
name = "windows-result"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6"
dependencies = [
"windows-link",
]
[[package]]
name = "windows-strings"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57"
dependencies = [
"windows-link",
]
[[package]]
name = "windows-sys"
version = "0.45.0"

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,