load real toolbx information on startup

This commit is contained in:
2022-04-21 21:03:49 +02:00
parent fec7f6271f
commit e731426650
5 changed files with 80 additions and 161 deletions

View File

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

View File

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

View File

@@ -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<ToolboxContainer>,
pub toolboxes: FactoryVec<ToolbxContainer>,
}
#[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
}
}

View File

@@ -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<Self>;
type Widgets = FactoryWidgets;
type Root = adw::ActionRow;
@@ -37,79 +36,97 @@ impl FactoryPrototype for ToolboxContainer {
) -> Self::Widgets {
view! {
suffix_box = &gtk::Box{
append = &gtk::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 = &gtk::AspectFrame{
set_ratio: 1.0,
set_child = Some(&gtk::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 = &gtk::AspectFrame{
set_ratio: 1.0,
set_child = Some(&gtk::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 = &gtk::AspectFrame{
set_ratio: 1.0,
set_child = Some(&gtk::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 = &gtk::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 = &gtk::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 = &gtk::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 = &gtk::AspectFrame{
set_ratio: 1.0,
set_child = Some(&gtk::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 = &gtk::Box {
append = &gtk::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 = &gtk::AspectFrame{
set_ratio: 1.0,
set_child = Some(&gtk::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 }
}

View File

@@ -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<AppModel, ()> for AppWidgets {
append = &gtk::ScrolledWindow {
set_hexpand: true,
set_vexpand: true,
set_hscrollbar_policy: PolicyType::Never,
set_child = Some(&gtk::ListBox) {
set_valign: Align::Start,
set_selection_mode: SelectionMode::None,
set_margin_all: 30,
set_css_classes: &["boxed-list"],
factory!(model.toolboxes)
}
}
}
}
}