From a3eb0e6ae2ac80d7a9b44a6f341edf1d1ed7b8aa Mon Sep 17 00:00:00 2001 From: Hannes Kuchelmeister Date: Sun, 10 Apr 2022 22:09:30 +0200 Subject: [PATCH] add app dialogue concept --- src/main.rs | 70 ++++ src/ui/app/messages.rs | 1 + src/ui/app/model.rs | 2 +- src/ui/app/toolbox_list.rs | 3 + src/ui/app/update.rs | 11 +- src/ui/app/widgets.rs | 20 +- src/ui/components/mod.rs | 14 + src/ui/components/toolbox_apps/messages.rs | 4 + src/ui/components/toolbox_apps/mod.rs | 4 + src/ui/components/toolbox_apps/model.rs | 14 + src/ui/components/toolbox_apps/update.rs | 24 ++ src/ui/components/toolbox_apps/widgets.rs | 391 ++++++++++++++++++++ src/ui/components/toolbox_settings/model.rs | 9 +- 13 files changed, 547 insertions(+), 20 deletions(-) create mode 100644 src/ui/components/toolbox_apps/messages.rs create mode 100644 src/ui/components/toolbox_apps/mod.rs create mode 100644 src/ui/components/toolbox_apps/model.rs create mode 100644 src/ui/components/toolbox_apps/update.rs create mode 100644 src/ui/components/toolbox_apps/widgets.rs diff --git a/src/main.rs b/src/main.rs index f6f4433..2e605dc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -22,6 +22,76 @@ fn main() { status: ToolboxStatus::Stopped, update_available: true, }); + factory_vec.push(ToolboxContainer { + name: "Rust".to_string(), + status: ToolboxStatus::Stopped, + update_available: true, + }); + factory_vec.push(ToolboxContainer { + name: "Rust".to_string(), + status: ToolboxStatus::Stopped, + update_available: true, + }); + factory_vec.push(ToolboxContainer { + name: "Rust".to_string(), + status: ToolboxStatus::Stopped, + update_available: true, + }); + factory_vec.push(ToolboxContainer { + name: "Rust".to_string(), + status: ToolboxStatus::Stopped, + update_available: true, + }); + factory_vec.push(ToolboxContainer { + name: "Rust".to_string(), + status: ToolboxStatus::Stopped, + update_available: true, + }); + factory_vec.push(ToolboxContainer { + name: "Rust".to_string(), + status: ToolboxStatus::Stopped, + update_available: true, + }); + factory_vec.push(ToolboxContainer { + name: "Rust".to_string(), + status: ToolboxStatus::Stopped, + update_available: true, + }); + factory_vec.push(ToolboxContainer { + name: "Rust".to_string(), + status: ToolboxStatus::Stopped, + update_available: true, + }); + factory_vec.push(ToolboxContainer { + name: "Rust".to_string(), + status: ToolboxStatus::Stopped, + update_available: true, + }); + factory_vec.push(ToolboxContainer { + name: "Rust".to_string(), + status: ToolboxStatus::Stopped, + update_available: true, + }); + factory_vec.push(ToolboxContainer { + name: "Rust".to_string(), + status: ToolboxStatus::Stopped, + update_available: true, + }); + factory_vec.push(ToolboxContainer { + name: "Rust".to_string(), + status: ToolboxStatus::Stopped, + update_available: true, + }); + factory_vec.push(ToolboxContainer { + name: "Rust".to_string(), + status: ToolboxStatus::Stopped, + update_available: true, + }); + factory_vec.push(ToolboxContainer { + name: "Rust".to_string(), + status: ToolboxStatus::Stopped, + update_available: true, + }); let model = AppModel { toolboxes: factory_vec, diff --git a/src/ui/app/messages.rs b/src/ui/app/messages.rs index be93fee..6a3784c 100644 --- a/src/ui/app/messages.rs +++ b/src/ui/app/messages.rs @@ -1,3 +1,4 @@ pub enum AppMsg { ShowToolboxSettingsRequest, + ShowToolboxAppsRequest, } diff --git a/src/ui/app/model.rs b/src/ui/app/model.rs index e625f03..14c6886 100644 --- a/src/ui/app/model.rs +++ b/src/ui/app/model.rs @@ -1,6 +1,6 @@ use relm4::{factory::FactoryVec, Model}; -use crate::ui::components::toolbox_settings::model::AppComponents; +use crate::ui::components::AppComponents; use super::{messages::AppMsg, widgets::AppWidgets}; diff --git a/src/ui/app/toolbox_list.rs b/src/ui/app/toolbox_list.rs index b1eaa5f..63b51a4 100644 --- a/src/ui/app/toolbox_list.rs +++ b/src/ui/app/toolbox_list.rs @@ -43,6 +43,9 @@ impl FactoryPrototype for ToolboxContainer { set_margin_bottom: 10, set_tooltip_text: Some(APP_TOOLTIP), set_css_classes: &["flat"], + connect_clicked(sender) => move |btn| { + send!(sender, AppMsg::ShowToolboxAppsRequest); + }, }, append = >k::Button::from_icon_name(TERMINAL_ICON) { set_margin_start: 10, diff --git a/src/ui/app/update.rs b/src/ui/app/update.rs index b6e7093..e289fa2 100644 --- a/src/ui/app/update.rs +++ b/src/ui/app/update.rs @@ -1,8 +1,8 @@ use relm4::{AppUpdate, Sender}; -use crate::ui::components::toolbox_settings::{ - messages::ToolboxSettingsDialogMsg, model::AppComponents, -}; +use crate::ui::components::{toolbox_settings::{ + messages::ToolboxSettingsDialogMsg, +}, toolbox_apps::messages::ToolboxAppDialogMsg, AppComponents}; use super::{messages::AppMsg, model::AppModel}; @@ -14,6 +14,11 @@ impl AppUpdate for AppModel { .toolbox_settings_dialog .send(ToolboxSettingsDialogMsg::Show) .unwrap(); + }, + AppMsg::ShowToolboxAppsRequest => { + components.toolbox_apps_dialog + .send(ToolboxAppDialogMsg::Show) + .unwrap(); } } true diff --git a/src/ui/app/widgets.rs b/src/ui/app/widgets.rs index 5122284..d33001d 100644 --- a/src/ui/app/widgets.rs +++ b/src/ui/app/widgets.rs @@ -16,24 +16,26 @@ impl Widgets for AppWidgets { main_window = adw::ApplicationWindow { set_default_width: 800, set_default_height: 600, - - set_content: main_box = Some(>k::Box) { + 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) + append = >k::ScrolledWindow { + set_hexpand: true, + set_vexpand: true, + set_child = Some(>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 index 56d1169..7c0aa91 100644 --- a/src/ui/components/mod.rs +++ b/src/ui/components/mod.rs @@ -1 +1,15 @@ +use relm4::Sender; +use relm4::RelmComponent; + +use self::{toolbox_settings::model::ToolboxSettingsDialogModel, toolbox_apps::model::ToolboxAppDialogModel}; + +use super::app::model::AppModel; + pub mod toolbox_settings; +pub mod toolbox_apps; + +#[derive(relm4::Components)] +pub struct AppComponents { + pub toolbox_settings_dialog: RelmComponent, + pub toolbox_apps_dialog: RelmComponent, +} \ No newline at end of file diff --git a/src/ui/components/toolbox_apps/messages.rs b/src/ui/components/toolbox_apps/messages.rs new file mode 100644 index 0000000..e751028 --- /dev/null +++ b/src/ui/components/toolbox_apps/messages.rs @@ -0,0 +1,4 @@ +pub enum ToolboxAppDialogMsg { + Show, + Close, +} diff --git a/src/ui/components/toolbox_apps/mod.rs b/src/ui/components/toolbox_apps/mod.rs new file mode 100644 index 0000000..a48f622 --- /dev/null +++ b/src/ui/components/toolbox_apps/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_apps/model.rs b/src/ui/components/toolbox_apps/model.rs new file mode 100644 index 0000000..e29bfb8 --- /dev/null +++ b/src/ui/components/toolbox_apps/model.rs @@ -0,0 +1,14 @@ +use relm4::{Model}; + + +use super::{messages::ToolboxAppDialogMsg, widgets::ToolboxAppDialogWidgets}; + +pub struct ToolboxAppDialogModel { + pub hidden: bool, +} + +impl Model for ToolboxAppDialogModel { + type Msg = ToolboxAppDialogMsg; + type Widgets = ToolboxAppDialogWidgets; + type Components = (); +} diff --git a/src/ui/components/toolbox_apps/update.rs b/src/ui/components/toolbox_apps/update.rs new file mode 100644 index 0000000..71a626f --- /dev/null +++ b/src/ui/components/toolbox_apps/update.rs @@ -0,0 +1,24 @@ +use relm4::{ComponentUpdate, Sender}; + +use crate::ui::app::{messages::AppMsg, model::AppModel}; + +use super::{messages::ToolboxAppDialogMsg, model::ToolboxAppDialogModel}; + +impl ComponentUpdate for ToolboxAppDialogModel { + fn init_model(_parent_model: &AppModel) -> Self { + ToolboxAppDialogModel { hidden: true } + } + + fn update( + &mut self, + msg: ToolboxAppDialogMsg, + _components: &(), + _sender: Sender, + parent_sender: Sender, + ) { + match msg { + ToolboxAppDialogMsg::Show => self.hidden = false, + ToolboxAppDialogMsg::Close => self.hidden = true, + } + } +} diff --git a/src/ui/components/toolbox_apps/widgets.rs b/src/ui/components/toolbox_apps/widgets.rs new file mode 100644 index 0000000..2a646eb --- /dev/null +++ b/src/ui/components/toolbox_apps/widgets.rs @@ -0,0 +1,391 @@ +use std::cell::Cell; + + +use gtk::Orientation; +use gtk::PolicyType; +use relm4::adw; +use relm4::adw::prelude::BoxExt; +use relm4::adw::prelude::GtkWindowExt; +use relm4::adw::prelude::WidgetExt; +use relm4::adw::traits::PreferencesGroupExt; +use relm4::adw::traits::PreferencesPageExt; +use relm4::adw::traits::PreferencesWindowExt; +use relm4::gtk; +use relm4::send; +use relm4::WidgetPlus; +use relm4::Widgets; +use gtk::glib; + +use gtk::prelude::*; + + + +use crate::ui::app::model::AppModel; +use crate::ui::components::toolbox_apps::messages::ToolboxAppDialogMsg; + +use super::model::ToolboxAppDialogModel; + + + +#[relm4::widget(pub)] +impl Widgets for ToolboxAppDialogWidgets { + view! { + adw::PreferencesWindow { + set_title: Some("Applications: "), + set_transient_for: parent!{Some(&parent_widgets.main_window)}, + set_modal: true, + set_search_enabled: false, + set_visible: watch!(!model.hidden), + connect_close_request(sender) => move |_| { + send!(sender, ToolboxAppDialogMsg::Close); + gtk::Inhibit(true) + }, + add = &adw::PreferencesPage { + set_hexpand: true, + set_vexpand: false, + add = &adw::PreferencesGroup { + add = >k::ScrolledWindow { + set_hscrollbar_policy: PolicyType::Never, + set_hexpand: false, + set_vexpand: true, + set_child = Some(>k::FlowBox) { + set_halign: gtk::Align::Fill, + set_valign: gtk::Align::Start, + set_selection_mode: gtk::SelectionMode::None, + set_margin_all: 5, + set_column_spacing: 5, + set_row_spacing: 5, + set_orientation: Orientation::Horizontal, + insert(1) = >k::Box { + set_css_classes: &[&"card"], + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_orientation: Orientation::Vertical, + set_hexpand: false, + set_vexpand: false, + set_width_request: 100, + set_height_request: 100, + + append = >k::Switch { + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_hexpand: false, + set_vexpand: false, + set_margin_all: 10, + }, + append = >k::Button { + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_width_request: 64, + set_height_request: 64, + set_margin_start: 36, + set_margin_end: 36, + set_hexpand: false, + set_vexpand: false, + }, + append = >k::Label { + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_text: "Firefox", + set_margin_all: 5, + set_hexpand: false, + set_vexpand: false, + } + }, + + insert(1) = >k::Box { + set_css_classes: &[&"card"], + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_orientation: Orientation::Vertical, + set_hexpand: false, + set_vexpand: false, + set_width_request: 100, + set_height_request: 100, + + append = >k::Switch { + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_hexpand: false, + set_vexpand: false, + set_margin_all: 10, + }, + append = >k::Button { + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_width_request: 64, + set_height_request: 64, + set_margin_start: 36, + set_margin_end: 36, + set_hexpand: false, + set_vexpand: false, + }, + append = >k::Label { + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_text: "Firefox", + set_margin_all: 5, + set_hexpand: false, + set_vexpand: false, + } + }, + insert(1) = >k::Box { + set_css_classes: &[&"card"], + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_orientation: Orientation::Vertical, + set_hexpand: false, + set_vexpand: false, + set_width_request: 100, + set_height_request: 100, + + append = >k::Switch { + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_hexpand: false, + set_vexpand: false, + set_margin_all: 10, + }, + append = >k::Button { + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_width_request: 64, + set_height_request: 64, + set_margin_start: 36, + set_margin_end: 36, + set_hexpand: false, + set_vexpand: false, + }, + append = >k::Label { + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_text: "Firefox", + set_margin_all: 5, + set_hexpand: false, + set_vexpand: false, + } + }, + insert(1) = >k::Box { + set_css_classes: &[&"card"], + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_orientation: Orientation::Vertical, + set_hexpand: false, + set_vexpand: false, + set_width_request: 100, + set_height_request: 100, + + append = >k::Switch { + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_hexpand: false, + set_vexpand: false, + set_margin_all: 10, + }, + append = >k::Button { + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_width_request: 64, + set_height_request: 64, + set_margin_start: 36, + set_margin_end: 36, + set_hexpand: false, + set_vexpand: false, + }, + append = >k::Label { + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_text: "Firefox", + set_margin_all: 5, + set_hexpand: false, + set_vexpand: false, + } + }, + insert(1) = >k::Box { + set_css_classes: &[&"card"], + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_orientation: Orientation::Vertical, + set_hexpand: false, + set_vexpand: false, + set_width_request: 100, + set_height_request: 100, + + append = >k::Switch { + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_hexpand: false, + set_vexpand: false, + set_margin_all: 10, + }, + append = >k::Button { + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_width_request: 64, + set_height_request: 64, + set_margin_start: 36, + set_margin_end: 36, + set_hexpand: false, + set_vexpand: false, + }, + append = >k::Label { + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_text: "Firefox", + set_margin_all: 5, + set_hexpand: false, + set_vexpand: false, + } + }, + insert(1) = >k::Box { + set_css_classes: &[&"card"], + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_orientation: Orientation::Vertical, + set_hexpand: false, + set_vexpand: false, + set_width_request: 100, + set_height_request: 100, + + append = >k::Switch { + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_hexpand: false, + set_vexpand: false, + set_margin_all: 10, + }, + append = >k::Button { + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_width_request: 64, + set_height_request: 64, + set_margin_start: 36, + set_margin_end: 36, + set_hexpand: false, + set_vexpand: false, + }, + append = >k::Label { + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_text: "Firefox", + set_margin_all: 5, + set_hexpand: false, + set_vexpand: false, + } + }, + insert(1) = >k::Box { + set_css_classes: &[&"card"], + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_orientation: Orientation::Vertical, + set_hexpand: false, + set_vexpand: false, + set_width_request: 100, + set_height_request: 100, + + append = >k::Switch { + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_hexpand: false, + set_vexpand: false, + set_margin_all: 10, + }, + append = >k::Button { + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_width_request: 64, + set_height_request: 64, + set_margin_start: 36, + set_margin_end: 36, + set_hexpand: false, + set_vexpand: false, + }, + append = >k::Label { + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_text: "Firefox", + set_margin_all: 5, + set_hexpand: false, + set_vexpand: false, + } + }, + insert(1) = >k::Box { + set_css_classes: &[&"card"], + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_orientation: Orientation::Vertical, + set_hexpand: false, + set_vexpand: false, + set_width_request: 100, + set_height_request: 100, + + append = >k::Switch { + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_hexpand: false, + set_vexpand: false, + set_margin_all: 10, + }, + append = >k::Button { + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_width_request: 64, + set_height_request: 64, + set_margin_start: 36, + set_margin_end: 36, + set_hexpand: false, + set_vexpand: false, + }, + append = >k::Label { + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_text: "Firefox", + set_margin_all: 5, + set_hexpand: false, + set_vexpand: false, + } + }, + insert(1) = >k::Box { + set_css_classes: &[&"card"], + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_orientation: Orientation::Vertical, + set_hexpand: false, + set_vexpand: false, + set_width_request: 100, + set_height_request: 100, + + append = >k::Switch { + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_hexpand: false, + set_vexpand: false, + set_margin_all: 10, + }, + append = >k::Button { + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_width_request: 64, + set_height_request: 64, + set_margin_start: 36, + set_margin_end: 36, + set_hexpand: false, + set_vexpand: false, + }, + append = >k::Label { + set_halign: gtk::Align::Center, + set_valign: gtk::Align::Center, + set_text: "Firefox", + set_margin_all: 5, + set_hexpand: false, + set_vexpand: false, + } + }, + } + } + + } + } + } + } +} diff --git a/src/ui/components/toolbox_settings/model.rs b/src/ui/components/toolbox_settings/model.rs index 456adec..2927fb6 100644 --- a/src/ui/components/toolbox_settings/model.rs +++ b/src/ui/components/toolbox_settings/model.rs @@ -1,14 +1,9 @@ -use relm4::Sender; -use relm4::{Model, RelmComponent}; +use relm4::{Model}; -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, }