From 410e41a0abcac62d3e762ff159d5e8df3cb59d09 Mon Sep 17 00:00:00 2001 From: Hannes Kuchelmeister Date: Sun, 3 Apr 2022 20:44:41 +0200 Subject: [PATCH] refactor into separate files for app structure --- src/main.rs | 353 ++---------------- src/ui/app/messages.rs | 3 + src/ui/app/mod.rs | 5 + src/ui/app/model.rs | 31 ++ src/ui/app/toolbox_list.rs | 131 +++++++ src/ui/app/update.rs | 21 ++ src/ui/app/widgets.rs | 39 ++ src/ui/components/mod.rs | 1 + .../components/toolbox_settings/messages.rs | 4 + src/ui/components/toolbox_settings/mod.rs | 4 + src/ui/components/toolbox_settings/model.rs | 20 + src/ui/components/toolbox_settings/update.rs | 24 ++ src/ui/components/toolbox_settings/widgets.rs | 89 +++++ src/ui/mod.rs | 3 + src/ui/ui_strings.rs | 20 + 15 files changed, 417 insertions(+), 331 deletions(-) create mode 100644 src/ui/app/messages.rs create mode 100644 src/ui/app/mod.rs create mode 100644 src/ui/app/model.rs create mode 100644 src/ui/app/toolbox_list.rs create mode 100644 src/ui/app/update.rs create mode 100644 src/ui/app/widgets.rs create mode 100644 src/ui/components/mod.rs create mode 100644 src/ui/components/toolbox_settings/messages.rs create mode 100644 src/ui/components/toolbox_settings/mod.rs create mode 100644 src/ui/components/toolbox_settings/model.rs create mode 100644 src/ui/components/toolbox_settings/update.rs create mode 100644 src/ui/components/toolbox_settings/widgets.rs create mode 100644 src/ui/mod.rs create mode 100644 src/ui/ui_strings.rs diff --git a/src/main.rs b/src/main.rs index e1cd34d..f6f4433 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,339 +1,30 @@ -use adw::prelude::AdwApplicationWindowExt; -use gtk::prelude::{BoxExt, GtkWindowExt, OrientableExt}; -use relm4::{adw::{self, traits::{PreferencesRowExt, ActionRowExt, AdwWindowExt, PreferencesPageExt, PreferencesWindowExt, PreferencesGroupExt}, prelude::{WidgetExt, ButtonExt, ListBoxRowExt}}, gtk::{self, SelectionMode}, AppUpdate, Model, RelmApp, Sender, WidgetPlus, Widgets, factory::{FactoryVec, FactoryPrototype}, view, RelmComponent, Components, send, ComponentUpdate}; +use relm4::{factory::FactoryVec, RelmApp}; +use ui::app::{ + model::{AppModel, ToolboxStatus, ToolboxContainer}, +}; -const START_ICON : &str = r#"media-playback-start-symbolic"#; -const START_TOOLTIP : &str = r#"Start toolbox"#; - -const SHUTDOWN_ICON : &str = r#"system-shutdown-symbolic"#; -const SHUTDOWN_TOOLTIP : &str = r#"Stop toolbox"#; - -const UPDATE_ICON : &str = r#"software-update-available-symbolic"#; -const UPDATE_TOOLTIP : &str = r#"Update all applications inside of the toolbox"#; - -const APP_ICON : &str = r#"view-grid-symbolic"#; -const APP_TOOLTIP : &str = r#"Select applications to showup in the application menu"#; - -const TERMINAL_ICON : &str = r#"utilities-terminal-symbolic"#; -const TERMINAL_TOOLTIP : &str = r#"Open terminal inside of toolbox"#; - -const SETTINGS_ICON : &str = r#"applications-system-symbolic"#; -const SETTINGS_TOOLTIP : &str = r#"Open toolbox settings"#; - -const FOLDER_PICKER_ICON : &str = r#"folder-open-symbolic"#; -const FOLDER_PICKER_TOOLTIP : &str = r#"Select folder dialogue"#; - -struct AppModel { - toolboxes: FactoryVec -} - -#[derive(Debug)] -enum AppMode { -} -enum AppMsg { - ShowToolboxSettingsRequest, -} - -// Components (Book) - -#[relm4::widget] -impl Widgets for ToolboxSettingsDialogWidgets { - view! { - adw::PreferencesWindow { - set_title: Some("Preferences: "), - set_transient_for: parent!{Some(&parent_widgets.main_window)}, - set_modal: true, - set_visible: watch!(!model.hidden), - connect_close_request(sender) => move |_| { - send!(sender, ToolboxSettingsDialogMsg::Close); - gtk::Inhibit(true) - }, - add = &adw::PreferencesPage { - add = &adw::PreferencesGroup { - set_title: "Updates", - add = &adw::PreferencesRow { - set_title: "Update Policy", - set_child = Some(&adw::ActionRow) { - set_title: "Update Policy", - add_suffix = >k::Box { - append = >k::DropDown::from_strings(&[ - "Update automatically", - "Notify about updates", - "Do nothing" - ]) { - set_margin_all: 15, - }, - } - }, - }, - }, - add = &adw::PreferencesGroup { - set_title: "Home Folder", - add = &adw::PreferencesRow { - set_title: "Seperate Home Folder", - set_child = Some(&adw::ActionRow) { - set_title: "Use separate home folder", - add_suffix = >k::Box { - append = >k::Switch { - set_margin_all: 15, - set_tooltip_text: Some("Use separate home folder"), - }, - } - }, - }, - add = &adw::PreferencesRow { - set_title: "Home Folder Path", - set_child = Some(&adw::ActionRow) { - set_title: "Home folder path", - add_suffix = >k::Box { - set_margin_all: 15, - add_css_class: "linked", - append = >k::Entry { - set_hexpand: true, - }, - append = >k::Button::from_icon_name(FOLDER_PICKER_ICON) { - set_tooltip_text: Some(FOLDER_PICKER_TOOLTIP), - } - } - }, - }, - - } - } - } - } -} - -struct ToolboxSettingsDialogModel { - hidden: bool, -} -enum ToolboxSettingsDialogMsg { - Show, - Close, -} - -impl Model for ToolboxSettingsDialogModel { - type Msg = ToolboxSettingsDialogMsg; - type Widgets = ToolboxSettingsDialogWidgets; - type Components = (); -} -impl ComponentUpdate for ToolboxSettingsDialogModel { - fn init_model(_parent_model: &AppModel) -> Self { - ToolboxSettingsDialogModel { hidden: true } - } - - fn update( - &mut self, - msg: ToolboxSettingsDialogMsg, - _components: &(), - _sender: Sender, - parent_sender: Sender, - ) { - match msg { - ToolboxSettingsDialogMsg::Show => self.hidden = false, - ToolboxSettingsDialogMsg::Close => self.hidden = true, - } - } -} - - -#[derive(relm4::Components)] -struct AppComponents { - dialog: RelmComponent, -} - -// \Components - - - - -impl Model for AppModel { - type Msg = AppMsg; - type Widgets = AppWidgets; - type Components = AppComponents; -} - -impl AppUpdate for AppModel { - fn update(&mut self, msg: AppMsg, components: &AppComponents, _sender: Sender) -> bool { - match msg { - AppMsg::ShowToolboxSettingsRequest => { - components.dialog.send(ToolboxSettingsDialogMsg::Show).unwrap(); - } - } - true - } -} - -#[relm4::widget] -impl Widgets for AppWidgets { - view! { - main_window = adw::ApplicationWindow { - set_default_width: 800, - set_default_height: 600, - - set_content: main_box = Some(>k::Box) { - set_orientation: gtk::Orientation::Vertical, - - append = &adw::HeaderBar { - set_title_widget = Some(>k::Label) { - set_label: "Toolbox Tuner", - } - }, - - append = >k::ListBox { - set_selection_mode: SelectionMode::None, - set_margin_all: 30, - set_css_classes: &["boxed-list"], - factory!(model.toolboxes) - } - - }, - } - } -} - -// FACTORY -enum ToolboxStatus { - Stopped, - Running, -} - -impl Default for ToolboxStatus { - fn default() -> Self { - ToolboxStatus::Stopped - } -} - -#[derive(Default)] -struct ToolboxContainer{ - name: String, - status: ToolboxStatus, - update_available: bool, -} - -#[derive(Debug)] -struct FactoryWidgets { - action_row: adw::ActionRow, -} - -impl FactoryPrototype for ToolboxContainer { - type Factory = FactoryVec; - type Widgets = FactoryWidgets; - type Root = adw::ActionRow; - type View = gtk::ListBox; - type Msg = AppMsg; - - fn init_view( - &self, - key: &>::Key, - sender: Sender, - ) -> Self::Widgets { - - view!{ - suffix_box = >k::Box{ - append = >k::Button::from_icon_name(APP_ICON) { - set_margin_start: 10, - set_margin_top: 10, - set_margin_bottom: 10, - set_tooltip_text: Some(APP_TOOLTIP), - set_css_classes: &["flat"], - }, - append = >k::Button::from_icon_name(TERMINAL_ICON) { - set_margin_start: 10, - set_margin_top: 10, - set_margin_bottom: 10, - set_tooltip_text: Some(TERMINAL_TOOLTIP), - set_css_classes: &["flat"], - }, - append = >k::Button::from_icon_name(SETTINGS_ICON) { - set_margin_start: 10,set_margin_start: 10, - set_margin_top: 10, - set_margin_bottom: 10, - set_tooltip_text: Some(SETTINGS_TOOLTIP), - set_css_classes: &["circular"], - connect_clicked(sender) => move |btn| { - send!(sender, AppMsg::ShowToolboxSettingsRequest); - }, - }, - } - }; - - if self.update_available { - view!{ - update_button = >k::Button::from_icon_name(UPDATE_ICON) { - set_margin_top: 10, - set_margin_bottom: 10, - set_margin_end: 10, - set_tooltip_text: Some(UPDATE_TOOLTIP), - set_css_classes: &["suggested-action"], - } - }; - suffix_box.prepend(&update_button); - } - - - let is_on = true; - - let mut status_button_tooltip = START_TOOLTIP; - let mut status_button_icon = START_ICON; - - match &self.status { - &ToolboxStatus::Running => { - status_button_tooltip = SHUTDOWN_TOOLTIP; - status_button_icon = SHUTDOWN_ICON; - }, - &ToolboxStatus::Stopped => { - status_button_tooltip = START_TOOLTIP; - status_button_icon = START_ICON; - } - } - - view! { - action_row = &adw::ActionRow { - set_title: &self.name, - set_subtitle: "additional information", - add_prefix = >k::Box { - append = >k::Button::from_icon_name(status_button_icon) { - set_margin_top: 10, - set_margin_bottom: 10, - set_tooltip_text: Some(status_button_tooltip), - set_css_classes: &["circular"], - }, - }, - add_suffix: &suffix_box, - } - }; - FactoryWidgets { action_row } - } - - fn view( - &self, - key: &>::Key, - widgets: &Self::Widgets, - ) { - //widgets.action_row.set_label(&self.name.to_string()); - } - - fn root_widget(widgets: &Self::Widgets) -> &Self::Root { - &widgets.action_row - } - - fn position( - &self, - key: &>::Key, - ) -> >::Position { } -} - -// END_FACTORY +mod ui; fn main() { let mut factory_vec = FactoryVec::new(); - factory_vec.push(ToolboxContainer{name: "fedora-toolbox-35".to_string(), status: ToolboxStatus::Running, update_available: false}); - factory_vec.push(ToolboxContainer{name: "Latex".to_string(), status: ToolboxStatus::Running, update_available: false}); - factory_vec.push(ToolboxContainer{name: "Rust".to_string(), status: ToolboxStatus::Stopped, update_available: true}); - + factory_vec.push(ToolboxContainer { + name: "fedora-toolbox-35".to_string(), + status: ToolboxStatus::Running, + update_available: false, + }); + factory_vec.push(ToolboxContainer { + name: "Latex".to_string(), + status: ToolboxStatus::Running, + update_available: false, + }); + factory_vec.push(ToolboxContainer { + name: "Rust".to_string(), + status: ToolboxStatus::Stopped, + update_available: true, + }); + let model = AppModel { - toolboxes: factory_vec + toolboxes: factory_vec, }; let app = RelmApp::new(model); app.run(); diff --git a/src/ui/app/messages.rs b/src/ui/app/messages.rs new file mode 100644 index 0000000..be93fee --- /dev/null +++ b/src/ui/app/messages.rs @@ -0,0 +1,3 @@ +pub enum AppMsg { + ShowToolboxSettingsRequest, +} diff --git a/src/ui/app/mod.rs b/src/ui/app/mod.rs new file mode 100644 index 0000000..07a1d51 --- /dev/null +++ b/src/ui/app/mod.rs @@ -0,0 +1,5 @@ +pub mod messages; +pub mod model; +pub mod toolbox_list; +pub mod update; +pub mod widgets; diff --git a/src/ui/app/model.rs b/src/ui/app/model.rs new file mode 100644 index 0000000..e625f03 --- /dev/null +++ b/src/ui/app/model.rs @@ -0,0 +1,31 @@ +use relm4::{factory::FactoryVec, Model}; + +use crate::ui::components::toolbox_settings::model::AppComponents; + +use super::{messages::AppMsg, widgets::AppWidgets}; + +pub struct AppModel { + pub toolboxes: FactoryVec, +} + +#[derive(Default)] +pub struct ToolboxContainer { + pub name: String, + pub status: ToolboxStatus, + pub update_available: bool, +} +impl Model for AppModel { + type Msg = AppMsg; + type Widgets = AppWidgets; + type Components = AppComponents; +} + +pub enum ToolboxStatus { + Stopped, + Running, +} +impl Default for ToolboxStatus { + fn default() -> Self { + ToolboxStatus::Stopped + } +} diff --git a/src/ui/app/toolbox_list.rs b/src/ui/app/toolbox_list.rs new file mode 100644 index 0000000..b1eaa5f --- /dev/null +++ b/src/ui/app/toolbox_list.rs @@ -0,0 +1,131 @@ +use relm4::{ + adw::{ + self, + prelude::{BoxExt, ButtonExt, WidgetExt}, + traits::{ActionRowExt, PreferencesRowExt}, + }, + factory::{FactoryPrototype, FactoryVec}, + gtk, send, view, Sender, +}; + +use crate::ui::{ + app::model::ToolboxStatus, + ui_strings::{ + APP_ICON, APP_TOOLTIP, SETTINGS_ICON, SETTINGS_TOOLTIP, SHUTDOWN_ICON, SHUTDOWN_TOOLTIP, + START_ICON, START_TOOLTIP, TERMINAL_ICON, TERMINAL_TOOLTIP, UPDATE_ICON, UPDATE_TOOLTIP, + }, +}; + +use super::{messages::AppMsg, model::ToolboxContainer}; + +#[derive(Debug)] +pub struct FactoryWidgets { + pub action_row: adw::ActionRow, +} + +impl FactoryPrototype for ToolboxContainer { + type Factory = FactoryVec; + type Widgets = FactoryWidgets; + type Root = adw::ActionRow; + type View = gtk::ListBox; + type Msg = AppMsg; + + fn init_view( + &self, + key: &>::Key, + sender: Sender, + ) -> Self::Widgets { + view! { + suffix_box = >k::Box{ + append = >k::Button::from_icon_name(APP_ICON) { + set_margin_start: 10, + set_margin_top: 10, + set_margin_bottom: 10, + set_tooltip_text: Some(APP_TOOLTIP), + set_css_classes: &["flat"], + }, + append = >k::Button::from_icon_name(TERMINAL_ICON) { + set_margin_start: 10, + set_margin_top: 10, + set_margin_bottom: 10, + set_tooltip_text: Some(TERMINAL_TOOLTIP), + set_css_classes: &["flat"], + }, + append = >k::Button::from_icon_name(SETTINGS_ICON) { + set_margin_start: 10,set_margin_start: 10, + set_margin_top: 10, + set_margin_bottom: 10, + set_tooltip_text: Some(SETTINGS_TOOLTIP), + set_css_classes: &["circular"], + connect_clicked(sender) => move |btn| { + send!(sender, AppMsg::ShowToolboxSettingsRequest); + }, + }, + } + }; + + if self.update_available { + view! { + update_button = >k::Button::from_icon_name(UPDATE_ICON) { + set_margin_top: 10, + set_margin_bottom: 10, + set_margin_end: 10, + set_tooltip_text: Some(UPDATE_TOOLTIP), + set_css_classes: &["suggested-action"], + } + }; + suffix_box.prepend(&update_button); + } + + let is_on = true; + + let mut status_button_tooltip = START_TOOLTIP; + let mut status_button_icon = START_ICON; + + match &self.status { + &ToolboxStatus::Running => { + status_button_tooltip = SHUTDOWN_TOOLTIP; + status_button_icon = SHUTDOWN_ICON; + } + &ToolboxStatus::Stopped => { + status_button_tooltip = START_TOOLTIP; + status_button_icon = START_ICON; + } + } + + view! { + action_row = &adw::ActionRow { + set_title: &self.name, + set_subtitle: "additional information", + add_prefix = >k::Box { + append = >k::Button::from_icon_name(status_button_icon) { + set_margin_top: 10, + set_margin_bottom: 10, + set_tooltip_text: Some(status_button_tooltip), + set_css_classes: &["circular"], + }, + }, + add_suffix: &suffix_box, + } + }; + FactoryWidgets { action_row } + } + + fn view( + &self, + key: &>::Key, + widgets: &Self::Widgets, + ) { + //widgets.action_row.set_label(&self.name.to_string()); + } + + fn root_widget(widgets: &Self::Widgets) -> &Self::Root { + &widgets.action_row + } + + fn position( + &self, + key: &>::Key, + ) -> >::Position { + } +} diff --git a/src/ui/app/update.rs b/src/ui/app/update.rs new file mode 100644 index 0000000..b6e7093 --- /dev/null +++ b/src/ui/app/update.rs @@ -0,0 +1,21 @@ +use relm4::{AppUpdate, Sender}; + +use crate::ui::components::toolbox_settings::{ + messages::ToolboxSettingsDialogMsg, model::AppComponents, +}; + +use super::{messages::AppMsg, model::AppModel}; + +impl AppUpdate for AppModel { + fn update(&mut self, msg: AppMsg, components: &AppComponents, _sender: Sender) -> bool { + match msg { + AppMsg::ShowToolboxSettingsRequest => { + components + .toolbox_settings_dialog + .send(ToolboxSettingsDialogMsg::Show) + .unwrap(); + } + } + true + } +} diff --git a/src/ui/app/widgets.rs b/src/ui/app/widgets.rs new file mode 100644 index 0000000..5122284 --- /dev/null +++ b/src/ui/app/widgets.rs @@ -0,0 +1,39 @@ +use relm4::{ + adw::{ + self, + prelude::{BoxExt, GtkWindowExt, OrientableExt, WidgetExt}, + traits::AdwApplicationWindowExt, + }, + gtk::{self, SelectionMode}, + WidgetPlus, Widgets, +}; + +use super::model::AppModel; + +#[relm4::widget(pub)] +impl Widgets for AppWidgets { + view! { + main_window = adw::ApplicationWindow { + set_default_width: 800, + set_default_height: 600, + + set_content: main_box = Some(>k::Box) { + set_orientation: gtk::Orientation::Vertical, + + append = &adw::HeaderBar { + set_title_widget = Some(>k::Label) { + set_label: "Toolbox Tuner", + } + }, + + append = >k::ListBox { + set_selection_mode: SelectionMode::None, + set_margin_all: 30, + set_css_classes: &["boxed-list"], + factory!(model.toolboxes) + } + + }, + } + } +} diff --git a/src/ui/components/mod.rs b/src/ui/components/mod.rs new file mode 100644 index 0000000..56d1169 --- /dev/null +++ b/src/ui/components/mod.rs @@ -0,0 +1 @@ +pub mod toolbox_settings; diff --git a/src/ui/components/toolbox_settings/messages.rs b/src/ui/components/toolbox_settings/messages.rs new file mode 100644 index 0000000..c3555f9 --- /dev/null +++ b/src/ui/components/toolbox_settings/messages.rs @@ -0,0 +1,4 @@ +pub enum ToolboxSettingsDialogMsg { + Show, + Close, +} diff --git a/src/ui/components/toolbox_settings/mod.rs b/src/ui/components/toolbox_settings/mod.rs new file mode 100644 index 0000000..a48f622 --- /dev/null +++ b/src/ui/components/toolbox_settings/mod.rs @@ -0,0 +1,4 @@ +pub mod messages; +pub mod model; +pub mod update; +pub mod widgets; diff --git a/src/ui/components/toolbox_settings/model.rs b/src/ui/components/toolbox_settings/model.rs new file mode 100644 index 0000000..456adec --- /dev/null +++ b/src/ui/components/toolbox_settings/model.rs @@ -0,0 +1,20 @@ +use relm4::Sender; +use relm4::{Model, RelmComponent}; + +use crate::ui::app::model::AppModel; + +use super::{messages::ToolboxSettingsDialogMsg, widgets::ToolboxSettingsDialogWidgets}; + +#[derive(relm4::Components)] +pub struct AppComponents { + pub toolbox_settings_dialog: RelmComponent, +} +pub struct ToolboxSettingsDialogModel { + pub hidden: bool, +} + +impl Model for ToolboxSettingsDialogModel { + type Msg = ToolboxSettingsDialogMsg; + type Widgets = ToolboxSettingsDialogWidgets; + type Components = (); +} diff --git a/src/ui/components/toolbox_settings/update.rs b/src/ui/components/toolbox_settings/update.rs new file mode 100644 index 0000000..4ea78aa --- /dev/null +++ b/src/ui/components/toolbox_settings/update.rs @@ -0,0 +1,24 @@ +use relm4::{ComponentUpdate, Sender}; + +use crate::ui::app::{messages::AppMsg, model::AppModel}; + +use super::{messages::ToolboxSettingsDialogMsg, model::ToolboxSettingsDialogModel}; + +impl ComponentUpdate for ToolboxSettingsDialogModel { + fn init_model(_parent_model: &AppModel) -> Self { + ToolboxSettingsDialogModel { hidden: true } + } + + fn update( + &mut self, + msg: ToolboxSettingsDialogMsg, + _components: &(), + _sender: Sender, + parent_sender: Sender, + ) { + match msg { + ToolboxSettingsDialogMsg::Show => self.hidden = false, + ToolboxSettingsDialogMsg::Close => self.hidden = true, + } + } +} diff --git a/src/ui/components/toolbox_settings/widgets.rs b/src/ui/components/toolbox_settings/widgets.rs new file mode 100644 index 0000000..3ca14ce --- /dev/null +++ b/src/ui/components/toolbox_settings/widgets.rs @@ -0,0 +1,89 @@ +use relm4::adw; +use relm4::adw::prelude::BoxExt; +use relm4::adw::prelude::GtkWindowExt; +use relm4::adw::prelude::ListBoxRowExt; +use relm4::adw::prelude::WidgetExt; +use relm4::adw::traits::ActionRowExt; +use relm4::adw::traits::PreferencesGroupExt; +use relm4::adw::traits::PreferencesPageExt; +use relm4::adw::traits::PreferencesRowExt; +use relm4::adw::traits::PreferencesWindowExt; +use relm4::gtk; +use relm4::send; +use relm4::WidgetPlus; +use relm4::Widgets; + +use crate::ui::app::model::AppModel; +use crate::ui::components::toolbox_settings::messages::ToolboxSettingsDialogMsg; +use crate::ui::ui_strings::FOLDER_PICKER_ICON; +use crate::ui::ui_strings::FOLDER_PICKER_TOOLTIP; + +use super::model::ToolboxSettingsDialogModel; + +#[relm4::widget(pub)] +impl Widgets for ToolboxSettingsDialogWidgets { + view! { + adw::PreferencesWindow { + set_title: Some("Preferences: "), + set_transient_for: parent!{Some(&parent_widgets.main_window)}, + set_modal: true, + set_visible: watch!(!model.hidden), + connect_close_request(sender) => move |_| { + send!(sender, ToolboxSettingsDialogMsg::Close); + gtk::Inhibit(true) + }, + add = &adw::PreferencesPage { + add = &adw::PreferencesGroup { + set_title: "Updates", + add = &adw::PreferencesRow { + set_title: "Update Policy", + set_child = Some(&adw::ActionRow) { + set_title: "Update Policy", + add_suffix = >k::Box { + append = >k::DropDown::from_strings(&[ + "Update automatically", + "Notify about updates", + "Do nothing" + ]) { + set_margin_all: 15, + }, + } + }, + }, + }, + add = &adw::PreferencesGroup { + set_title: "Home Folder", + add = &adw::PreferencesRow { + set_title: "Seperate Home Folder", + set_child = Some(&adw::ActionRow) { + set_title: "Use separate home folder", + add_suffix = >k::Box { + append = >k::Switch { + set_margin_all: 15, + set_tooltip_text: Some("Use separate home folder"), + }, + } + }, + }, + add = &adw::PreferencesRow { + set_title: "Home Folder Path", + set_child = Some(&adw::ActionRow) { + set_title: "Home folder path", + add_suffix = >k::Box { + set_margin_all: 15, + add_css_class: "linked", + append = >k::Entry { + set_hexpand: true, + }, + append = >k::Button::from_icon_name(FOLDER_PICKER_ICON) { + set_tooltip_text: Some(FOLDER_PICKER_TOOLTIP), + } + } + }, + }, + + } + } + } + } +} diff --git a/src/ui/mod.rs b/src/ui/mod.rs new file mode 100644 index 0000000..d47ef01 --- /dev/null +++ b/src/ui/mod.rs @@ -0,0 +1,3 @@ +pub mod app; +pub mod components; +pub mod ui_strings; diff --git a/src/ui/ui_strings.rs b/src/ui/ui_strings.rs new file mode 100644 index 0000000..d98f952 --- /dev/null +++ b/src/ui/ui_strings.rs @@ -0,0 +1,20 @@ +pub const START_ICON: &str = r#"media-playback-start-symbolic"#; +pub const START_TOOLTIP: &str = r#"Start toolbox"#; + +pub const SHUTDOWN_ICON: &str = r#"system-shutdown-symbolic"#; +pub const SHUTDOWN_TOOLTIP: &str = r#"Stop toolbox"#; + +pub const UPDATE_ICON: &str = r#"software-update-available-symbolic"#; +pub const UPDATE_TOOLTIP: &str = r#"Update all applications inside of the toolbox"#; + +pub const APP_ICON: &str = r#"view-grid-symbolic"#; +pub const APP_TOOLTIP: &str = r#"Select applications to showup in the application menu"#; + +pub const TERMINAL_ICON: &str = r#"utilities-terminal-symbolic"#; +pub const TERMINAL_TOOLTIP: &str = r#"Open terminal inside of toolbox"#; + +pub const SETTINGS_ICON: &str = r#"applications-system-symbolic"#; +pub const SETTINGS_TOOLTIP: &str = r#"Open toolbox settings"#; + +pub const FOLDER_PICKER_ICON: &str = r#"folder-open-symbolic"#; +pub const FOLDER_PICKER_TOOLTIP: &str = r#"Select folder dialogue"#;