From 4762bdaa59fffa18452960831468d53b288eafce Mon Sep 17 00:00:00 2001 From: Michael Aaron Murphy Date: Mon, 1 Apr 2024 15:51:35 +0200 Subject: [PATCH] feat(keyboard): searchable input sources --- .../src/pages/input/keyboard/mod.rs | 23 ++++++++++++++++--- i18n/en/cosmic_settings.ftl | 1 + 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/cosmic-settings/src/pages/input/keyboard/mod.rs b/cosmic-settings/src/pages/input/keyboard/mod.rs index 22c2023..23d2fe0 100644 --- a/cosmic-settings/src/pages/input/keyboard/mod.rs +++ b/cosmic-settings/src/pages/input/keyboard/mod.rs @@ -38,6 +38,7 @@ static ALTERNATE_CHARACTER_OPTIONS: &[(&str, &str)] = &[ #[derive(Clone, Debug)] pub enum Message { ExpandInputSourcePopover(Option), + InputSourceSearch(String), OpenSpecialCharacterContext(SpecialKey), ShowInputSourcesContext, SourceAdd(DefaultKey), @@ -61,10 +62,11 @@ pub type Description = String; pub struct Page { config: cosmic_config::Config, context: Option, - expanded_source_popover: Option, + input_source_search: String, + xkb: XkbConfig, keyboard_layouts: SlotMap, active_layouts: Vec, - xkb: XkbConfig, + expanded_source_popover: Option, } impl Default for Page { @@ -77,6 +79,7 @@ impl Default for Page { keyboard_layouts: SlotMap::new(), active_layouts: Vec::new(), xkb: XkbConfig::default(), + input_source_search: String::new(), config, } } @@ -303,6 +306,10 @@ impl page::Page for Page { impl Page { pub fn update(&mut self, message: Message) -> Command { match message { + Message::InputSourceSearch(search) => { + self.input_source_search = search; + } + Message::SourceAdd(id) => { self.context = None; @@ -398,13 +405,23 @@ impl Page { } pub fn add_input_source_view(&self) -> Element<'_, crate::pages::Message> { + let search = widget::search_input(fl!("type-to-search"), &self.input_source_search) + .on_input(Message::InputSourceSearch) + .on_clear(Message::InputSourceSearch(String::new())); + let mut list = widget::list_column(); + let search_input = self.input_source_search.trim(); + for (id, (_locale, variant, description)) in &self.keyboard_layouts { - list = list.add(self.input_source_item(id, description, !variant.is_empty())); + if search_input.is_empty() || description.contains(search_input) { + list = list.add(self.input_source_item(id, description, !variant.is_empty())); + } } widget::column() + .spacing(32) + .push(search) .push(list) .apply(Element::from) .map(crate::pages::Message::Keyboard) diff --git a/i18n/en/cosmic_settings.ftl b/i18n/en/cosmic_settings.ftl index 1d5fbec..fe56ef4 100644 --- a/i18n/en/cosmic_settings.ftl +++ b/i18n/en/cosmic_settings.ftl @@ -406,6 +406,7 @@ keyboard-special-char = Special Character Entry .compose = Compose key added = Added +type-to-search = Type to search... ## Input: Keyboard: Shortcuts