begin local actions implementation

This commit is contained in:
yggverse 2024-11-10 07:09:55 +02:00
parent 9398a835cd
commit 9ff32a3419
19 changed files with 402 additions and 226 deletions

View file

@ -1,47 +0,0 @@
mod close;
mod debug;
use close::Close;
use debug::Debug;
use gtk::{
gio::SimpleActionGroup,
prelude::{IsA, WidgetExt},
Window,
};
pub struct Action {
// Actions
close: Close,
debug: Debug,
// Group
gobject: SimpleActionGroup,
}
impl Action {
// Constructors
/// Create **activated** [SimpleAction](https://docs.gtk.org/gio/class.SimpleAction.html) set
/// with new [SimpleActionGroup](https://docs.gtk.org/gio/class.SimpleActionGroup.html)
/// for given [Window](https://docs.gtk.org/gtk4/class.Window.html)
/// * useful for object-oriented work with GTK `detailed_name`, e.g. on GTK [Menu](https://docs.gtk.org/gio/class.Menu.html) build
/// * this implementation also encapsulates `GObject` to prevent unexpected assignments
/// * children actions implemented as wrapper also, that extend default [Variant](https://docs.gtk.org/glib/struct.Variant.html) features, etc
pub fn new_for(window: &(impl IsA<Window> + WidgetExt)) -> Self {
// Init group
let gobject = SimpleActionGroup::new();
// Add group to window
window.insert_action_group(crate::action::APP_BROWSER_WIDGET, Some(&gobject));
// Init actions
let close = Close::new_for(&gobject, window.clone());
let debug = Debug::new_for(&gobject, window.clone());
Self {
close,
debug,
gobject,
}
}
}

View file

@ -1,37 +0,0 @@
use gtk::{
gio::{SimpleAction, SimpleActionGroup},
prelude::{ActionMapExt, GtkWindowExt, IsA},
Window,
};
pub struct Close {
gobject: SimpleAction,
}
impl Close {
// Constructors
/// Create new [SimpleAction](https://docs.gtk.org/gio/class.SimpleAction.html)
/// for given [SimpleActionGroup](https://docs.gtk.org/gio/class.SimpleActionGroup.html)
/// and [Window](https://docs.gtk.org/gtk4/class.Window.html)
/// * this constructor **activate** default feature
pub fn new_for(group: &SimpleActionGroup, window: impl IsA<Window>) -> Self {
// Get action config
let (_group_name, action_name, parameter_type, _accels) =
crate::action::APP_BROWSER_WIDGET_CLOSE;
// Init action GObject
let gobject = SimpleAction::new(&action_name, parameter_type);
// Add action to given group
group.add_action(&gobject);
// Connect default feature on activate
gobject.connect_activate(move |_, _| {
window.close();
});
// Done
Self { gobject }
}
}

View file

@ -1,37 +0,0 @@
use gtk::{
gio::{SimpleAction, SimpleActionGroup},
prelude::{ActionMapExt, GtkWindowExt, IsA},
Window,
};
pub struct Debug {
gobject: SimpleAction,
}
impl Debug {
// Constructors
/// Create new [SimpleAction](https://docs.gtk.org/gio/class.SimpleAction.html)
/// for given [SimpleActionGroup](https://docs.gtk.org/gio/class.SimpleActionGroup.html)
/// and [Window](https://docs.gtk.org/gtk4/class.Window.html)
/// * this constructor **activate** default feature
pub fn new_for(group: &SimpleActionGroup, window: impl IsA<Window>) -> Self {
// Get action config
let (_group_name, action_name, parameter_type, _accels) =
crate::action::APP_BROWSER_WIDGET_DEBUG;
// Init action GObject
let gobject = SimpleAction::new(&action_name, parameter_type);
// Add action to given group
group.add_action(&gobject);
// Connect default feature on activate
gobject.connect_activate(move |_, _| {
window.emit_enable_debugging(true);
});
// Done
Self { gobject }
}
}