fix: context drawers on the search view

This commit is contained in:
Michael Aaron Murphy 2024-10-29 13:51:48 +01:00
parent 8af34ba9c4
commit 0dbc1e9bec
No known key found for this signature in database
GPG key ID: B2732D4240C9212C
33 changed files with 209 additions and 57 deletions

View file

@ -56,6 +56,7 @@ use std::{borrow::Cow, str::FromStr};
#[allow(clippy::module_name_repetitions)] #[allow(clippy::module_name_repetitions)]
pub struct SettingsApp { pub struct SettingsApp {
active_page: page::Entity, active_page: page::Entity,
active_context_page: Option<page::Entity>,
loaded_pages: BTreeSet<page::Entity>, loaded_pages: BTreeSet<page::Entity>,
config: Config, config: Config,
core: Core, core: Core,
@ -133,7 +134,7 @@ pub enum Message {
DesktopInfo, DesktopInfo,
Error(String), Error(String),
None, None,
OpenContextDrawer(Cow<'static, str>), OpenContextDrawer(Entity, Cow<'static, str>),
#[cfg(feature = "wayland")] #[cfg(feature = "wayland")]
OutputAdded(OutputInfo, WlOutput), OutputAdded(OutputInfo, WlOutput),
#[cfg(feature = "wayland")] #[cfg(feature = "wayland")]
@ -169,6 +170,7 @@ impl cosmic::Application for SettingsApp {
fn init(core: Core, flags: Self::Flags) -> (Self, Task<Self::Message>) { fn init(core: Core, flags: Self::Flags) -> (Self, Task<Self::Message>) {
let mut app = SettingsApp { let mut app = SettingsApp {
active_page: page::Entity::default(), active_page: page::Entity::default(),
active_context_page: None,
loaded_pages: BTreeSet::new(), loaded_pages: BTreeSet::new(),
config: Config::new(), config: Config::new(),
core, core,
@ -682,13 +684,15 @@ impl cosmic::Application for SettingsApp {
Message::SetTheme(t) => return set_theme(t), Message::SetTheme(t) => return set_theme(t),
Message::OpenContextDrawer(title) => { Message::OpenContextDrawer(page, title) => {
self.core.window.show_context = true; self.core.window.show_context = true;
self.active_context_page = Some(page);
self.set_context_title(title.to_string()); self.set_context_title(title.to_string());
} }
Message::CloseContextDrawer => { Message::CloseContextDrawer => {
self.core.window.show_context = false; self.core.window.show_context = false;
self.active_context_page = None;
} }
Message::Error(error) => { Message::Error(error) => {
@ -750,9 +754,11 @@ impl cosmic::Application for SettingsApp {
fn context_drawer(&self) -> Option<Element<Message>> { fn context_drawer(&self) -> Option<Element<Message>> {
if self.core.window.show_context { if self.core.window.show_context {
self.pages self.active_context_page.and_then(|context_page| {
.context_drawer(self.active_page) self.pages
.map(|e| e.map(Message::PageMessage)) .context_drawer(context_page)
.map(|e| e.map(Message::PageMessage))
})
} else { } else {
None None
} }
@ -972,14 +978,12 @@ impl SettingsApp {
if let Some(ref sender) = self.page_sender { if let Some(ref sender) = self.page_sender {
for page in load { for page in load {
eprintln!("loading {page:?}");
self.loaded_pages.insert(page); self.loaded_pages.insert(page);
tasks.push(self.pages.on_enter(page, sender.clone())); tasks.push(self.pages.on_enter(page, sender.clone()));
} }
} }
for page in unload { for page in unload {
eprintln!("unloading {page:?}");
self.loaded_pages.remove(&page); self.loaded_pages.remove(&page);
self.pages.on_leave(page); self.pages.on_leave(page);
} }

View file

@ -75,7 +75,6 @@ impl page::Page<crate::pages::Message> for Page {
fn on_enter( fn on_enter(
&mut self, &mut self,
_page: cosmic_settings_page::Entity,
sender: tokio::sync::mpsc::Sender<crate::pages::Message>, sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> cosmic::Task<crate::pages::Message> { ) -> cosmic::Task<crate::pages::Message> {
// TODO start stream for new device // TODO start stream for new device

View file

@ -34,7 +34,7 @@ use icon_themes::{IconHandles, IconThemes};
use ron::ser::PrettyConfig; use ron::ser::PrettyConfig;
use serde::Serialize; use serde::Serialize;
use slab::Slab; use slab::Slab;
use slotmap::SlotMap; use slotmap::{Key, SlotMap};
use crate::app; use crate::app;
use crate::widget::color_picker_context_view; use crate::widget::color_picker_context_view;
@ -62,6 +62,7 @@ enum ContextView {
} }
pub struct Page { pub struct Page {
entity: page::Entity,
on_enter_handle: Option<cosmic::iced::task::Handle>, on_enter_handle: Option<cosmic::iced::task::Handle>,
can_reset: bool, can_reset: bool,
no_custom_window_hint: bool, no_custom_window_hint: bool,
@ -153,6 +154,7 @@ impl
}); });
Self { Self {
entity: page::Entity::null(),
on_enter_handle: None, on_enter_handle: None,
can_reset: if theme_mode.is_dark { can_reset: if theme_mode.is_dark {
theme_builder == ThemeBuilder::dark() theme_builder == ThemeBuilder::dark()
@ -423,6 +425,7 @@ impl Page {
self.font_search.clear(); self.font_search.clear();
return cosmic::command::message(crate::app::Message::OpenContextDrawer( return cosmic::command::message(crate::app::Message::OpenContextDrawer(
self.entity,
fl!("monospace-font").into(), fl!("monospace-font").into(),
)); ));
} }
@ -432,6 +435,7 @@ impl Page {
self.font_search.clear(); self.font_search.clear();
return cosmic::command::message(crate::app::Message::OpenContextDrawer( return cosmic::command::message(crate::app::Message::OpenContextDrawer(
self.entity,
fl!("interface-font").into(), fl!("interface-font").into(),
)); ));
} }
@ -1070,7 +1074,10 @@ impl Page {
Message::IconsAndToolkit => { Message::IconsAndToolkit => {
self.context_view = Some(ContextView::IconsAndToolkit); self.context_view = Some(ContextView::IconsAndToolkit);
return cosmic::command::message(crate::app::Message::OpenContextDrawer("".into())); return cosmic::command::message(crate::app::Message::OpenContextDrawer(
self.entity,
"".into(),
));
} }
Message::Daytime(day_time) => { Message::Daytime(day_time) => {
@ -1197,7 +1204,10 @@ impl Page {
ColorPickerUpdate::ToggleColorPicker => { ColorPickerUpdate::ToggleColorPicker => {
self.context_view = Some(context_view); self.context_view = Some(context_view);
cosmic::command::message(crate::app::Message::OpenContextDrawer(context_title)) cosmic::command::message(crate::app::Message::OpenContextDrawer(
self.entity,
context_title,
))
} }
_ => Task::none(), _ => Task::none(),
@ -1393,6 +1403,10 @@ impl Page {
} }
impl page::Page<crate::pages::Message> for Page { impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.entity = entity;
}
fn content( fn content(
&self, &self,
sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>, sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>,
@ -1430,7 +1444,6 @@ impl page::Page<crate::pages::Message> for Page {
fn on_enter( fn on_enter(
&mut self, &mut self,
_: page::Entity,
_sender: tokio::sync::mpsc::Sender<crate::pages::Message>, _sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> Task<crate::pages::Message> { ) -> Task<crate::pages::Message> {
let (task, handle) = cosmic::command::batch(vec![ let (task, handle) = cosmic::command::batch(vec![

View file

@ -6,7 +6,7 @@ use cosmic::{
}; };
use cosmic_panel_config::CosmicPanelConfig; use cosmic_panel_config::CosmicPanelConfig;
use cosmic_settings_page::{self as page, section, Section}; use cosmic_settings_page::{self as page, section, Section};
use slotmap::SlotMap; use slotmap::{Key, SlotMap};
use std::borrow::Cow; use std::borrow::Cow;
use crate::{ use crate::{
@ -31,6 +31,7 @@ impl Default for Page {
}); });
Self { Self {
inner: applets_inner::Page { inner: applets_inner::Page {
entity: page::Entity::null(),
available_entries: freedesktop_desktop_entry::Iter::new( available_entries: freedesktop_desktop_entry::Iter::new(
freedesktop_desktop_entry::default_paths(), freedesktop_desktop_entry::default_paths(),
) )

View file

@ -17,9 +17,15 @@ use cosmic_settings_page as page;
#[derive(Debug)] #[derive(Debug)]
#[allow(clippy::struct_excessive_bools)] #[allow(clippy::struct_excessive_bools)]
#[derive(Default)] #[derive(Default)]
pub struct Page {} pub struct Page {
entity: page::Entity,
}
impl page::Page<crate::pages::Message> for Page { impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.entity = entity;
}
fn info(&self) -> page::Info { fn info(&self) -> page::Info {
page::Info::new("desktop", "video-display-symbolic").title(fl!("desktop")) page::Info::new("desktop", "video-display-symbolic").title(fl!("desktop"))
} }

View file

@ -33,7 +33,7 @@ use crate::{app, pages};
use cosmic_panel_config::CosmicPanelConfig; use cosmic_panel_config::CosmicPanelConfig;
use cosmic_settings_page::{self as page, section, Section}; use cosmic_settings_page::{self as page, section, Section};
use freedesktop_desktop_entry::DesktopEntry; use freedesktop_desktop_entry::DesktopEntry;
use slotmap::SlotMap; use slotmap::{Key, SlotMap};
use tracing::error; use tracing::error;
const MIME_TYPE: &str = "text/uri-list"; const MIME_TYPE: &str = "text/uri-list";
@ -51,6 +51,7 @@ const DRAG_START_DISTANCE_SQUARED: f32 = 64.0;
pub static APPLET_DND_ICON_ID: Lazy<window::Id> = Lazy::new(window::Id::unique); pub static APPLET_DND_ICON_ID: Lazy<window::Id> = Lazy::new(window::Id::unique);
pub struct Page { pub struct Page {
pub(crate) entity: page::Entity,
pub(crate) available_entries: Vec<Applet<'static>>, pub(crate) available_entries: Vec<Applet<'static>>,
pub(crate) config_helper: Option<Config>, pub(crate) config_helper: Option<Config>,
pub(crate) current_config: Option<CosmicPanelConfig>, pub(crate) current_config: Option<CosmicPanelConfig>,
@ -68,6 +69,7 @@ impl Default for Page {
(panel_config.name == "Panel").then_some(panel_config) (panel_config.name == "Panel").then_some(panel_config)
}); });
Self { Self {
entity: page::Entity::null(),
available_entries: freedesktop_desktop_entry::Iter::new( available_entries: freedesktop_desktop_entry::Iter::new(
freedesktop_desktop_entry::default_paths(), freedesktop_desktop_entry::default_paths(),
) )
@ -99,6 +101,10 @@ impl AppletsPage for Page {
} }
impl page::Page<crate::pages::Message> for Page { impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.entity = entity;
}
#[allow(clippy::too_many_lines)] #[allow(clippy::too_many_lines)]
fn content( fn content(
&self, &self,
@ -137,6 +143,13 @@ impl page::Page<crate::pages::Message> for Page {
None => return None, None => return None,
}) })
} }
fn on_enter(
&mut self,
_sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> Task<crate::pages::Message> {
Task::none()
}
} }
impl page::AutoBind<crate::pages::Message> for Page {} impl page::AutoBind<crate::pages::Message> for Page {}
@ -425,9 +438,10 @@ impl Page {
} }
Message::AddAppletDrawer => { Message::AddAppletDrawer => {
self.context = Some(ContextDrawer::AddApplet); self.context = Some(ContextDrawer::AddApplet);
return cosmic::command::message(app::Message::OpenContextDrawer(Cow::Owned(fl!( return cosmic::command::message(app::Message::OpenContextDrawer(
"add-applet" self.entity,
)))); Cow::Owned(fl!("add-applet")),
));
} }
}; };
Task::none() Task::none()

View file

@ -36,7 +36,7 @@ use cosmic_settings_wallpaper::{self as wallpaper, Entry, ScalingMode};
use image::imageops::FilterType::Lanczos3; use image::imageops::FilterType::Lanczos3;
use image::{ImageBuffer, Rgba}; use image::{ImageBuffer, Rgba};
use slab::Slab; use slab::Slab;
use slotmap::{DefaultKey, SecondaryMap, SlotMap}; use slotmap::{DefaultKey, Key, SecondaryMap, SlotMap};
const ZOOM: usize = 0; const ZOOM: usize = 0;
const FIT: usize = 1; const FIT: usize = 1;
@ -137,6 +137,9 @@ enum ContextView {
/// The page struct for the wallpaper view. /// The page struct for the wallpaper view.
pub struct Page { pub struct Page {
/// Internal ID of this page in the application.
entity: page::Entity,
/// Abort handle to the on_enter task. /// Abort handle to the on_enter task.
on_enter_handle: Option<cosmic::iced::task::Handle>, on_enter_handle: Option<cosmic::iced::task::Handle>,
@ -192,6 +195,10 @@ pub struct Page {
} }
impl page::Page<crate::pages::Message> for Page { impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.entity = entity;
}
fn content( fn content(
&self, &self,
sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>, sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>,
@ -207,7 +214,6 @@ impl page::Page<crate::pages::Message> for Page {
fn on_enter( fn on_enter(
&mut self, &mut self,
_page: page::Entity,
_sender: tokio::sync::mpsc::Sender<crate::pages::Message>, _sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> Task<crate::pages::Message> { ) -> Task<crate::pages::Message> {
// Check if the page is already being loaded. // Check if the page is already being loaded.
@ -286,6 +292,7 @@ impl page::AutoBind<crate::pages::Message> for Page {}
impl Default for Page { impl Default for Page {
fn default() -> Self { fn default() -> Self {
let mut page = Page { let mut page = Page {
entity: page::Entity::null(),
on_enter_handle: None, on_enter_handle: None,
context_view: None, context_view: None,
show_tab_bar: false, show_tab_bar: false,
@ -747,6 +754,7 @@ impl Page {
Message::ColorAddContext => { Message::ColorAddContext => {
self.context_view = Some(ContextView::AddColor); self.context_view = Some(ContextView::AddColor);
return cosmic::command::message(crate::app::Message::OpenContextDrawer( return cosmic::command::message(crate::app::Message::OpenContextDrawer(
self.entity,
fl!("color-picker").into(), fl!("color-picker").into(),
)); ));
} }

View file

@ -234,7 +234,6 @@ impl page::Page<crate::pages::Message> for Page {
#[cfg(not(feature = "test"))] #[cfg(not(feature = "test"))]
fn on_enter( fn on_enter(
&mut self, &mut self,
_page: page::Entity,
sender: tokio::sync::mpsc::Sender<crate::pages::Message>, sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> Task<crate::pages::Message> { ) -> Task<crate::pages::Message> {
if let Some(task) = self.background_service.take() { if let Some(task) = self.background_service.take() {
@ -280,7 +279,6 @@ impl page::Page<crate::pages::Message> for Page {
#[cfg(feature = "test")] #[cfg(feature = "test")]
fn on_enter( fn on_enter(
&mut self, &mut self,
_page: page::Entity,
sender: tokio::sync::mpsc::Sender<crate::pages::Message>, sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> Task<crate::pages::Message> { ) -> Task<crate::pages::Message> {
cosmic::command::future(async move { cosmic::command::future(async move {

View file

@ -14,7 +14,7 @@ use cosmic_comp_config::XkbConfig;
use cosmic_settings_page::{self as page, section, Section}; use cosmic_settings_page::{self as page, section, Section};
use itertools::Itertools; use itertools::Itertools;
use slab::Slab; use slab::Slab;
use slotmap::{DefaultKey, SlotMap}; use slotmap::{DefaultKey, Key, SlotMap};
static COMPOSE_OPTIONS: &[(&str, &str)] = &[ static COMPOSE_OPTIONS: &[(&str, &str)] = &[
// ("Left Alt", "compose:lalt"), XXX? // ("Left Alt", "compose:lalt"), XXX?
@ -90,6 +90,7 @@ const KB_REPEAT_RATE_MAX: u32 = 45;
const KB_REPEAT_RATE_MIN: u32 = 5; const KB_REPEAT_RATE_MIN: u32 = 5;
pub struct Page { pub struct Page {
entity: page::Entity,
config: cosmic_config::Config, config: cosmic_config::Config,
context: Option<Context>, context: Option<Context>,
input_source_search: String, input_source_search: String,
@ -105,6 +106,7 @@ impl Default for Page {
let config = cosmic_config::Config::new("com.system76.CosmicComp", 1).unwrap(); let config = cosmic_config::Config::new("com.system76.CosmicComp", 1).unwrap();
Self { Self {
entity: page::Entity::null(),
context: None, context: None,
expanded_source_popover: None, expanded_source_popover: None,
keyboard_layouts: SlotMap::new(), keyboard_layouts: SlotMap::new(),
@ -253,6 +255,10 @@ fn special_char_radio_row<'a>(
} }
impl page::Page<crate::pages::Message> for Page { impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.entity = entity;
}
fn content( fn content(
&self, &self,
sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>, sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>,
@ -285,7 +291,6 @@ impl page::Page<crate::pages::Message> for Page {
fn on_enter( fn on_enter(
&mut self, &mut self,
_page: page::Entity,
_sender: tokio::sync::mpsc::Sender<crate::pages::Message>, _sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> Task<crate::pages::Message> { ) -> Task<crate::pages::Message> {
self.xkb = super::get_config(&self.config, "xkb_config"); self.xkb = super::get_config(&self.config, "xkb_config");
@ -453,6 +458,7 @@ impl Page {
Message::ShowInputSourcesContext => { Message::ShowInputSourcesContext => {
self.context = Some(Context::ShowInputSourcesContext); self.context = Some(Context::ShowInputSourcesContext);
return cosmic::command::message(crate::app::Message::OpenContextDrawer( return cosmic::command::message(crate::app::Message::OpenContextDrawer(
self.entity,
fl!("keyboard-sources", "add").into(), fl!("keyboard-sources", "add").into(),
)); ));
} }
@ -464,6 +470,7 @@ impl Page {
Message::OpenSpecialCharacterContext(key) => { Message::OpenSpecialCharacterContext(key) => {
self.context = Some(Context::SpecialCharacter(key)); self.context = Some(Context::SpecialCharacter(key));
return cosmic::command::message(crate::app::Message::OpenContextDrawer( return cosmic::command::message(crate::app::Message::OpenContextDrawer(
self.entity,
key.title().into(), key.title().into(),
)); ));
} }

View file

@ -4,7 +4,9 @@ use cosmic::widget::{self, button, icon, settings, text};
use cosmic::{theme, Apply, Element, Task}; use cosmic::{theme, Apply, Element, Task};
use cosmic_config::{ConfigGet, ConfigSet}; use cosmic_config::{ConfigGet, ConfigSet};
use cosmic_settings_config::shortcuts::{self, Action, Binding, Shortcuts}; use cosmic_settings_config::shortcuts::{self, Action, Binding, Shortcuts};
use cosmic_settings_page as page;
use slab::Slab; use slab::Slab;
use slotmap::Key;
use std::borrow::Cow; use std::borrow::Cow;
use std::io; use std::io;
use std::str::FromStr; use std::str::FromStr;
@ -89,6 +91,7 @@ impl ShortcutModel {
#[must_use] #[must_use]
pub struct Model { pub struct Model {
pub entity: page::Entity,
pub defaults: Shortcuts, pub defaults: Shortcuts,
pub replace_dialog: Option<(usize, Binding, Action, String)>, pub replace_dialog: Option<(usize, Binding, Action, String)>,
pub shortcut_models: Slab<ShortcutModel>, pub shortcut_models: Slab<ShortcutModel>,
@ -101,6 +104,7 @@ pub struct Model {
impl Default for Model { impl Default for Model {
fn default() -> Self { fn default() -> Self {
Self { Self {
entity: page::Entity::null(),
defaults: Shortcuts::default(), defaults: Shortcuts::default(),
replace_dialog: None, replace_dialog: None,
shortcut_models: Slab::new(), shortcut_models: Slab::new(),
@ -390,7 +394,7 @@ impl Model {
self.replace_dialog = None; self.replace_dialog = None;
let mut tasks = vec![cosmic::command::message( let mut tasks = vec![cosmic::command::message(
crate::app::Message::OpenContextDrawer(description.into()), crate::app::Message::OpenContextDrawer(self.entity, description.into()),
)]; )];
if let Some(model) = self.shortcut_models.get(0) { if let Some(model) = self.shortcut_models.get(0) {

View file

@ -9,9 +9,10 @@ use cosmic_settings_config::shortcuts::{Action, Shortcuts};
use cosmic_settings_config::Binding; use cosmic_settings_config::Binding;
use cosmic_settings_page::{self as page, section, Section}; use cosmic_settings_page::{self as page, section, Section};
use slab::Slab; use slab::Slab;
use slotmap::SlotMap; use slotmap::{Key, SlotMap};
pub struct Page { pub struct Page {
entity: page::Entity,
model: super::Model, model: super::Model,
add_shortcut: AddShortcut, add_shortcut: AddShortcut,
replace_dialog: Vec<(Binding, Action, String)>, replace_dialog: Vec<(Binding, Action, String)>,
@ -22,6 +23,7 @@ pub struct Page {
impl Default for Page { impl Default for Page {
fn default() -> Self { fn default() -> Self {
Self { Self {
entity: page::Entity::null(),
model: super::Model::default().custom().actions(bindings), model: super::Model::default().custom().actions(bindings),
add_shortcut: AddShortcut::default(), add_shortcut: AddShortcut::default(),
replace_dialog: Vec::new(), replace_dialog: Vec::new(),
@ -211,6 +213,7 @@ impl Page {
self.add_shortcut.enable(); self.add_shortcut.enable();
return Task::batch(vec![ return Task::batch(vec![
cosmic::command::message(crate::app::Message::OpenContextDrawer( cosmic::command::message(crate::app::Message::OpenContextDrawer(
self.entity,
fl!("custom-shortcuts", "context").into(), fl!("custom-shortcuts", "context").into(),
)), )),
widget::text_input::focus(self.name_id.clone()), widget::text_input::focus(self.name_id.clone()),
@ -294,6 +297,11 @@ impl Page {
} }
impl page::Page<crate::pages::Message> for Page { impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.entity = entity;
self.model.entity = entity;
}
fn info(&self) -> page::Info { fn info(&self) -> page::Info {
page::Info::new("custom-shortcuts", "input-keyboard-symbolic") page::Info::new("custom-shortcuts", "input-keyboard-symbolic")
.title(fl!("custom-shortcuts")) .title(fl!("custom-shortcuts"))
@ -348,7 +356,6 @@ impl page::Page<crate::pages::Message> for Page {
fn on_enter( fn on_enter(
&mut self, &mut self,
_page: cosmic_settings_page::Entity,
_sender: tokio::sync::mpsc::Sender<crate::pages::Message>, _sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> Task<crate::pages::Message> { ) -> Task<crate::pages::Message> {
self.model.on_enter(); self.model.on_enter();

View file

@ -29,6 +29,10 @@ impl Page {
} }
impl page::Page<crate::pages::Message> for Page { impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.model.entity = entity;
}
fn info(&self) -> page::Info { fn info(&self) -> page::Info {
page::Info::new("manage-windows", "input-keyboard-symbolic").title(fl!("manage-windows")) page::Info::new("manage-windows", "input-keyboard-symbolic").title(fl!("manage-windows"))
} }
@ -54,7 +58,6 @@ impl page::Page<crate::pages::Message> for Page {
fn on_enter( fn on_enter(
&mut self, &mut self,
_page: cosmic_settings_page::Entity,
_sender: tokio::sync::mpsc::Sender<crate::pages::Message>, _sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> Task<crate::pages::Message> { ) -> Task<crate::pages::Message> {
self.model.on_enter(); self.model.on_enter();

View file

@ -27,6 +27,7 @@ use slotmap::{DefaultKey, Key, SecondaryMap, SlotMap};
use std::io; use std::io;
pub struct Page { pub struct Page {
entity: page::Entity,
modified: Modified, modified: Modified,
search: Search, search: Search,
search_model: Model, search_model: Model,
@ -82,6 +83,7 @@ pub enum Category {
impl Default for Page { impl Default for Page {
fn default() -> Self { fn default() -> Self {
Self { Self {
entity: page::Entity::default(),
modified: Modified::default(), modified: Modified::default(),
search: Search::default(), search: Search::default(),
search_model: Model::default(), search_model: Model::default(),
@ -99,6 +101,11 @@ impl Default for Page {
} }
impl page::Page<crate::pages::Message> for Page { impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.entity = entity;
self.search_model.entity = entity;
}
fn content( fn content(
&self, &self,
sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>, sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>,
@ -134,7 +141,6 @@ impl page::Page<crate::pages::Message> for Page {
fn on_enter( fn on_enter(
&mut self, &mut self,
_page: cosmic_settings_page::Entity,
_sender: tokio::sync::mpsc::Sender<crate::pages::Message>, _sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> Task<crate::pages::Message> { ) -> Task<crate::pages::Message> {
if self.shortcuts_context.is_none() { if self.shortcuts_context.is_none() {

View file

@ -29,6 +29,10 @@ impl Page {
} }
impl page::Page<crate::pages::Message> for Page { impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.model.entity = entity;
}
fn info(&self) -> page::Info { fn info(&self) -> page::Info {
page::Info::new("move-windows", "input-keyboard-symbolic").title(fl!("move-windows")) page::Info::new("move-windows", "input-keyboard-symbolic").title(fl!("move-windows"))
} }
@ -54,7 +58,6 @@ impl page::Page<crate::pages::Message> for Page {
fn on_enter( fn on_enter(
&mut self, &mut self,
_page: cosmic_settings_page::Entity,
_sender: tokio::sync::mpsc::Sender<crate::pages::Message>, _sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> Task<crate::pages::Message> { ) -> Task<crate::pages::Message> {
self.model.on_enter(); self.model.on_enter();

View file

@ -29,6 +29,10 @@ impl Page {
} }
impl page::Page<crate::pages::Message> for Page { impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.model.entity = entity;
}
fn info(&self) -> page::Info { fn info(&self) -> page::Info {
page::Info::new("nav-shortcuts", "input-keyboard-symbolic").title(fl!("nav-shortcuts")) page::Info::new("nav-shortcuts", "input-keyboard-symbolic").title(fl!("nav-shortcuts"))
} }
@ -54,7 +58,6 @@ impl page::Page<crate::pages::Message> for Page {
fn on_enter( fn on_enter(
&mut self, &mut self,
_page: cosmic_settings_page::Entity,
_sender: tokio::sync::mpsc::Sender<crate::pages::Message>, _sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> Task<crate::pages::Message> { ) -> Task<crate::pages::Message> {
self.model.on_enter(); self.model.on_enter();

View file

@ -29,6 +29,10 @@ impl Page {
} }
impl page::Page<crate::pages::Message> for Page { impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.model.entity = entity;
}
fn info(&self) -> page::Info { fn info(&self) -> page::Info {
page::Info::new("system-shortcut", "input-keyboard-symbolic").title(fl!("system-shortcut")) page::Info::new("system-shortcut", "input-keyboard-symbolic").title(fl!("system-shortcut"))
} }
@ -54,7 +58,6 @@ impl page::Page<crate::pages::Message> for Page {
fn on_enter( fn on_enter(
&mut self, &mut self,
_page: cosmic_settings_page::Entity,
_sender: tokio::sync::mpsc::Sender<crate::pages::Message>, _sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> Task<crate::pages::Message> { ) -> Task<crate::pages::Message> {
self.model.on_enter(); self.model.on_enter();

View file

@ -29,6 +29,10 @@ impl Page {
} }
impl page::Page<crate::pages::Message> for Page { impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.model.entity = entity;
}
fn info(&self) -> page::Info { fn info(&self) -> page::Info {
page::Info::new("window-tiling", "input-keyboard-symbolic").title(fl!("window-tiling")) page::Info::new("window-tiling", "input-keyboard-symbolic").title(fl!("window-tiling"))
} }
@ -54,7 +58,6 @@ impl page::Page<crate::pages::Message> for Page {
fn on_enter( fn on_enter(
&mut self, &mut self,
_page: cosmic_settings_page::Entity,
_sender: tokio::sync::mpsc::Sender<crate::pages::Message>, _sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> Task<crate::pages::Message> { ) -> Task<crate::pages::Message> {
self.model.on_enter(); self.model.on_enter();

View file

@ -19,9 +19,15 @@ pub fn default_primary_button() -> cosmic::widget::segmented_button::SingleSelec
} }
#[derive(Default)] #[derive(Default)]
pub struct Page; pub struct Page {
entity: page::Entity,
}
impl page::Page<crate::pages::Message> for Page { impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.entity = entity;
}
fn content( fn content(
&self, &self,
sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>, sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>,

View file

@ -22,6 +22,7 @@ static NM_CONNECTION_EDITOR: &str = "nm-connection-editor";
#[derive(Debug, Default)] #[derive(Debug, Default)]
pub struct Page { pub struct Page {
entity: page::Entity,
nm_task: Option<tokio::sync::oneshot::Sender<()>>, nm_task: Option<tokio::sync::oneshot::Sender<()>>,
devices: Vec<Arc<network_manager::devices::DeviceInfo>>, devices: Vec<Arc<network_manager::devices::DeviceInfo>>,
vpn: page::Entity, vpn: page::Entity,
@ -68,6 +69,10 @@ impl From<Message> for crate::pages::Message {
} }
impl page::Page<crate::pages::Message> for Page { impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.entity = entity;
}
fn info(&self) -> cosmic_settings_page::Info { fn info(&self) -> cosmic_settings_page::Info {
page::Info::new( page::Info::new(
"network-and-wireless", "network-and-wireless",
@ -221,7 +226,6 @@ impl page::Page<crate::pages::Message> for Page {
fn on_enter( fn on_enter(
&mut self, &mut self,
_page: page::Entity,
sender: tokio::sync::mpsc::Sender<crate::pages::Message>, sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> cosmic::Task<crate::pages::Message> { ) -> cosmic::Task<crate::pages::Message> {
if self.nm_task.is_none() { if self.nm_task.is_none() {

View file

@ -189,6 +189,7 @@ pub struct NmState {
#[derive(Debug, Default)] #[derive(Debug, Default)]
pub struct Page { pub struct Page {
entity: page::Entity,
nm_task: Option<tokio::sync::oneshot::Sender<()>>, nm_task: Option<tokio::sync::oneshot::Sender<()>>,
nm_state: Option<NmState>, nm_state: Option<NmState>,
dialog: Option<VpnDialog>, dialog: Option<VpnDialog>,
@ -203,6 +204,10 @@ pub struct Page {
impl page::AutoBind<crate::pages::Message> for Page {} impl page::AutoBind<crate::pages::Message> for Page {}
impl page::Page<crate::pages::Message> for Page { impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.entity = entity;
}
fn info(&self) -> cosmic_settings_page::Info { fn info(&self) -> cosmic_settings_page::Info {
page::Info::new("vpn", "preferences-vpn-symbolic") page::Info::new("vpn", "preferences-vpn-symbolic")
.title(fl!("vpn")) .title(fl!("vpn"))
@ -327,7 +332,6 @@ impl page::Page<crate::pages::Message> for Page {
fn on_enter( fn on_enter(
&mut self, &mut self,
_page: cosmic_settings_page::Entity,
sender: tokio::sync::mpsc::Sender<crate::pages::Message>, sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> cosmic::Task<crate::pages::Message> { ) -> cosmic::Task<crate::pages::Message> {
if self.nm_task.is_none() { if self.nm_task.is_none() {

View file

@ -93,6 +93,7 @@ enum WiFiDialog {
#[derive(Debug, Default)] #[derive(Debug, Default)]
pub struct Page { pub struct Page {
entity: page::Entity,
nm_task: Option<tokio::sync::oneshot::Sender<()>>, nm_task: Option<tokio::sync::oneshot::Sender<()>>,
nm_state: Option<NmState>, nm_state: Option<NmState>,
/// When defined, displays connections for the specific device. /// When defined, displays connections for the specific device.
@ -118,6 +119,10 @@ pub struct NmState {
impl page::AutoBind<crate::pages::Message> for Page {} impl page::AutoBind<crate::pages::Message> for Page {}
impl page::Page<crate::pages::Message> for Page { impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.entity = entity;
}
fn info(&self) -> cosmic_settings_page::Info { fn info(&self) -> cosmic_settings_page::Info {
page::Info::new("wifi", "preferences-wireless-symbolic") page::Info::new("wifi", "preferences-wireless-symbolic")
.title(fl!("wifi")) .title(fl!("wifi"))
@ -196,7 +201,6 @@ impl page::Page<crate::pages::Message> for Page {
fn on_enter( fn on_enter(
&mut self, &mut self,
_page: cosmic_settings_page::Entity,
sender: tokio::sync::mpsc::Sender<crate::pages::Message>, sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> cosmic::Task<crate::pages::Message> { ) -> cosmic::Task<crate::pages::Message> {
if self.nm_task.is_none() { if self.nm_task.is_none() {

View file

@ -78,6 +78,7 @@ enum WiredDialog {
#[derive(Debug, Default)] #[derive(Debug, Default)]
pub struct Page { pub struct Page {
entity: page::Entity,
nm_task: Option<tokio::sync::oneshot::Sender<()>>, nm_task: Option<tokio::sync::oneshot::Sender<()>>,
nm_state: Option<NmState>, nm_state: Option<NmState>,
dialog: Option<WiredDialog>, dialog: Option<WiredDialog>,
@ -104,6 +105,10 @@ pub struct NmState {
impl page::AutoBind<crate::pages::Message> for Page {} impl page::AutoBind<crate::pages::Message> for Page {}
impl page::Page<crate::pages::Message> for Page { impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.entity = entity;
}
fn info(&self) -> cosmic_settings_page::Info { fn info(&self) -> cosmic_settings_page::Info {
page::Info::new("wired", "preferences-wired-symbolic") page::Info::new("wired", "preferences-wired-symbolic")
.title(fl!("wired")) .title(fl!("wired"))
@ -152,7 +157,6 @@ impl page::Page<crate::pages::Message> for Page {
fn on_enter( fn on_enter(
&mut self, &mut self,
_page: cosmic_settings_page::Entity,
sender: tokio::sync::mpsc::Sender<crate::pages::Message>, sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> cosmic::Task<crate::pages::Message> { ) -> cosmic::Task<crate::pages::Message> {
if self.nm_task.is_none() { if self.nm_task.is_none() {

View file

@ -16,12 +16,17 @@ use slotmap::SlotMap;
#[derive(Default)] #[derive(Default)]
pub struct Page { pub struct Page {
entity: page::Entity,
battery: Battery, battery: Battery,
connected_devices: Vec<ConnectedDevice>, connected_devices: Vec<ConnectedDevice>,
on_enter_handle: Option<cosmic::iced::task::Handle>, on_enter_handle: Option<cosmic::iced::task::Handle>,
} }
impl page::Page<crate::pages::Message> for Page { impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.entity = entity;
}
fn info(&self) -> page::Info { fn info(&self) -> page::Info {
page::Info::new("power", "preferences-power-and-battery-symbolic") page::Info::new("power", "preferences-power-and-battery-symbolic")
.title(fl!("power")) .title(fl!("power"))
@ -41,7 +46,6 @@ impl page::Page<crate::pages::Message> for Page {
fn on_enter( fn on_enter(
&mut self, &mut self,
_page: cosmic_settings_page::Entity,
_sender: tokio::sync::mpsc::Sender<crate::pages::Message>, _sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> cosmic::Task<crate::pages::Message> { ) -> cosmic::Task<crate::pages::Message> {
let futures: Vec<Task<Message>> = vec![ let futures: Vec<Task<Message>> = vec![

View file

@ -70,6 +70,7 @@ pub enum DeviceId {
#[derive(Default)] #[derive(Default)]
pub struct Page { pub struct Page {
entity: page::Entity,
pipewire_thread: Option<(tokio::sync::oneshot::Sender<()>, pipewire::Sender<()>)>, pipewire_thread: Option<(tokio::sync::oneshot::Sender<()>, pipewire::Sender<()>)>,
pulse_thread: Option<tokio::sync::oneshot::Sender<()>>, pulse_thread: Option<tokio::sync::oneshot::Sender<()>>,
devices: BTreeMap<DeviceId, Card>, devices: BTreeMap<DeviceId, Card>,
@ -111,6 +112,10 @@ pub struct Page {
} }
impl page::Page<crate::pages::Message> for Page { impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.entity = entity;
}
fn content( fn content(
&self, &self,
sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>, sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>,
@ -126,7 +131,6 @@ impl page::Page<crate::pages::Message> for Page {
fn on_enter( fn on_enter(
&mut self, &mut self,
_page: cosmic_settings_page::Entity,
sender: tokio::sync::mpsc::Sender<crate::pages::Message>, sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> Task<crate::pages::Message> { ) -> Task<crate::pages::Message> {
if self.pulse_thread.is_none() { if self.pulse_thread.is_none() {

View file

@ -19,6 +19,7 @@ pub enum Message {
#[derive(Clone, Debug, Default)] #[derive(Clone, Debug, Default)]
pub struct Page { pub struct Page {
entity: page::Entity,
editing_device_name: bool, editing_device_name: bool,
info: Info, info: Info,
on_enter_handle: Option<cosmic::iced::task::Handle>, on_enter_handle: Option<cosmic::iced::task::Handle>,
@ -27,6 +28,10 @@ pub struct Page {
impl page::AutoBind<crate::pages::Message> for Page {} impl page::AutoBind<crate::pages::Message> for Page {}
impl page::Page<crate::pages::Message> for Page { impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.entity = entity;
}
fn content( fn content(
&self, &self,
sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>, sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>,
@ -46,7 +51,6 @@ impl page::Page<crate::pages::Message> for Page {
fn on_enter( fn on_enter(
&mut self, &mut self,
_page: page::Entity,
_sender: tokio::sync::mpsc::Sender<crate::pages::Message>, _sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> Task<crate::pages::Message> { ) -> Task<crate::pages::Message> {
let (task, handle) = Task::future(async move { let (task, handle) = Task::future(async move {

View file

@ -6,9 +6,15 @@ use cosmic_settings_page::{self as page, section};
use slotmap::SlotMap; use slotmap::SlotMap;
#[derive(Default)] #[derive(Default)]
pub struct Page; pub struct Page {
entity: page::Entity,
}
impl page::Page<crate::pages::Message> for Page { impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.entity = entity;
}
fn content( fn content(
&self, &self,
sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>, sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>,

View file

@ -9,9 +9,15 @@ pub mod users;
use cosmic_settings_page as page; use cosmic_settings_page as page;
#[derive(Default)] #[derive(Default)]
pub struct Page; pub struct Page {
entity: page::Entity,
}
impl page::Page<crate::pages::Message> for Page { impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.entity = entity;
}
fn info(&self) -> page::Info { fn info(&self) -> page::Info {
page::Info::new("system", "system-users-symbolic").title(fl!("system")) page::Info::new("system", "system-users-symbolic").title(fl!("system"))
} }

View file

@ -6,9 +6,15 @@ use cosmic_settings_page::{self as page, section};
use slotmap::SlotMap; use slotmap::SlotMap;
#[derive(Default)] #[derive(Default)]
pub struct Page; pub struct Page {
entity: page::Entity,
}
impl page::Page<crate::pages::Message> for Page { impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.entity = entity;
}
fn content( fn content(
&self, &self,
sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>, sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>,

View file

@ -11,15 +11,14 @@ use cosmic::{
widget::{self, dropdown, settings}, widget::{self, dropdown, settings},
Apply, Element, Task, Apply, Element, Task,
}; };
use cosmic_settings_page::Section; use cosmic_settings_page::{self as page, section, Section};
use cosmic_settings_page::{self as page, section};
use icu::{ use icu::{
calendar::{DateTime, Iso}, calendar::{DateTime, Iso},
datetime::DateTimeFormatter, datetime::DateTimeFormatter,
locid::Locale, locid::Locale,
}; };
use slab::Slab; use slab::Slab;
use slotmap::SlotMap; use slotmap::{Key, SlotMap};
pub use timedate_zbus::TimeDateProxy; pub use timedate_zbus::TimeDateProxy;
use tracing::error; use tracing::error;
@ -35,6 +34,7 @@ pub struct Info {
} }
pub struct Page { pub struct Page {
entity: page::Entity,
cosmic_applet_config: cosmic_config::Config, cosmic_applet_config: cosmic_config::Config,
first_day_of_week: usize, first_day_of_week: usize,
military_time: bool, military_time: bool,
@ -95,6 +95,7 @@ impl Default for Page {
}); });
Self { Self {
entity: page::Entity::null(),
cosmic_applet_config, cosmic_applet_config,
first_day_of_week, first_day_of_week,
formatted_date: String::new(), formatted_date: String::new(),
@ -112,6 +113,10 @@ impl Default for Page {
} }
impl page::Page<crate::pages::Message> for Page { impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.entity = entity;
}
fn content( fn content(
&self, &self,
sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>, sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>,
@ -131,7 +136,6 @@ impl page::Page<crate::pages::Message> for Page {
fn on_enter( fn on_enter(
&mut self, &mut self,
_page: cosmic_settings_page::Entity,
_sender: tokio::sync::mpsc::Sender<crate::pages::Message>, _sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> Task<crate::pages::Message> { ) -> Task<crate::pages::Message> {
cosmic::Task::future(async move { cosmic::Task::future(async move {
@ -180,6 +184,7 @@ impl Page {
self.timezone_search.clear(); self.timezone_search.clear();
self.timezone_context = true; self.timezone_context = true;
return cosmic::command::message(crate::app::Message::OpenContextDrawer( return cosmic::command::message(crate::app::Message::OpenContextDrawer(
self.entity,
fl!("time-zone").into(), fl!("time-zone").into(),
)); ));
} }

View file

@ -8,9 +8,15 @@ pub mod date;
pub mod region; pub mod region;
#[derive(Default)] #[derive(Default)]
pub struct Page; pub struct Page {
entity: page::Entity,
}
impl page::Page<crate::pages::Message> for Page { impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.entity = entity;
}
fn info(&self) -> page::Info { fn info(&self) -> page::Info {
page::Info::new("time", "preferences-time-and-language-symbolic") page::Info::new("time", "preferences-time-and-language-symbolic")
.title(fl!("time")) .title(fl!("time"))

View file

@ -6,9 +6,15 @@ use cosmic_settings_page::{self as page, section};
use slotmap::SlotMap; use slotmap::SlotMap;
#[derive(Default)] #[derive(Default)]
pub struct Page; pub struct Page {
entity: page::Entity,
}
impl page::Page<crate::pages::Message> for Page { impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.entity = entity;
}
fn content( fn content(
&self, &self,
sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>, sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>,

View file

@ -102,13 +102,15 @@ impl<Message: 'static> Binder<Message> {
P::sub_pages(crate::Insert { id, model: self }) P::sub_pages(crate::Insert { id, model: self })
} }
pub fn register_page<P: Page<Message>>(&mut self, page: P) -> crate::Entity { pub fn register_page<P: Page<Message>>(&mut self, mut page: P) -> crate::Entity {
let id = self.info.insert(page.info()); let id = self.info.insert(page.info());
if let Some(content) = page.content(&mut self.sections) { if let Some(content) = page.content(&mut self.sections) {
self.content.insert(id, content); self.content.insert(id, content);
} }
page.set_id(id);
self.page.insert(id, Box::new(page)); self.page.insert(id, Box::new(page));
id id
@ -172,7 +174,7 @@ impl<Message: 'static> Binder<Message> {
sender: tokio::sync::mpsc::Sender<Message>, sender: tokio::sync::mpsc::Sender<Message>,
) -> Task<Message> { ) -> Task<Message> {
if let Some(page) = self.page.get_mut(id) { if let Some(page) = self.page.get_mut(id) {
return page.on_enter(id, sender); return page.on_enter(sender);
} }
Task::none() Task::none()

View file

@ -65,11 +65,7 @@ pub trait Page<Message: 'static>: Downcast {
/// Reload page metadata via a Task. /// Reload page metadata via a Task.
#[allow(unused)] #[allow(unused)]
fn on_enter( fn on_enter(&mut self, sender: tokio::sync::mpsc::Sender<Message>) -> Task<Message> {
&mut self,
page: crate::Entity,
sender: tokio::sync::mpsc::Sender<Message>,
) -> Task<Message> {
Task::none() Task::none()
} }
@ -78,6 +74,9 @@ pub trait Page<Message: 'static>: Downcast {
Task::none() Task::none()
} }
/// Assigns the entity ID of the page to the page.
fn set_id(&mut self, entity: Entity) {}
/// The title to display in the page header. /// The title to display in the page header.
fn title(&self) -> Option<&str> { fn title(&self) -> Option<&str> {
None None