From 343a8558166e1990f0248cc00dec46123ae92499 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Wed, 21 Dec 2022 11:39:49 -0700 Subject: [PATCH] Add more sub pages --- examples/cosmic/src/window.rs | 311 ++++++++++++++++++++++++---------- 1 file changed, 223 insertions(+), 88 deletions(-) diff --git a/examples/cosmic/src/window.rs b/examples/cosmic/src/window.rs index 5760bbed..590d40ef 100644 --- a/examples/cosmic/src/window.rs +++ b/examples/cosmic/src/window.rs @@ -21,9 +21,52 @@ pub trait SubPage { fn title(&self) -> &'static str; fn description(&self) -> &'static str; fn icon_name(&self) -> &'static str; + fn parent_page(&self) -> Page; fn into_page(self) -> Page; } +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum NetworkingPage { + Wired, + OnlineAccounts, +} + +impl SubPage for NetworkingPage { + //TODO: translate + fn title(&self) -> &'static str { + use NetworkingPage::*; + match self { + Wired => "Wired", + OnlineAccounts => "Online Accounts", + } + } + + //TODO: translate + fn description(&self) -> &'static str { + use NetworkingPage::*; + match self { + Wired => "Wired connection, connection profiles", + OnlineAccounts => "Add accounts, IMAP and SMTP, enterprise logins", + } + } + + fn icon_name(&self) -> &'static str { + use NetworkingPage::*; + match self { + Wired => "network-workgroup-symbolic", + OnlineAccounts => "goa-panel-symbolic", //TODO: new icon + } + } + + fn parent_page(&self) -> Page { + Page::Networking(None) + } + + fn into_page(self) -> Page { + Page::Networking(Some(self)) + } +} + #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum DesktopPage { DesktopOptions, @@ -73,11 +116,61 @@ impl SubPage for DesktopPage { } } + fn parent_page(&self) -> Page { + Page::Desktop(None) + } + fn into_page(self) -> Page { Page::Desktop(Some(self)) } } +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum InputDevicesPage { + Keyboard, + Touchpad, + Mouse, +} + +impl SubPage for InputDevicesPage { + //TODO: translate + fn title(&self) -> &'static str { + use InputDevicesPage::*; + match self { + Keyboard => "Keyboard", + Touchpad => "Touchpad", + Mouse => "Mouse", + } + } + + //TODO: translate + fn description(&self) -> &'static str { + use InputDevicesPage::*; + match self { + Keyboard => "Input sources, switching, special character entry, shortcuts.", + Touchpad => "Touchpad speed, click options, gestures.", + Mouse => "Mouse speed, acceleration, natural scrolling.", + } + } + + fn icon_name(&self) -> &'static str { + use InputDevicesPage::*; + match self { + Keyboard => "input-keyboard-symbolic", + Touchpad => "input-touchpad-symbolic", + Mouse => "input-mouse-symbolic", + } + } + + fn parent_page(&self) -> Page { + Page::InputDevices(None) + } + + fn into_page(self) -> Page { + Page::InputDevices(Some(self)) + } +} + #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum SystemAndAccountsPage { Users, @@ -109,12 +202,16 @@ impl SubPage for SystemAndAccountsPage { fn icon_name(&self) -> &'static str { use SystemAndAccountsPage::*; match self { - Users => "", - About => "", - Firmware => "", + Users => "system-users-symbolic", + About => "help-about-symbolic", + Firmware => "firmware-manager-symbolic", } } + fn parent_page(&self) -> Page { + Page::SystemAndAccounts(None) + } + fn into_page(self) -> Page { Page::SystemAndAccounts(Some(self)) } @@ -148,11 +245,15 @@ impl SubPage for TimeAndLanguagePage { fn icon_name(&self) -> &'static str { use TimeAndLanguagePage::*; match self { - DateAndTime => "", - RegionAndLanguage => "", + DateAndTime => "preferences-system-time-symbolic", + RegionAndLanguage => "preferences-desktop-locale-symbolic", } } + fn parent_page(&self) -> Page { + Page::TimeAndLanguage(None) + } + fn into_page(self) -> Page { Page::TimeAndLanguage(Some(self)) } @@ -162,10 +263,10 @@ impl SubPage for TimeAndLanguagePage { pub enum Page { Demo, WiFi, - Networking, + Networking(Option), Bluetooth, Desktop(Option), - InputDevices, + InputDevices(Option), Displays, PowerAndBattery, Sound, @@ -185,10 +286,10 @@ impl Page { match self { Demo => "Demo", WiFi => "Wi-Fi", - Networking => "Networking", + Networking(_) => "Networking", Bluetooth => "Bluetooth", Desktop(_) => "Desktop", - InputDevices => "Input Devices", + InputDevices(_) => "Input Devices", Displays => "Displays", PowerAndBattery => "Power & Battery", Sound => "Sound", @@ -207,10 +308,10 @@ impl Page { match self { Demo => "document-properties-symbolic", WiFi => "network-wireless-symbolic", - Networking => "network-workgroup-symbolic", + Networking(_) => "network-workgroup-symbolic", Bluetooth => "bluetooth-active-symbolic", Desktop(_) => "video-display-symbolic", - InputDevices => "input-keyboard-symbolic", + InputDevices(_) => "input-keyboard-symbolic", Displays => "preferences-desktop-display-symbolic", PowerAndBattery => "battery-full-charged-symbolic", Sound => "multimedia-volume-control-symbolic", @@ -289,6 +390,67 @@ pub enum Message { } impl Window { + fn page_title(&self, page: Page) -> Element { + row!( + text(page.title()).size(30), + horizontal_space(Length::Fill), + ).into() + } + + fn parent_page_button(&self, sub_page: impl SubPage) -> Element { + let page = sub_page.parent_page(); + column!( + iced::widget::Button::new(row!( + icon("go-previous-symbolic", 16).style(theme::Svg::SymbolicLink), + text(page.title()).size(16), + )) + .padding(0) + .style(theme::Button::Link) + .on_press(Message::Page(page)), + + row!( + text(sub_page.title()).size(30), + horizontal_space(Length::Fill), + ), + ) + .spacing(10) + .into() + } + + fn sub_page_button(&self, sub_page: impl SubPage) -> Element { + iced::widget::Button::new( + container(settings::item_row(vec![ + icon(sub_page.icon_name(), 20).style(theme::Svg::Symbolic).into(), + column!( + text(sub_page.title()).size(18), + text(sub_page.description()).size(12), + ).spacing(2).into(), + horizontal_space(iced::Length::Fill).into(), + icon("go-next-symbolic", 20).style(theme::Svg::Symbolic).into(), + ]).spacing(16)) + .padding([20, 24]) + .style(theme::Container::Custom(list::column::style)) + ) + .padding(0) + .style(theme::Button::Transparent) + .on_press(Message::Page(sub_page.into_page())) + .into() + } + + fn view_unimplemented_page(&self, page: Page) -> Element { + settings::view_column(vec![ + self.page_title(page), + text("We haven't created that panel yet, and/or it is using a similar idea as current Pop! designs.").into(), + ]).into() + } + + fn view_unimplemented_sub_page(&self, sub_page: impl SubPage) -> Element { + settings::view_column(vec![ + self.parent_page_button(sub_page), + text("We haven't created that panel yet, and/or it is using a similar idea as current Pop! designs.").into(), + ]).into() + } + fn view_demo(&self) -> Element { let choose_theme = [Theme::Light, Theme::Dark].iter().fold( row![].spacing(10).align_items(Alignment::Center), @@ -376,75 +538,9 @@ impl Window { .into() } - fn view_desktop_root(&self) -> Element { - //TODO: rename and move to libcosmic - let desktop_page_button = |desktop_page: DesktopPage| { - iced::widget::Button::new( - container(settings::item_row(vec![ - icon(desktop_page.icon_name(), 20).style(theme::Svg::Symbolic).into(), - column!( - text(desktop_page.title()).size(18), - text(desktop_page.description()).size(12), - ).spacing(2).into(), - horizontal_space(iced::Length::Fill).into(), - icon("go-next-symbolic", 20).style(theme::Svg::Symbolic).into(), - ]).spacing(16)) - .padding([20, 24]) - .style(theme::Container::Custom(list::column::style)) - ) - .padding(0) - .style(theme::Button::Transparent) - .on_press(Message::Page(desktop_page.into_page())) - }; - - settings::view_column(vec![ - text("Desktop").size(30).into(), - - //TODO: simplify these buttons! - column!( - desktop_page_button(DesktopPage::DesktopOptions), - desktop_page_button(DesktopPage::Wallpaper), - desktop_page_button(DesktopPage::Appearance), - desktop_page_button(DesktopPage::DockAndTopPanel), - desktop_page_button(DesktopPage::Workspaces), - desktop_page_button(DesktopPage::Notifications), - ).spacing(16).into() - ]) - .into() - } - - fn desktop_parent_button(&self, desktop_page: DesktopPage) -> Element { - column!( - iced::widget::Button::new(row!( - icon("go-previous-symbolic", 16).style(theme::Svg::SymbolicLink), - text("Desktop").size(16), - )) - .padding(0) - .style(theme::Button::Link) - .on_press(Message::Page(Page::Desktop(None))), - - row!( - text(desktop_page.title()).size(30), - horizontal_space(Length::Fill), - ), - ) - .spacing(10) - .into() - } - - fn view_desktop_page(&self, desktop_page: DesktopPage) -> Element { - match desktop_page { - DesktopPage::DesktopOptions => self.view_desktop_options(), - _ => settings::view_column(vec![ - self.desktop_parent_button(desktop_page), - text("Unimplemented desktop page").into(), - ]).into(), - } - } - fn view_desktop_options(&self) -> Element { settings::view_column(vec![ - self.desktop_parent_button(DesktopPage::DesktopOptions), + self.parent_page_button(DesktopPage::DesktopOptions), settings::view_section("Super Key Action") .add(settings::item("TODO", horizontal_space(Length::Fill))) @@ -575,10 +671,10 @@ impl Application for Window { let mut sidebar = container(scrollable(column!( sidebar_button(Page::Demo), sidebar_button(Page::WiFi), - sidebar_button(Page::Networking), + sidebar_button_complex(Page::Networking(None), matches!(self.page, Page::Networking(_))), sidebar_button(Page::Bluetooth), sidebar_button_complex(Page::Desktop(None), matches!(self.page, Page::Desktop(_))), - sidebar_button(Page::InputDevices), + sidebar_button_complex(Page::InputDevices(None), matches!(self.page, Page::InputDevices(_))), sidebar_button(Page::Displays), sidebar_button(Page::PowerAndBattery), sidebar_button(Page::Sound), @@ -605,15 +701,54 @@ impl Application for Window { if ! (condensed && sidebar_toggled) { let content: Element<_> = match self.page { Page::Demo => self.view_demo(), - Page::Desktop(None) => self.view_desktop_root(), - Page::Desktop(Some(desktop_page)) => self.view_desktop_page(desktop_page), - _ => settings::view_column(vec![ - row!( - text(self.page.title()).size(30), - horizontal_space(Length::Fill), - ).into(), - text("Unimplemented page").into(), + Page::Networking(None) => settings::view_column(vec![ + self.page_title(self.page), + column!( + self.sub_page_button(NetworkingPage::Wired), + self.sub_page_button(NetworkingPage::OnlineAccounts), + ).spacing(16).into() ]).into(), + Page::Networking(Some(sub_page)) => self.view_unimplemented_sub_page(sub_page), + Page::Desktop(None) => settings::view_column(vec![ + self.page_title(self.page), + column!( + self.sub_page_button(DesktopPage::DesktopOptions), + self.sub_page_button(DesktopPage::Wallpaper), + self.sub_page_button(DesktopPage::Appearance), + self.sub_page_button(DesktopPage::DockAndTopPanel), + self.sub_page_button(DesktopPage::Workspaces), + self.sub_page_button(DesktopPage::Notifications), + ).spacing(16).into() + ]).into(), + Page::Desktop(Some(DesktopPage::DesktopOptions)) => self.view_desktop_options(), + Page::Desktop(Some(sub_page)) => self.view_unimplemented_sub_page(sub_page), + Page::InputDevices(None) => settings::view_column(vec![ + self.page_title(self.page), + column!( + self.sub_page_button(InputDevicesPage::Keyboard), + self.sub_page_button(InputDevicesPage::Touchpad), + self.sub_page_button(InputDevicesPage::Mouse), + ).spacing(16).into() + ]).into(), + Page::InputDevices(Some(sub_page)) => self.view_unimplemented_sub_page(sub_page), + Page::SystemAndAccounts(None) => settings::view_column(vec![ + self.page_title(self.page), + column!( + self.sub_page_button(SystemAndAccountsPage::Users), + self.sub_page_button(SystemAndAccountsPage::About), + self.sub_page_button(SystemAndAccountsPage::Firmware), + ).spacing(16).into() + ]).into(), + Page::SystemAndAccounts(Some(sub_page)) => self.view_unimplemented_sub_page(sub_page), + Page::TimeAndLanguage(None) => settings::view_column(vec![ + self.page_title(self.page), + column!( + self.sub_page_button(TimeAndLanguagePage::DateAndTime), + self.sub_page_button(TimeAndLanguagePage::RegionAndLanguage), + ).spacing(16).into() + ]).into(), + Page::TimeAndLanguage(Some(sub_page)) => self.view_unimplemented_sub_page(sub_page), + _ => self.view_unimplemented_page(self.page), }; widgets.push(