add app dialogue concept

This commit is contained in:
2022-04-10 22:09:30 +02:00
parent 5ddbce16a2
commit 3f45c09658
13 changed files with 547 additions and 20 deletions

View File

@@ -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,

View File

@@ -1,3 +1,4 @@
pub enum AppMsg {
ShowToolboxSettingsRequest,
ShowToolboxAppsRequest,
}

View File

@@ -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};

View File

@@ -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 = &gtk::Button::from_icon_name(TERMINAL_ICON) {
set_margin_start: 10,

View File

@@ -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

View File

@@ -16,24 +16,26 @@ impl Widgets<AppModel, ()> for AppWidgets {
main_window = adw::ApplicationWindow {
set_default_width: 800,
set_default_height: 600,
set_content : main_box = Some(&gtk::Box) {
set_orientation: gtk::Orientation::Vertical,
append = &adw::HeaderBar {
set_title_widget = Some(&gtk::Label) {
set_label: "Toolbox Tuner",
}
},
append = &gtk::ListBox {
append = &gtk::ScrolledWindow {
set_hexpand: true,
set_vexpand: true,
set_child = Some(&gtk::ListBox) {
set_selection_mode: SelectionMode::None,
set_margin_all: 30,
set_css_classes: &["boxed-list"],
factory!(model.toolboxes)
}
}
},
}
}
}
}

View File

@@ -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<ToolboxSettingsDialogModel, AppModel>,
pub toolbox_apps_dialog: RelmComponent<ToolboxAppDialogModel, AppModel>,
}

View File

@@ -0,0 +1,4 @@
pub enum ToolboxAppDialogMsg {
Show,
Close,
}

View File

@@ -0,0 +1,4 @@
pub mod messages;
pub mod model;
pub mod update;
pub mod widgets;

View File

@@ -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 = ();
}

View File

@@ -0,0 +1,24 @@
use relm4::{ComponentUpdate, Sender};
use crate::ui::app::{messages::AppMsg, model::AppModel};
use super::{messages::ToolboxAppDialogMsg, model::ToolboxAppDialogModel};
impl ComponentUpdate<AppModel> for ToolboxAppDialogModel {
fn init_model(_parent_model: &AppModel) -> Self {
ToolboxAppDialogModel { hidden: true }
}
fn update(
&mut self,
msg: ToolboxAppDialogMsg,
_components: &(),
_sender: Sender<ToolboxAppDialogMsg>,
parent_sender: Sender<AppMsg>,
) {
match msg {
ToolboxAppDialogMsg::Show => self.hidden = false,
ToolboxAppDialogMsg::Close => self.hidden = true,
}
}
}

View File

@@ -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<ToolboxAppDialogModel, AppModel> for ToolboxAppDialogWidgets {
view! {
adw::PreferencesWindow {
set_title: Some("Applications: <Toolbox_name>"),
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 = &gtk::ScrolledWindow {
set_hscrollbar_policy: PolicyType::Never,
set_hexpand: false,
set_vexpand: true,
set_child = Some(&gtk::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) = &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,
}
},
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,
}
},
}
}
}
}
}
}
}

View File

@@ -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<ToolboxSettingsDialogModel, AppModel>,
}
pub struct ToolboxSettingsDialogModel {
pub hidden: bool,
}