From 5907e46555af13c9e5fb09916456fdc92dc09765 Mon Sep 17 00:00:00 2001 From: Michael Aaron Murphy Date: Wed, 17 Jan 2024 17:26:21 +0100 Subject: [PATCH] fix(app): missing search entry when search is active --- app/src/app.rs | 67 +++++++++++++++++++++++++++++++------------ app/src/widget/mod.rs | 5 ++-- 2 files changed, 50 insertions(+), 22 deletions(-) diff --git a/app/src/app.rs b/app/src/app.rs index fde12ab..5a080ff 100644 --- a/app/src/app.rs +++ b/app/src/app.rs @@ -29,10 +29,7 @@ use cosmic::{ window, Length, }, prelude::*, - widget::{ - column, container, icon, nav_bar, navigation, scrollable, search, segmented_button, - settings, - }, + widget::{column, container, icon, nav_bar, scrollable, search, segmented_button, settings}, Element, }; use cosmic_panel_config::CosmicPanelConfig; @@ -49,7 +46,9 @@ pub struct SettingsApp { file_chooser: Option<(file_chooser::Sender, page::Entity)>, nav_model: nav_bar::Model, pages: page::Binder, - search: search::Model, + search_active: bool, + search_id: cosmic::widget::Id, + search_input: String, search_selections: Vec<(page::Entity, section::Entity)>, } @@ -75,6 +74,10 @@ pub enum Message { Page(page::Entity), PageMessage(crate::pages::Message), PanelConfig(CosmicPanelConfig), + SearchActivate, + SearchChanged(String), + SearchClear, + SearchSubmit, Search(search::Message), SetWindowTitle, OpenContextDrawer(Cow<'static, str>), @@ -120,7 +123,9 @@ impl cosmic::Application for SettingsApp { file_chooser: None, nav_model: nav_bar::Model::default(), pages: page::Binder::default(), - search: search::Model::default(), + search_active: false, + search_id: cosmic::widget::Id::unique(), + search_input: String::new(), search_selections: Vec::default(), }; @@ -148,6 +153,24 @@ impl cosmic::Application for SettingsApp { Some(&self.nav_model) } + fn header_start(&self) -> Vec> { + let mut widgets = Vec::new(); + + widgets.push(if self.search_active { + cosmic::widget::text_input::search_input("", &self.search_input) + .width(Length::Fixed(240.0)) + .id(self.search_id.clone()) + .on_clear(Message::SearchClear) + .on_input(Message::SearchChanged) + .on_submit(Message::SearchSubmit) + .into() + } else { + cosmic::widget::search::button(Message::SearchActivate) + }); + + widgets + } + fn on_close_requested(&self, id: window::Id) -> Option { let message = if id == *applets_inner::ADD_PANEL_APPLET_DIALOGUE_ID { Message::PageMessage(crate::pages::Message::PanelApplet( @@ -169,8 +192,8 @@ impl cosmic::Application for SettingsApp { } fn on_escape(&mut self) -> Command { - if self.search.is_active() { - self.search.state = search::State::Inactive; + if self.search_active { + self.search_active = false; self.search_clear(); } @@ -186,7 +209,8 @@ impl cosmic::Application for SettingsApp { } fn on_search(&mut self) -> Command { - self.search.focus() + self.search_active = true; + cosmic::widget::text_input::focus(self.search_id.clone()) } fn subscription(&self) -> Subscription { @@ -267,18 +291,23 @@ impl cosmic::Application for SettingsApp { Message::SetWindowTitle => return self.set_title(), - Message::Search(search::Message::Activate) => { - return self.search.focus(); - } - - Message::Search(search::Message::Changed(phrase)) => { + Message::SearchChanged(phrase) => { self.search_changed(phrase); } - Message::Search(search::Message::Clear) => { + Message::SearchActivate => { + self.search_active = true; + return cosmic::widget::text_input::focus(self.search_id.clone()); + } + + Message::SearchClear => { self.search_clear(); } + Message::SearchSubmit => { + self.search_active = true; + } + Message::PageMessage(message) => match message { crate::pages::Message::About(message) => { page::update!(self.pages, message, system::about::Page); @@ -477,7 +506,7 @@ impl cosmic::Application for SettingsApp { } fn view(&self) -> Element { - let page_view = if self.search.is_active() { + let page_view = if self.search_active { self.search_view() } else if let Some(content) = self.pages.content(self.active_page) { self.page_view(content) @@ -583,7 +612,7 @@ impl SettingsApp { } self.search_clear(); - self.search.state = search::State::Inactive; + self.search_active = false; self.activate_navbar(page); let page_command = self @@ -696,13 +725,13 @@ impl SettingsApp { } } - self.search.phrase = phrase; + self.search_input = phrase; } /// Clears the search results so that the search page will not be shown. fn search_clear(&mut self) { self.search_selections.clear(); - self.search.phrase.clear(); + self.search_input.clear(); } /// Displays the search view. diff --git a/app/src/widget/mod.rs b/app/src/widget/mod.rs index 3c86727..2fc4e21 100644 --- a/app/src/widget/mod.rs +++ b/app/src/widget/mod.rs @@ -3,7 +3,8 @@ use cosmic::iced::Length; use cosmic::widget::{ - button, column, container, divider, horizontal_space, icon, list, row, settings, text, vertical_space, + button, column, container, divider, horizontal_space, icon, list, row, settings, text, + vertical_space, }; use cosmic::{theme, Apply, Element}; use cosmic_settings_page as page; @@ -76,8 +77,6 @@ pub fn display_container<'a, Message: 'a>(widget: Element<'a, Message>) -> Eleme .into() } - - #[must_use] pub fn page_list_item<'a, Message: 'static + Clone>( title: &'a str,