implement factory for toolbox_apps

This commit is contained in:
2022-04-18 12:02:33 +02:00
parent a3eb0e6ae2
commit 0648ec2dce
5 changed files with 122 additions and 335 deletions

View File

@@ -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<Self>;
type Widgets = AppFactoryWidgets;
type Root = gtk::Box;
type View = gtk::FlowBox;
type Msg = ToolboxAppDialogMsg;
fn init_view(
&self,
key: &<Self::Factory as relm4::factory::Factory<Self, Self::View>>::Key,
sender: Sender<Self::Msg>,
) -> Self::Widgets {
view! {
app_box = &gtk::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 = &gtk::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 = &gtk::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 = &gtk::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: &<Self::Factory as relm4::factory::Factory<Self, Self::View>>::Key,
) -> <Self::View as relm4::factory::FactoryView<Self::Root>>::Position {
}
fn view(
&self,
key: &<Self::Factory as relm4::factory::Factory<Self, Self::View>>::Key,
widgets: &Self::Widgets,
) {
}
fn root_widget(widgets: &Self::Widgets) -> &Self::Root {
&widgets.app_box
}
}

View File

@@ -2,3 +2,4 @@ pub mod messages;
pub mod model; pub mod model;
pub mod update; pub mod update;
pub mod widgets; pub mod widgets;
pub mod factory;

View File

@@ -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 struct ToolboxAppDialogModel {
pub hidden: bool, pub hidden: bool,
pub apps: FactoryVec<DotDesktopApplication>,
} }
impl Model for ToolboxAppDialogModel { impl Model for ToolboxAppDialogModel {

View File

@@ -1,12 +1,33 @@
use relm4::{ComponentUpdate, Sender}; use relm4::{ComponentUpdate, Sender, factory::FactoryVec};
use crate::ui::app::{messages::AppMsg, model::AppModel}; use crate::ui::app::{messages::AppMsg, model::AppModel};
use super::{messages::ToolboxAppDialogMsg, model::ToolboxAppDialogModel}; use super::{messages::ToolboxAppDialogMsg, model::{ToolboxAppDialogModel, DotDesktopApplication}};
impl ComponentUpdate<AppModel> for ToolboxAppDialogModel { impl ComponentUpdate<AppModel> for ToolboxAppDialogModel {
fn init_model(_parent_model: &AppModel) -> Self { 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( fn update(

View File

@@ -1,10 +1,6 @@
use std::cell::Cell;
use gtk::Orientation; use gtk::Orientation;
use gtk::PolicyType; use gtk::PolicyType;
use relm4::adw; use relm4::adw;
use relm4::adw::prelude::BoxExt;
use relm4::adw::prelude::GtkWindowExt; use relm4::adw::prelude::GtkWindowExt;
use relm4::adw::prelude::WidgetExt; use relm4::adw::prelude::WidgetExt;
use relm4::adw::traits::PreferencesGroupExt; use relm4::adw::traits::PreferencesGroupExt;
@@ -14,7 +10,6 @@ use relm4::gtk;
use relm4::send; use relm4::send;
use relm4::WidgetPlus; use relm4::WidgetPlus;
use relm4::Widgets; use relm4::Widgets;
use gtk::glib;
use gtk::prelude::*; use gtk::prelude::*;
@@ -25,6 +20,11 @@ use crate::ui::components::toolbox_apps::messages::ToolboxAppDialogMsg;
use super::model::ToolboxAppDialogModel; use super::model::ToolboxAppDialogModel;
#[derive(Debug)]
pub struct AppFactoryWidgets {
pub app_box: gtk::Box,
}
#[relm4::widget(pub)] #[relm4::widget(pub)]
@@ -56,331 +56,7 @@ impl Widgets<ToolboxAppDialogModel, AppModel> for ToolboxAppDialogWidgets {
set_column_spacing: 5, set_column_spacing: 5,
set_row_spacing: 5, set_row_spacing: 5,
set_orientation: Orientation::Horizontal, set_orientation: Orientation::Horizontal,
insert(1) = &gtk::Box { factory!(model.apps),
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 = &gtk::Switch {
set_halign: gtk::Align::Center,
set_valign: gtk::Align::Center,
set_hexpand: false,
set_vexpand: false,
set_margin_all: 10,
},
append = &gtk::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 = &gtk::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) = &gtk::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 = &gtk::Switch {
set_halign: gtk::Align::Center,
set_valign: gtk::Align::Center,
set_hexpand: false,
set_vexpand: false,
set_margin_all: 10,
},
append = &gtk::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 = &gtk::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) = &gtk::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 = &gtk::Switch {
set_halign: gtk::Align::Center,
set_valign: gtk::Align::Center,
set_hexpand: false,
set_vexpand: false,
set_margin_all: 10,
},
append = &gtk::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 = &gtk::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) = &gtk::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 = &gtk::Switch {
set_halign: gtk::Align::Center,
set_valign: gtk::Align::Center,
set_hexpand: false,
set_vexpand: false,
set_margin_all: 10,
},
append = &gtk::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 = &gtk::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) = &gtk::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 = &gtk::Switch {
set_halign: gtk::Align::Center,
set_valign: gtk::Align::Center,
set_hexpand: false,
set_vexpand: false,
set_margin_all: 10,
},
append = &gtk::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 = &gtk::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) = &gtk::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 = &gtk::Switch {
set_halign: gtk::Align::Center,
set_valign: gtk::Align::Center,
set_hexpand: false,
set_vexpand: false,
set_margin_all: 10,
},
append = &gtk::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 = &gtk::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) = &gtk::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 = &gtk::Switch {
set_halign: gtk::Align::Center,
set_valign: gtk::Align::Center,
set_hexpand: false,
set_vexpand: false,
set_margin_all: 10,
},
append = &gtk::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 = &gtk::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) = &gtk::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 = &gtk::Switch {
set_halign: gtk::Align::Center,
set_valign: gtk::Align::Center,
set_hexpand: false,
set_vexpand: false,
set_margin_all: 10,
},
append = &gtk::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 = &gtk::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) = &gtk::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 = &gtk::Switch {
set_halign: gtk::Align::Center,
set_valign: gtk::Align::Center,
set_hexpand: false,
set_vexpand: false,
set_margin_all: 10,
},
append = &gtk::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 = &gtk::Label {
set_halign: gtk::Align::Center,
set_valign: gtk::Align::Center,
set_text: "Firefox",
set_margin_all: 5,
set_hexpand: false,
set_vexpand: false,
}
},
} }
} }