From 7535a834f9fc069d72619c7eddece15e78c40250 Mon Sep 17 00:00:00 2001 From: Gabriele Musco Date: Sun, 23 Jul 2023 14:52:48 +0200 Subject: [PATCH] feat: stateless action macro --- src/ui/app.rs | 77 +++++++++++++++++++----------------------------- src/ui/macros.rs | 7 +++++ 2 files changed, 38 insertions(+), 46 deletions(-) diff --git a/src/ui/app.rs b/src/ui/app.rs index 6b17031..1275851 100644 --- a/src/ui/app.rs +++ b/src/ui/app.rs @@ -36,7 +36,7 @@ use crate::ui::build_window::BuildWindowMsg; use crate::ui::debug_view::DebugViewInit; use crate::ui::libsurvive_setup_window::LibsurviveSetupMsg; use crate::ui::main_view::{MainView, MainViewInit, MainViewOutMsg}; -use crate::withclones; +use crate::{withclones, stateless_action}; use crate::xr_devices::XRDevices; use gtk::prelude::*; use relm4::actions::{AccelsPlus, ActionGroupName, RelmAction, RelmActionGroup}; @@ -596,71 +596,56 @@ impl SimpleComponent for App { let mut actions = RelmActionGroup::::new(); - let buildprofile_action = { + { withclones![sender]; - RelmAction::::new_stateless(move |_| { + stateless_action!(actions, BuildProfileAction, { sender.input_sender().emit(Msg::BuildProfile(false)); - }) - }; - - let buildprofileclean_action = { + }); + } + { withclones![sender]; - RelmAction::::new_stateless(move |_| { + stateless_action!(actions, BuildProfileCleanAction, { sender.input_sender().emit(Msg::BuildProfile(true)); - }) - }; - - let about_action = { + }); + } + { let abd_sender = model.about_dialog.sender().clone(); - RelmAction::::new_stateless(move |_| { + stateless_action!(actions, AboutAction, { abd_sender.send(()).unwrap(); - }) - }; - - let libsurvive_setup_action = { + }); + } + { withclones![sender]; - RelmAction::::new_stateless(move |_| { + stateless_action!(actions, LibsurviveSetupAction, { sender.input(Msg::OpenLibsurviveSetup); - }) - }; - - let quit_action = { + }); + } + { withclones![sender]; - RelmAction::::new_stateless(move |_| { + stateless_action!(actions, QuitAction, { sender.input(Msg::Quit); - }) - }; - - let debug_view_toggle_action: RelmAction = { + }); + } + { withclones![sender]; - RelmAction::::new_stateful( + actions.add_action(RelmAction::::new_stateful( &model.enable_debug_view, move |_, state| { let s = *state; *state = !s; sender.input(Msg::EnableDebugViewChanged(*state)); }, - ) - }; - - actions.add_action(about_action); - actions.add_action(quit_action); - actions.add_action(buildprofile_action); - actions.add_action(buildprofileclean_action); - actions.add_action(debug_view_toggle_action); - actions.add_action(libsurvive_setup_action); + )) + } root.insert_action_group(AppActionGroup::NAME, Some(&actions.into_action_group())); - model - .application - .set_accelerators_for_action::(&["q"]); - model - .application - .set_accelerators_for_action::(&["F5"]); - model - .application - .set_accelerators_for_action::(&["F5"]); + { + let app = &model.application; + app.set_accelerators_for_action::(&["q"]); + app.set_accelerators_for_action::(&["F5"]); + app.set_accelerators_for_action::(&["F5"]); + } model.main_view.sender().emit(MainViewMsg::UpdateProfiles( model.profiles.clone(), diff --git a/src/ui/macros.rs b/src/ui/macros.rs index 727e52f..a66695d 100644 --- a/src/ui/macros.rs +++ b/src/ui/macros.rs @@ -4,3 +4,10 @@ macro_rules! withclones { $(let $var = $var.clone();)+ }; } + +#[macro_export] +macro_rules! stateless_action { + ($group:ident, $name:ident, $ex:expr) => { + $group.add_action(RelmAction::<$name>::new_stateless(move |_| $ex)); + }; +}