From 26cea8e8440f09e0b4bc36e3f2a0f194e700142b Mon Sep 17 00:00:00 2001 From: Ralf Zerres Date: Thu, 5 Nov 2020 17:41:40 +0100 Subject: [PATCH] widgets/configuration: break out configuration functionality * handle widget `configuration` in dedicated subdir * adopt constants to handle widget id's Signed-off-by: Ralf Zerres --- advotracker/src/data/constants.rs | 6 + .../configuration/configuration_state.rs | 73 +++++++ .../configuration/configuration_view.rs | 139 +++++++++++++ advotracker/src/widgets/configuration/mod.rs | 12 ++ advotracker/src/widgets/main_view.rs | 188 +----------------- advotracker/src/widgets/mod.rs | 5 +- 6 files changed, 235 insertions(+), 188 deletions(-) create mode 100644 advotracker/src/widgets/configuration/configuration_state.rs create mode 100644 advotracker/src/widgets/configuration/configuration_view.rs create mode 100644 advotracker/src/widgets/configuration/mod.rs diff --git a/advotracker/src/data/constants.rs b/advotracker/src/data/constants.rs index a3b88e2..e56607c 100644 --- a/advotracker/src/data/constants.rs +++ b/advotracker/src/data/constants.rs @@ -15,6 +15,12 @@ pub static STYLE_BUTTON_MENU: &str = "button_menu"; pub static STYLE_STACK_MENU: &str = "stack_menu"; // Widget IDs (DCES: Entity[id] => [Component1, .. , Component] -> data or state) +pub static ID_CONFIGURATION_FORM: &str = "configuration_form"; +pub static ID_CONFIGURATION_HEADER: &str = "configuration_header"; +pub static ID_CONFIGURATION_LABEL_CONFIG_FILE: &str = "configuration_label_config_file"; +pub static ID_CONFIGURATION_CONFIG_FILE: &str = "configuration_config_file"; +pub static ID_CONFIGURATION_LABEL_LANGUAGE_ID: &str = "configuration_label_language_id"; +pub static ID_CONFIGURATION_LANGUAGE_ID: &str = "configuration_language_id"; pub static ID_LOCALIZATION_FORM: &str = "localization_form"; pub static ID_LOCALIZATION_HEADER: &str = "localization_header"; diff --git a/advotracker/src/widgets/configuration/configuration_state.rs b/advotracker/src/widgets/configuration/configuration_state.rs new file mode 100644 index 0000000..992e757 --- /dev/null +++ b/advotracker/src/widgets/configuration/configuration_state.rs @@ -0,0 +1,73 @@ +/* + * advotracker - Hotline tackingtool for Advocats + * + * Copyright 2020 Ralf Zerres + * SPDX-License-Identifier: (0BSD or MIT) + */ + +use orbtk::prelude::*; + +use serde::{Deserialize, Serialize}; + +use crate::widgets::configuration::configuration_view::ConfigurationView; + +/// Valid `actions` that are handled as state changes in the `Configuration` widget. +#[derive(Clone, Debug)] +pub enum ConfigurationAction { + SaveConfiguration, + LoadConfiguration, +} + +/// Define valid configuration data. +/// This structure is serialized and saved inside the OS dependent settings file. +#[derive(Default, Debug, Clone, Serialize, Deserialize)] +struct ConfigurationData( + pub String, + pub String +); + +/// Valid `structures` that are handled inside the state of the `Configuration` widget. +#[derive(Debug, Default, AsAny)] +pub struct ConfigurationState {} + +impl State for ConfigurationState { + fn messages( + &mut self, + mut messages: MessageReader, + registry: &mut Registry, + ctx: &mut Context<'_>, + ) { + for message in messages.read::() { + match message { + ConfigurationAction::LoadConfiguration => registry + .get::("settings") + .load_async::("configuration_data".to_string(), ctx.entity()), + ConfigurationAction::SaveConfiguration => { + let configuration_file: String = ConfigurationView::configuration_file_clone(&ctx.widget()); + let language_id: String = ConfigurationView::language_id_clone(&ctx.widget()); + registry.get::("settings").save_async( + "configuration_data".to_string(), + ConfigurationData( + configuration_file, + language_id + ), + ctx.entity(), + ); + } + } + } + + // save result + for message in messages.read::>() { + println!("Result {:?}", message); + } + + // load result + for message in messages.read::>() { + if let Ok(data) = message { + ConfigurationView::configuration_file_set(&mut ctx.widget(), data.0); + ConfigurationView::language_id_set(&mut ctx.widget(), data.1); + } + } + } +} diff --git a/advotracker/src/widgets/configuration/configuration_view.rs b/advotracker/src/widgets/configuration/configuration_view.rs new file mode 100644 index 0000000..869bdf3 --- /dev/null +++ b/advotracker/src/widgets/configuration/configuration_view.rs @@ -0,0 +1,139 @@ +/* + * advotracker - Hotline tackingtool for Advocats + * + * Copyright 2020 Ralf Zerres + * SPDX-License-Identifier: (0BSD or MIT) + */ + +use orbtk::prelude::*; + +use crate::{ + data::constants::*, + widgets::configuration::configuration_state::{ConfigurationAction, ConfigurationState}, +}; + +// Macro that initializes the widget structures/variables for our view +widget!( + ConfigurationView { + configuration_file: String, + language_id: String + } +); + +/// The template implementation of the configuration view +/// All GUI elements are styled using the "style" attribute referencing to a ron based css +impl Template for ConfigurationView { + fn template(self, id: Entity, ctx: &mut BuildContext<'_>) -> Self { + self.child( + Grid::new() + .id(ID_CONFIGURATION_FORM) + .margin(4) + .columns( + Columns::create() + .push(120) + .push(12) + .push("auto") + ) + .rows(Rows::create() + .push("auto") + .push(4) + .push("auto") + .push(4) + .push("auto") + .push(12) + .push("auto"), + ) + .child( + TextBlock::new() + .id(ID_CONFIGURATION_HEADER) + .h_align("start") + .attach(Grid::column(0)) + .attach(Grid::row(0)) + .attach(Grid::column_span(3)) + .text("Configuration settings") + .style("header") + .build(ctx), + ) + .child( + TextBlock::new() + .id(ID_CONFIGURATION_CONFIG_FILE) + .attach(Grid::column(0)) + .attach(Grid::row(2)) + .v_align("center") + .h_align("end") + .text("Configuration file") + .build(ctx), + ) + .child( + TextBox::new() + .id(ID_CONFIGURATION_CONFIG_FILE) + .attach(Grid::column(2)) + .attach(Grid::row(2)) + .text(("configuration_file", id)) + .water_mark("Filename...") + .build(ctx), + ) + .child( + TextBlock::new() + .id(ID_CONFIGURATION_LABEL_LANGUAGE_ID) + .attach(Grid::column(0)) + .attach(Grid::row(4)) + .v_align("center") + .h_align("end") + .text("Language Id") + .build(ctx), + ) + .child( + TextBox::new() + .id(ID_CONFIGURATION_LANGUAGE_ID) + .attach(Grid::column(2)) + .attach(Grid::row(4)) + .text(("language_id", id)) + .water_mark("Locale Identifier...") + .build(ctx), + ) + .child( + Grid::new() + .h_align("center") + .attach(Grid::column(0)) + .attach(Grid::row(6)) + .attach(Grid::column_span(3)) + .columns( + Columns::create() + .push("auto") + .push(8) + .push("auto") + ) + .rows(Rows::create() + .push("auto") + ) + .child( + Button::new() + .style("button_single_content") + .attach(Grid::column(0)) + .attach(Grid::row(0)) + .text("load") + .on_click(move |ctx, _| { + ctx.send_message(ConfigurationAction::LoadConfiguration, id); + true + }) + .build(ctx), + ) + .child( + Button::new() + .text("save") + .style("button_single_content") + .attach(Grid::column(2)) + .attach(Grid::row(0)) + .on_click(move |ctx, _| { + ctx.send_message(ConfigurationAction::SaveConfiguration, id); + true + }) + .build(ctx), + ) + .build(ctx), + ) + .build(ctx), + ) + } +} diff --git a/advotracker/src/widgets/configuration/mod.rs b/advotracker/src/widgets/configuration/mod.rs new file mode 100644 index 0000000..b2d4953 --- /dev/null +++ b/advotracker/src/widgets/configuration/mod.rs @@ -0,0 +1,12 @@ +/* + * advotracker - Hotline tackingtool for Advocats + * + * Copyright 2020 Ralf Zerres + * SPDX-License-Identifier: (0BSD or MIT) + */ + +/// The configuration state +pub mod configuration_state; + +/// The configuration view +pub mod configuration_view; diff --git a/advotracker/src/widgets/main_view.rs b/advotracker/src/widgets/main_view.rs index 6af097d..b9b21fe 100644 --- a/advotracker/src/widgets/main_view.rs +++ b/advotracker/src/widgets/main_view.rs @@ -11,6 +11,7 @@ use crate::{ data::structures::PolicyCheck, widgets::policycheck::policycheck_view::PolicycheckView, widgets::localization::localization_view::LocalizationView, + widgets::configuration::configuration_view::ConfigurationView, }; // [START] views @@ -61,190 +62,3 @@ impl Template for MainView { //.child(policycheck_view) } } - -widget!( - ConfigurationView { - configuration_file: String, - language_id: String - } -); - -impl Template for ConfigurationView { - fn template(self, id: Entity, ctx: &mut BuildContext<'_>) -> Self { - self.child( - Grid::new() - .margin(4) - .columns( - Columns::create() - .push(120) - .push(12) - .push("auto") - ) - .rows(Rows::create() - .push("auto") - .push(4) - .push("auto") - .push(4) - .push("auto") - .push(12) - .push("auto"), - ) - .child( - TextBlock::new() - .h_align("start") - .attach(Grid::column(0)) - .attach(Grid::row(0)) - .attach(Grid::column_span(3)) - .text("Configuration settings") - .style("header") - .build(ctx), - ) - .child( - TextBlock::new() - .attach(Grid::column(0)) - .attach(Grid::row(2)) - .v_align("center") - .h_align("end") - .text("Configuration file") - .build(ctx), - ) - .child( - TextBox::new() - .attach(Grid::column(2)) - .attach(Grid::row(2)) - .text(("configuration_file", id)) - .water_mark("Filename...") - .build(ctx), - ) - .child( - TextBlock::new() - .attach(Grid::column(0)) - .attach(Grid::row(4)) - .v_align("center") - .h_align("end") - .text("Language Id") - .build(ctx), - ) - .child( - TextBox::new() - .attach(Grid::column(2)) - .attach(Grid::row(4)) - .text(("language_id", id)) - .water_mark("Locale Identifier...") - .build(ctx), - ) - .child( - Grid::new() - .h_align("center") - .attach(Grid::column(0)) - .attach(Grid::row(6)) - .attach(Grid::column_span(3)) - .columns( - Columns::create() - .push("auto") - .push(8) - .push("auto") - ) - .rows(Rows::create() - .push("auto") - ) - .child( - Button::new() - .style("button_single_content") - .attach(Grid::column(0)) - .attach(Grid::row(0)) - .text("load") - .on_click(move |ctx, _| { - ctx.send_message(ConfigurationAction::LoadConfiguration, id); - true - }) - .build(ctx), - ) - .child( - Button::new() - .text("save") - .style("button_single_content") - .attach(Grid::column(2)) - .attach(Grid::row(0)) - .on_click(move |ctx, _| { - ctx.send_message(ConfigurationAction::SaveConfiguration, id); - true - }) - .build(ctx), - ) - .build(ctx), - ) - .build(ctx), - ) - } -} - -// [END] views - -// [START] states - - -#[derive(Debug, Default, AsAny)] -struct ConfigurationState {} - -impl State for ConfigurationState { - fn messages( - &mut self, - mut messages: MessageReader, - registry: &mut Registry, - ctx: &mut Context<'_>, - ) { - for message in messages.read::() { - match message { - ConfigurationAction::LoadConfiguration => registry - .get::("settings") - .load_async::("configuration_data".to_string(), ctx.entity()), - ConfigurationAction::SaveConfiguration => { - let configuration_file: String = ConfigurationView::configuration_file_clone(&ctx.widget()); - let language_id: String = ConfigurationView::language_id_clone(&ctx.widget()); - registry.get::("settings").save_async( - "configuration_data".to_string(), - ConfigurationData( - configuration_file, - language_id - ), - ctx.entity(), - ); - } - } - } - - // save result - for message in messages.read::>() { - println!("Result {:?}", message); - } - - // load result - for message in messages.read::>() { - if let Ok(data) = message { - ConfigurationView::configuration_file_set(&mut ctx.widget(), data.0); - ConfigurationView::language_id_set(&mut ctx.widget(), data.1); - } - } - } -} - -// [END] states - -// [START] Configuration data - -#[derive(Clone, Debug)] -enum ConfigurationAction { - SaveConfiguration, - LoadConfiguration, -} - -use serde::{Deserialize, Serialize}; - -#[derive(Default, Debug, Clone, Serialize, Deserialize)] -pub struct ConfigurationData( - pub String, - pub String -); - -// [END] Configuration data diff --git a/advotracker/src/widgets/mod.rs b/advotracker/src/widgets/mod.rs index ce0ac33..22404c0 100644 --- a/advotracker/src/widgets/mod.rs +++ b/advotracker/src/widgets/mod.rs @@ -5,7 +5,10 @@ * SPDX-License-Identifier: (0BSD or MIT) */ -/// global helper functions +/// The configuration widget. +pub mod configuration; + +/// The global helper functions. pub mod global_state; /// The localization widget.