Add more sub pages
This commit is contained in:
parent
1e1a0159b8
commit
343a855816
1 changed files with 223 additions and 88 deletions
|
|
@ -21,9 +21,52 @@ pub trait SubPage {
|
||||||
fn title(&self) -> &'static str;
|
fn title(&self) -> &'static str;
|
||||||
fn description(&self) -> &'static str;
|
fn description(&self) -> &'static str;
|
||||||
fn icon_name(&self) -> &'static str;
|
fn icon_name(&self) -> &'static str;
|
||||||
|
fn parent_page(&self) -> Page;
|
||||||
fn into_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)]
|
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
||||||
pub enum DesktopPage {
|
pub enum DesktopPage {
|
||||||
DesktopOptions,
|
DesktopOptions,
|
||||||
|
|
@ -73,11 +116,61 @@ impl SubPage for DesktopPage {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn parent_page(&self) -> Page {
|
||||||
|
Page::Desktop(None)
|
||||||
|
}
|
||||||
|
|
||||||
fn into_page(self) -> Page {
|
fn into_page(self) -> Page {
|
||||||
Page::Desktop(Some(self))
|
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)]
|
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
||||||
pub enum SystemAndAccountsPage {
|
pub enum SystemAndAccountsPage {
|
||||||
Users,
|
Users,
|
||||||
|
|
@ -109,12 +202,16 @@ impl SubPage for SystemAndAccountsPage {
|
||||||
fn icon_name(&self) -> &'static str {
|
fn icon_name(&self) -> &'static str {
|
||||||
use SystemAndAccountsPage::*;
|
use SystemAndAccountsPage::*;
|
||||||
match self {
|
match self {
|
||||||
Users => "",
|
Users => "system-users-symbolic",
|
||||||
About => "",
|
About => "help-about-symbolic",
|
||||||
Firmware => "",
|
Firmware => "firmware-manager-symbolic",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn parent_page(&self) -> Page {
|
||||||
|
Page::SystemAndAccounts(None)
|
||||||
|
}
|
||||||
|
|
||||||
fn into_page(self) -> Page {
|
fn into_page(self) -> Page {
|
||||||
Page::SystemAndAccounts(Some(self))
|
Page::SystemAndAccounts(Some(self))
|
||||||
}
|
}
|
||||||
|
|
@ -148,11 +245,15 @@ impl SubPage for TimeAndLanguagePage {
|
||||||
fn icon_name(&self) -> &'static str {
|
fn icon_name(&self) -> &'static str {
|
||||||
use TimeAndLanguagePage::*;
|
use TimeAndLanguagePage::*;
|
||||||
match self {
|
match self {
|
||||||
DateAndTime => "",
|
DateAndTime => "preferences-system-time-symbolic",
|
||||||
RegionAndLanguage => "",
|
RegionAndLanguage => "preferences-desktop-locale-symbolic",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn parent_page(&self) -> Page {
|
||||||
|
Page::TimeAndLanguage(None)
|
||||||
|
}
|
||||||
|
|
||||||
fn into_page(self) -> Page {
|
fn into_page(self) -> Page {
|
||||||
Page::TimeAndLanguage(Some(self))
|
Page::TimeAndLanguage(Some(self))
|
||||||
}
|
}
|
||||||
|
|
@ -162,10 +263,10 @@ impl SubPage for TimeAndLanguagePage {
|
||||||
pub enum Page {
|
pub enum Page {
|
||||||
Demo,
|
Demo,
|
||||||
WiFi,
|
WiFi,
|
||||||
Networking,
|
Networking(Option<NetworkingPage>),
|
||||||
Bluetooth,
|
Bluetooth,
|
||||||
Desktop(Option<DesktopPage>),
|
Desktop(Option<DesktopPage>),
|
||||||
InputDevices,
|
InputDevices(Option<InputDevicesPage>),
|
||||||
Displays,
|
Displays,
|
||||||
PowerAndBattery,
|
PowerAndBattery,
|
||||||
Sound,
|
Sound,
|
||||||
|
|
@ -185,10 +286,10 @@ impl Page {
|
||||||
match self {
|
match self {
|
||||||
Demo => "Demo",
|
Demo => "Demo",
|
||||||
WiFi => "Wi-Fi",
|
WiFi => "Wi-Fi",
|
||||||
Networking => "Networking",
|
Networking(_) => "Networking",
|
||||||
Bluetooth => "Bluetooth",
|
Bluetooth => "Bluetooth",
|
||||||
Desktop(_) => "Desktop",
|
Desktop(_) => "Desktop",
|
||||||
InputDevices => "Input Devices",
|
InputDevices(_) => "Input Devices",
|
||||||
Displays => "Displays",
|
Displays => "Displays",
|
||||||
PowerAndBattery => "Power & Battery",
|
PowerAndBattery => "Power & Battery",
|
||||||
Sound => "Sound",
|
Sound => "Sound",
|
||||||
|
|
@ -207,10 +308,10 @@ impl Page {
|
||||||
match self {
|
match self {
|
||||||
Demo => "document-properties-symbolic",
|
Demo => "document-properties-symbolic",
|
||||||
WiFi => "network-wireless-symbolic",
|
WiFi => "network-wireless-symbolic",
|
||||||
Networking => "network-workgroup-symbolic",
|
Networking(_) => "network-workgroup-symbolic",
|
||||||
Bluetooth => "bluetooth-active-symbolic",
|
Bluetooth => "bluetooth-active-symbolic",
|
||||||
Desktop(_) => "video-display-symbolic",
|
Desktop(_) => "video-display-symbolic",
|
||||||
InputDevices => "input-keyboard-symbolic",
|
InputDevices(_) => "input-keyboard-symbolic",
|
||||||
Displays => "preferences-desktop-display-symbolic",
|
Displays => "preferences-desktop-display-symbolic",
|
||||||
PowerAndBattery => "battery-full-charged-symbolic",
|
PowerAndBattery => "battery-full-charged-symbolic",
|
||||||
Sound => "multimedia-volume-control-symbolic",
|
Sound => "multimedia-volume-control-symbolic",
|
||||||
|
|
@ -289,6 +390,67 @@ pub enum Message {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Window {
|
impl Window {
|
||||||
|
fn page_title(&self, page: Page) -> Element<Message> {
|
||||||
|
row!(
|
||||||
|
text(page.title()).size(30),
|
||||||
|
horizontal_space(Length::Fill),
|
||||||
|
).into()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parent_page_button(&self, sub_page: impl SubPage) -> Element<Message> {
|
||||||
|
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<Message> {
|
||||||
|
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<Message> {
|
||||||
|
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<Message> {
|
||||||
|
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<Message> {
|
fn view_demo(&self) -> Element<Message> {
|
||||||
let choose_theme = [Theme::Light, Theme::Dark].iter().fold(
|
let choose_theme = [Theme::Light, Theme::Dark].iter().fold(
|
||||||
row![].spacing(10).align_items(Alignment::Center),
|
row![].spacing(10).align_items(Alignment::Center),
|
||||||
|
|
@ -376,75 +538,9 @@ impl Window {
|
||||||
.into()
|
.into()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn view_desktop_root(&self) -> Element<Message> {
|
|
||||||
//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<Message> {
|
|
||||||
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<Message> {
|
|
||||||
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<Message> {
|
fn view_desktop_options(&self) -> Element<Message> {
|
||||||
settings::view_column(vec![
|
settings::view_column(vec![
|
||||||
self.desktop_parent_button(DesktopPage::DesktopOptions),
|
self.parent_page_button(DesktopPage::DesktopOptions),
|
||||||
|
|
||||||
settings::view_section("Super Key Action")
|
settings::view_section("Super Key Action")
|
||||||
.add(settings::item("TODO", horizontal_space(Length::Fill)))
|
.add(settings::item("TODO", horizontal_space(Length::Fill)))
|
||||||
|
|
@ -575,10 +671,10 @@ impl Application for Window {
|
||||||
let mut sidebar = container(scrollable(column!(
|
let mut sidebar = container(scrollable(column!(
|
||||||
sidebar_button(Page::Demo),
|
sidebar_button(Page::Demo),
|
||||||
sidebar_button(Page::WiFi),
|
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(Page::Bluetooth),
|
||||||
sidebar_button_complex(Page::Desktop(None), matches!(self.page, Page::Desktop(_))),
|
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::Displays),
|
||||||
sidebar_button(Page::PowerAndBattery),
|
sidebar_button(Page::PowerAndBattery),
|
||||||
sidebar_button(Page::Sound),
|
sidebar_button(Page::Sound),
|
||||||
|
|
@ -605,15 +701,54 @@ impl Application for Window {
|
||||||
if ! (condensed && sidebar_toggled) {
|
if ! (condensed && sidebar_toggled) {
|
||||||
let content: Element<_> = match self.page {
|
let content: Element<_> = match self.page {
|
||||||
Page::Demo => self.view_demo(),
|
Page::Demo => self.view_demo(),
|
||||||
Page::Desktop(None) => self.view_desktop_root(),
|
Page::Networking(None) => settings::view_column(vec![
|
||||||
Page::Desktop(Some(desktop_page)) => self.view_desktop_page(desktop_page),
|
self.page_title(self.page),
|
||||||
_ => settings::view_column(vec![
|
column!(
|
||||||
row!(
|
self.sub_page_button(NetworkingPage::Wired),
|
||||||
text(self.page.title()).size(30),
|
self.sub_page_button(NetworkingPage::OnlineAccounts),
|
||||||
horizontal_space(Length::Fill),
|
).spacing(16).into()
|
||||||
).into(),
|
|
||||||
text("Unimplemented page").into(),
|
|
||||||
]).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(
|
widgets.push(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue