From e7314266503b215dba49e0ea0934485cc14062b3 Mon Sep 17 00:00:00 2001 From: Hannes Kuchelmeister Date: Thu, 21 Apr 2022 21:03:49 +0200 Subject: [PATCH] load real toolbx information on startup --- src/main.rs | 91 ++--------------------------- src/toolbx/mod.rs | 12 ++-- src/ui/app/model.rs | 20 +------ src/ui/app/toolbox_list.rs | 113 +++++++++++++++++++++---------------- src/ui/app/widgets.rs | 5 +- 5 files changed, 80 insertions(+), 161 deletions(-) diff --git a/src/main.rs b/src/main.rs index e73b335..c79dd77 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,96 +1,13 @@ use relm4::{factory::FactoryVec, RelmApp}; -use ui::app::model::{AppModel, ToolboxContainer, ToolboxStatus}; +use toolbx::ToolbxContainer; +use ui::app::model::{AppModel}; mod ui; mod toolbx; 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: "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 toolbx_list = ToolbxContainer::get_toolboxes(); + let mut factory_vec = FactoryVec::from_vec(toolbx_list); let model = AppModel { toolboxes: factory_vec, diff --git a/src/toolbx/mod.rs b/src/toolbx/mod.rs index e009c7a..b8408e5 100644 --- a/src/toolbx/mod.rs +++ b/src/toolbx/mod.rs @@ -1,12 +1,12 @@ use std::{iter::zip, process::Command, sync::Arc, fmt::Result, string::ParseError}; -#[derive(Debug, PartialEq)] +#[derive(Debug, PartialEq, Default)] pub struct ToolbxContainer { - id: String, - name: String, - created: String, - status: String, - image: String, + pub id: String, + pub name: String, + pub created: String, + pub status: String, + pub image: String, } impl ToolbxContainer { diff --git a/src/ui/app/model.rs b/src/ui/app/model.rs index 14c6886..b1a9401 100644 --- a/src/ui/app/model.rs +++ b/src/ui/app/model.rs @@ -1,31 +1,15 @@ use relm4::{factory::FactoryVec, Model}; -use crate::ui::components::AppComponents; +use crate::{ui::components::AppComponents, toolbx::ToolbxContainer}; use super::{messages::AppMsg, widgets::AppWidgets}; pub struct AppModel { - pub toolboxes: FactoryVec, + 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 index 63b51a4..fa484a3 100644 --- a/src/ui/app/toolbox_list.rs +++ b/src/ui/app/toolbox_list.rs @@ -8,22 +8,21 @@ use relm4::{ gtk, send, view, Sender, }; -use crate::ui::{ - app::model::ToolboxStatus, +use crate::{ui::{ 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, }, -}; +}, toolbx::ToolbxContainer}; -use super::{messages::AppMsg, model::ToolboxContainer}; +use super::{messages::AppMsg}; #[derive(Debug)] pub struct FactoryWidgets { pub action_row: adw::ActionRow, } -impl FactoryPrototype for ToolboxContainer { +impl FactoryPrototype for ToolbxContainer { type Factory = FactoryVec; type Widgets = FactoryWidgets; type Root = adw::ActionRow; @@ -37,79 +36,97 @@ impl FactoryPrototype for ToolboxContainer { ) -> 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"], - connect_clicked(sender) => move |btn| { - send!(sender, AppMsg::ShowToolboxAppsRequest); + append = >k::AspectFrame{ + set_ratio: 1.0, + set_child = Some(>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"], + connect_clicked(sender) => move |btn| { + send!(sender, AppMsg::ShowToolboxAppsRequest); + }, + } + }, + append = >k::AspectFrame{ + set_ratio: 1.0, + set_child = Some(>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::AspectFrame{ + set_ratio: 1.0, + set_child = Some(>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); + }, }, - }, - 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"], + update_button = >k::AspectFrame{ + set_ratio: 1.0, + set_child = Some(>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 => { + match self.status.as_str() { + "running" => { status_button_tooltip = SHUTDOWN_TOOLTIP; status_button_icon = SHUTDOWN_ICON; } - &ToolboxStatus::Stopped => { + _ => { status_button_tooltip = START_TOOLTIP; status_button_icon = START_ICON; } } + let subtitle = format!("created {}\n{}", self.created, self.image); + view! { action_row = &adw::ActionRow { set_title: &self.name, - set_subtitle: "additional information", + set_subtitle: subtitle.as_str(), 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"], + append = >k::AspectFrame{ + set_ratio: 1.0, + set_child = Some(>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 } } diff --git a/src/ui/app/widgets.rs b/src/ui/app/widgets.rs index d33001d..85159e4 100644 --- a/src/ui/app/widgets.rs +++ b/src/ui/app/widgets.rs @@ -4,7 +4,7 @@ use relm4::{ prelude::{BoxExt, GtkWindowExt, OrientableExt, WidgetExt}, traits::AdwApplicationWindowExt, }, - gtk::{self, SelectionMode}, + gtk::{self, SelectionMode, Align, PolicyType}, WidgetPlus, Widgets, }; @@ -27,14 +27,15 @@ impl Widgets for AppWidgets { append = >k::ScrolledWindow { set_hexpand: true, set_vexpand: true, + set_hscrollbar_policy: PolicyType::Never, set_child = Some(>k::ListBox) { + set_valign: Align::Start, set_selection_mode: SelectionMode::None, set_margin_all: 30, set_css_classes: &["boxed-list"], factory!(model.toolboxes) } } - } } }