fix(app): missing search entry when search is active
This commit is contained in:
parent
42fbf92d2f
commit
5907e46555
2 changed files with 50 additions and 22 deletions
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue