fix(app): missing search entry when search is active

This commit is contained in:
Michael Aaron Murphy 2024-01-17 17:26:21 +01:00 • committed by Michael Murphy
parent 42fbf92d2f
commit 5907e46555
2 changed files with 50 additions and 22 deletions

View file

@ -29,10 +29,7 @@ use cosmic::{
window, Length, window, Length,
}, },
prelude::*, prelude::*,
widget::{ widget::{column, container, icon, nav_bar, scrollable, search, segmented_button, settings},
column, container, icon, nav_bar, navigation, scrollable, search, segmented_button,
settings,
},
Element, Element,
}; };
use cosmic_panel_config::CosmicPanelConfig; use cosmic_panel_config::CosmicPanelConfig;
@ -49,7 +46,9 @@ pub struct SettingsApp {
file_chooser: Option<(file_chooser::Sender, page::Entity)>, file_chooser: Option<(file_chooser::Sender, page::Entity)>,
nav_model: nav_bar::Model, nav_model: nav_bar::Model,
pages: page::Binder<crate::pages::Message>, pages: page::Binder<crate::pages::Message>,
search: search::Model, search_active: bool,
search_id: cosmic::widget::Id,
search_input: String,
search_selections: Vec<(page::Entity, section::Entity)>, search_selections: Vec<(page::Entity, section::Entity)>,
} }
@ -75,6 +74,10 @@ pub enum Message {
Page(page::Entity), Page(page::Entity),
PageMessage(crate::pages::Message), PageMessage(crate::pages::Message),
PanelConfig(CosmicPanelConfig), PanelConfig(CosmicPanelConfig),
SearchActivate,
SearchChanged(String),
SearchClear,
SearchSubmit,
Search(search::Message), Search(search::Message),
SetWindowTitle, SetWindowTitle,
OpenContextDrawer(Cow<'static, str>), OpenContextDrawer(Cow<'static, str>),
@ -120,7 +123,9 @@ impl cosmic::Application for SettingsApp {
file_chooser: None, file_chooser: None,
nav_model: nav_bar::Model::default(), nav_model: nav_bar::Model::default(),
pages: page::Binder::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(), search_selections: Vec::default(),
}; };
@ -148,6 +153,24 @@ impl cosmic::Application for SettingsApp {
Some(&self.nav_model) Some(&self.nav_model)
} }
fn header_start(&self) -> Vec<Element<Self::Message>> {
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<Self::Message> { fn on_close_requested(&self, id: window::Id) -> Option<Self::Message> {
let message = if id == *applets_inner::ADD_PANEL_APPLET_DIALOGUE_ID { let message = if id == *applets_inner::ADD_PANEL_APPLET_DIALOGUE_ID {
Message::PageMessage(crate::pages::Message::PanelApplet( Message::PageMessage(crate::pages::Message::PanelApplet(
@ -169,8 +192,8 @@ impl cosmic::Application for SettingsApp {
} }
fn on_escape(&mut self) -> Command<Self::Message> { fn on_escape(&mut self) -> Command<Self::Message> {
if self.search.is_active() { if self.search_active {
self.search.state = search::State::Inactive; self.search_active = false;
self.search_clear(); self.search_clear();
} }
@ -186,7 +209,8 @@ impl cosmic::Application for SettingsApp {
} }
fn on_search(&mut self) -> Command<Self::Message> { fn on_search(&mut self) -> Command<Self::Message> {
self.search.focus() self.search_active = true;
cosmic::widget::text_input::focus(self.search_id.clone())
} }
fn subscription(&self) -> Subscription<Message> { fn subscription(&self) -> Subscription<Message> {
@ -267,18 +291,23 @@ impl cosmic::Application for SettingsApp {
Message::SetWindowTitle => return self.set_title(), Message::SetWindowTitle => return self.set_title(),
Message::Search(search::Message::Activate) => { Message::SearchChanged(phrase) => {
return self.search.focus();
}
Message::Search(search::Message::Changed(phrase)) => {
self.search_changed(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(); self.search_clear();
} }
Message::SearchSubmit => {
self.search_active = true;
}
Message::PageMessage(message) => match message { Message::PageMessage(message) => match message {
crate::pages::Message::About(message) => { crate::pages::Message::About(message) => {
page::update!(self.pages, message, system::about::Page); page::update!(self.pages, message, system::about::Page);
@ -477,7 +506,7 @@ impl cosmic::Application for SettingsApp {
} }
fn view(&self) -> Element<Message> { fn view(&self) -> Element<Message> {
let page_view = if self.search.is_active() { let page_view = if self.search_active {
self.search_view() self.search_view()
} else if let Some(content) = self.pages.content(self.active_page) { } else if let Some(content) = self.pages.content(self.active_page) {
self.page_view(content) self.page_view(content)
@ -583,7 +612,7 @@ impl SettingsApp {
} }
self.search_clear(); self.search_clear();
self.search.state = search::State::Inactive; self.search_active = false;
self.activate_navbar(page); self.activate_navbar(page);
let page_command = self 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. /// Clears the search results so that the search page will not be shown.
fn search_clear(&mut self) { fn search_clear(&mut self) {
self.search_selections.clear(); self.search_selections.clear();
self.search.phrase.clear(); self.search_input.clear();
} }
/// Displays the search view. /// Displays the search view.

View file

@ -3,7 +3,8 @@
use cosmic::iced::Length; use cosmic::iced::Length;
use cosmic::widget::{ 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::{theme, Apply, Element};
use cosmic_settings_page as page; use cosmic_settings_page as page;
@ -76,8 +77,6 @@ pub fn display_container<'a, Message: 'a>(widget: Element<'a, Message>) -> Eleme
.into() .into()
} }
#[must_use] #[must_use]
pub fn page_list_item<'a, Message: 'static + Clone>( pub fn page_list_item<'a, Message: 'static + Clone>(
title: &'a str, title: &'a str,