From 0648ec2dce64ede0184e4651f32eb1cae2ceea72 Mon Sep 17 00:00:00 2001 From: Hannes Kuchelmeister Date: Mon, 18 Apr 2022 12:02:33 +0200 Subject: [PATCH] implement factory for toolbox_apps --- src/ui/components/toolbox_apps/factory.rs | 82 ++++++ src/ui/components/toolbox_apps/mod.rs | 1 + src/ui/components/toolbox_apps/model.rs | 11 +- src/ui/components/toolbox_apps/update.rs | 27 +- src/ui/components/toolbox_apps/widgets.rs | 336 +--------------------- 5 files changed, 122 insertions(+), 335 deletions(-) create mode 100644 src/ui/components/toolbox_apps/factory.rs diff --git a/src/ui/components/toolbox_apps/factory.rs b/src/ui/components/toolbox_apps/factory.rs new file mode 100644 index 0000000..a4cc3a6 --- /dev/null +++ b/src/ui/components/toolbox_apps/factory.rs @@ -0,0 +1,82 @@ +use relm4::{ + adw::prelude::{BoxExt, OrientableExt, WidgetExt}, + factory::{FactoryPrototype, FactoryVec}, + gtk::{self, Orientation}, + view, Sender, WidgetPlus, +}; + +use super::{ + messages::ToolboxAppDialogMsg, model::DotDesktopApplication, widgets::AppFactoryWidgets, +}; + +impl FactoryPrototype for DotDesktopApplication { + type Factory = FactoryVec; + type Widgets = AppFactoryWidgets; + type Root = gtk::Box; + type View = gtk::FlowBox; + type Msg = ToolboxAppDialogMsg; + + fn init_view( + &self, + key: &>::Key, + sender: Sender, + ) -> Self::Widgets { + view! { + app_box = >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, + set_active: self.selected, + }, + append = >k::Image::from_file(&self.icon_path) { + 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: &self.name, + set_margin_all: 5, + set_hexpand: false, + set_vexpand: false, + } + } + } + AppFactoryWidgets { app_box } + } + + fn position( + &self, + key: &>::Key, + ) -> >::Position { + } + + fn view( + &self, + key: &>::Key, + widgets: &Self::Widgets, + ) { + } + + fn root_widget(widgets: &Self::Widgets) -> &Self::Root { + &widgets.app_box + } +} diff --git a/src/ui/components/toolbox_apps/mod.rs b/src/ui/components/toolbox_apps/mod.rs index a48f622..888ab79 100644 --- a/src/ui/components/toolbox_apps/mod.rs +++ b/src/ui/components/toolbox_apps/mod.rs @@ -2,3 +2,4 @@ pub mod messages; pub mod model; pub mod update; pub mod widgets; +pub mod factory; diff --git a/src/ui/components/toolbox_apps/model.rs b/src/ui/components/toolbox_apps/model.rs index e29bfb8..0ae936a 100644 --- a/src/ui/components/toolbox_apps/model.rs +++ b/src/ui/components/toolbox_apps/model.rs @@ -1,10 +1,17 @@ -use relm4::{Model}; +use relm4::{Model, factory::{FactoryVec}}; -use super::{messages::ToolboxAppDialogMsg, widgets::ToolboxAppDialogWidgets}; +use super::{messages::ToolboxAppDialogMsg, widgets::{ToolboxAppDialogWidgets}}; +#[derive(Default)] +pub struct DotDesktopApplication { + pub name: String, + pub selected: bool, + pub icon_path: String, +} pub struct ToolboxAppDialogModel { pub hidden: bool, + pub apps: FactoryVec, } impl Model for ToolboxAppDialogModel { diff --git a/src/ui/components/toolbox_apps/update.rs b/src/ui/components/toolbox_apps/update.rs index 71a626f..8cf46ea 100644 --- a/src/ui/components/toolbox_apps/update.rs +++ b/src/ui/components/toolbox_apps/update.rs @@ -1,12 +1,33 @@ -use relm4::{ComponentUpdate, Sender}; +use relm4::{ComponentUpdate, Sender, factory::FactoryVec}; use crate::ui::app::{messages::AppMsg, model::AppModel}; -use super::{messages::ToolboxAppDialogMsg, model::ToolboxAppDialogModel}; +use super::{messages::ToolboxAppDialogMsg, model::{ToolboxAppDialogModel, DotDesktopApplication}}; impl ComponentUpdate for ToolboxAppDialogModel { fn init_model(_parent_model: &AppModel) -> Self { - ToolboxAppDialogModel { hidden: true } + let mut factory_vec = FactoryVec::new(); + factory_vec.push(DotDesktopApplication { + name: "Firefox".to_string(), + selected: true, + icon_path: "".to_string(), + }); + factory_vec.push(DotDesktopApplication { + name: "Firefox".to_string(), + selected: false, + icon_path: "".to_string(), + }); + factory_vec.push(DotDesktopApplication { + name: "Firefox".to_string(), + selected: true, + icon_path: "".to_string(), + }); + factory_vec.push(DotDesktopApplication { + name: "Firefox".to_string(), + selected: false, + icon_path: "".to_string(), + }); + ToolboxAppDialogModel { hidden: true, apps: factory_vec } } fn update( diff --git a/src/ui/components/toolbox_apps/widgets.rs b/src/ui/components/toolbox_apps/widgets.rs index 2a646eb..6ebeed1 100644 --- a/src/ui/components/toolbox_apps/widgets.rs +++ b/src/ui/components/toolbox_apps/widgets.rs @@ -1,10 +1,6 @@ -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; @@ -14,7 +10,6 @@ use relm4::gtk; use relm4::send; use relm4::WidgetPlus; use relm4::Widgets; -use gtk::glib; use gtk::prelude::*; @@ -25,6 +20,11 @@ use crate::ui::components::toolbox_apps::messages::ToolboxAppDialogMsg; use super::model::ToolboxAppDialogModel; +#[derive(Debug)] +pub struct AppFactoryWidgets { + pub app_box: gtk::Box, +} + #[relm4::widget(pub)] @@ -56,331 +56,7 @@ impl Widgets for ToolboxAppDialogWidgets { 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, - } - }, + factory!(model.apps), } }