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,
},
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<crate::pages::Message>,
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<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> {
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<Self::Message> {
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::Message> {
self.search.focus()
self.search_active = true;
cosmic::widget::text_input::focus(self.search_id.clone())
}
fn subscription(&self) -> Subscription<Message> {
@ -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<Message> {
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.

View file

@ -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,