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

View file

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

View file

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

View file

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

View file

@ -17,9 +17,15 @@ use cosmic_settings_page as page;
#[derive(Debug)]
#[allow(clippy::struct_excessive_bools)]
#[derive(Default)]
pub struct Page {}
pub struct Page {
entity: page::Entity,
}
impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.entity = entity;
}
fn info(&self) -> page::Info {
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_settings_page::{self as page, section, Section};
use freedesktop_desktop_entry::DesktopEntry;
use slotmap::SlotMap;
use slotmap::{Key, SlotMap};
use tracing::error;
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 struct Page {
pub(crate) entity: page::Entity,
pub(crate) available_entries: Vec<Applet<'static>>,
pub(crate) config_helper: Option<Config>,
pub(crate) current_config: Option<CosmicPanelConfig>,
@ -68,6 +69,7 @@ impl Default for Page {
(panel_config.name == "Panel").then_some(panel_config)
});
Self {
entity: page::Entity::null(),
available_entries: freedesktop_desktop_entry::Iter::new(
freedesktop_desktop_entry::default_paths(),
)
@ -99,6 +101,10 @@ impl AppletsPage 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)]
fn content(
&self,
@ -137,6 +143,13 @@ impl page::Page<crate::pages::Message> for Page {
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 {}
@ -425,9 +438,10 @@ impl Page {
}
Message::AddAppletDrawer => {
self.context = Some(ContextDrawer::AddApplet);
return cosmic::command::message(app::Message::OpenContextDrawer(Cow::Owned(fl!(
"add-applet"
))));
return cosmic::command::message(app::Message::OpenContextDrawer(
self.entity,
Cow::Owned(fl!("add-applet")),
));
}
};
Task::none()

View file

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

View file

@ -234,7 +234,6 @@ impl page::Page<crate::pages::Message> for Page {
#[cfg(not(feature = "test"))]
fn on_enter(
&mut self,
_page: page::Entity,
sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> Task<crate::pages::Message> {
if let Some(task) = self.background_service.take() {
@ -280,7 +279,6 @@ impl page::Page<crate::pages::Message> for Page {
#[cfg(feature = "test")]
fn on_enter(
&mut self,
_page: page::Entity,
sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> Task<crate::pages::Message> {
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 itertools::Itertools;
use slab::Slab;
use slotmap::{DefaultKey, SlotMap};
use slotmap::{DefaultKey, Key, SlotMap};
static COMPOSE_OPTIONS: &[(&str, &str)] = &[
// ("Left Alt", "compose:lalt"), XXX?
@ -90,6 +90,7 @@ const KB_REPEAT_RATE_MAX: u32 = 45;
const KB_REPEAT_RATE_MIN: u32 = 5;
pub struct Page {
entity: page::Entity,
config: cosmic_config::Config,
context: Option<Context>,
input_source_search: String,
@ -105,6 +106,7 @@ impl Default for Page {
let config = cosmic_config::Config::new("com.system76.CosmicComp", 1).unwrap();
Self {
entity: page::Entity::null(),
context: None,
expanded_source_popover: None,
keyboard_layouts: SlotMap::new(),
@ -253,6 +255,10 @@ fn special_char_radio_row<'a>(
}
impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.entity = entity;
}
fn content(
&self,
sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>,
@ -285,7 +291,6 @@ impl page::Page<crate::pages::Message> for Page {
fn on_enter(
&mut self,
_page: page::Entity,
_sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> Task<crate::pages::Message> {
self.xkb = super::get_config(&self.config, "xkb_config");
@ -453,6 +458,7 @@ impl Page {
Message::ShowInputSourcesContext => {
self.context = Some(Context::ShowInputSourcesContext);
return cosmic::command::message(crate::app::Message::OpenContextDrawer(
self.entity,
fl!("keyboard-sources", "add").into(),
));
}
@ -464,6 +470,7 @@ impl Page {
Message::OpenSpecialCharacterContext(key) => {
self.context = Some(Context::SpecialCharacter(key));
return cosmic::command::message(crate::app::Message::OpenContextDrawer(
self.entity,
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_config::{ConfigGet, ConfigSet};
use cosmic_settings_config::shortcuts::{self, Action, Binding, Shortcuts};
use cosmic_settings_page as page;
use slab::Slab;
use slotmap::Key;
use std::borrow::Cow;
use std::io;
use std::str::FromStr;
@ -89,6 +91,7 @@ impl ShortcutModel {
#[must_use]
pub struct Model {
pub entity: page::Entity,
pub defaults: Shortcuts,
pub replace_dialog: Option<(usize, Binding, Action, String)>,
pub shortcut_models: Slab<ShortcutModel>,
@ -101,6 +104,7 @@ pub struct Model {
impl Default for Model {
fn default() -> Self {
Self {
entity: page::Entity::null(),
defaults: Shortcuts::default(),
replace_dialog: None,
shortcut_models: Slab::new(),
@ -390,7 +394,7 @@ impl Model {
self.replace_dialog = None;
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) {

View file

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

View file

@ -29,6 +29,10 @@ impl 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 {
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(
&mut self,
_page: cosmic_settings_page::Entity,
_sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> Task<crate::pages::Message> {
self.model.on_enter();

View file

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

View file

@ -29,6 +29,10 @@ impl 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 {
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(
&mut self,
_page: cosmic_settings_page::Entity,
_sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> Task<crate::pages::Message> {
self.model.on_enter();

View file

@ -29,6 +29,10 @@ impl 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 {
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(
&mut self,
_page: cosmic_settings_page::Entity,
_sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> Task<crate::pages::Message> {
self.model.on_enter();

View file

@ -29,6 +29,10 @@ impl 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 {
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(
&mut self,
_page: cosmic_settings_page::Entity,
_sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> Task<crate::pages::Message> {
self.model.on_enter();

View file

@ -29,6 +29,10 @@ impl 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 {
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(
&mut self,
_page: cosmic_settings_page::Entity,
_sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> Task<crate::pages::Message> {
self.model.on_enter();

View file

@ -19,9 +19,15 @@ pub fn default_primary_button() -> cosmic::widget::segmented_button::SingleSelec
}
#[derive(Default)]
pub struct Page;
pub struct Page {
entity: page::Entity,
}
impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.entity = entity;
}
fn content(
&self,
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)]
pub struct Page {
entity: page::Entity,
nm_task: Option<tokio::sync::oneshot::Sender<()>>,
devices: Vec<Arc<network_manager::devices::DeviceInfo>>,
vpn: page::Entity,
@ -68,6 +69,10 @@ impl From<Message> for crate::pages::Message {
}
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 {
page::Info::new(
"network-and-wireless",
@ -221,7 +226,6 @@ impl page::Page<crate::pages::Message> for Page {
fn on_enter(
&mut self,
_page: page::Entity,
sender: tokio::sync::mpsc::Sender<crate::pages::Message>,
) -> cosmic::Task<crate::pages::Message> {
if self.nm_task.is_none() {

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -6,9 +6,15 @@ use cosmic_settings_page::{self as page, section};
use slotmap::SlotMap;
#[derive(Default)]
pub struct Page;
pub struct Page {
entity: page::Entity,
}
impl page::Page<crate::pages::Message> for Page {
fn set_id(&mut self, entity: page::Entity) {
self.entity = entity;
}
fn content(
&self,
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 })
}
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());
if let Some(content) = page.content(&mut self.sections) {
self.content.insert(id, content);
}
page.set_id(id);
self.page.insert(id, Box::new(page));
id
@ -172,7 +174,7 @@ impl<Message: 'static> Binder<Message> {
sender: tokio::sync::mpsc::Sender<Message>,
) -> Task<Message> {
if let Some(page) = self.page.get_mut(id) {
return page.on_enter(id, sender);
return page.on_enter(sender);
}
Task::none()

View file

@ -65,11 +65,7 @@ pub trait Page<Message: 'static>: Downcast {
/// Reload page metadata via a Task.
#[allow(unused)]
fn on_enter(
&mut self,
page: crate::Entity,
sender: tokio::sync::mpsc::Sender<Message>,
) -> Task<Message> {
fn on_enter(&mut self, sender: tokio::sync::mpsc::Sender<Message>) -> Task<Message> {
Task::none()
}
@ -78,6 +74,9 @@ pub trait Page<Message: 'static>: Downcast {
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.
fn title(&self) -> Option<&str> {
None