gio/auto/action.rs
1// This file was generated by gir (https://github.com/gtk-rs/gir)
2// from gir-files (https://github.com/gtk-rs/gir-files)
3// DO NOT EDIT
4
5use crate::ffi;
6use glib::{
7 prelude::*,
8 signal::{connect_raw, SignalHandlerId},
9 translate::*,
10};
11use std::boxed::Box as Box_;
12
13glib::wrapper! {
14 /// `GAction` represents a single named action.
15 ///
16 /// The main interface to an action is that it can be activated with
17 /// [`ActionExt::activate()`][crate::prelude::ActionExt::activate()]. This results in the 'activate' signal being
18 /// emitted. An activation has a `GVariant` parameter (which may be
19 /// `NULL`). The correct type for the parameter is determined by a static
20 /// parameter type (which is given at construction time).
21 ///
22 /// An action may optionally have a state, in which case the state may be
23 /// set with [`ActionExt::change_state()`][crate::prelude::ActionExt::change_state()]. This call takes a [type@GLib.Variant]. The
24 /// correct type for the state is determined by a static state type
25 /// (which is given at construction time).
26 ///
27 /// The state may have a hint associated with it, specifying its valid
28 /// range.
29 ///
30 /// `GAction` is merely the interface to the concept of an action, as
31 /// described above. Various implementations of actions exist, including
32 /// [`SimpleAction`][crate::SimpleAction].
33 ///
34 /// In all cases, the implementing class is responsible for storing the
35 /// name of the action, the parameter type, the enabled state, the optional
36 /// state type and the state and emitting the appropriate signals when these
37 /// change. The implementor is responsible for filtering calls to
38 /// [`ActionExt::activate()`][crate::prelude::ActionExt::activate()] and [`ActionExt::change_state()`][crate::prelude::ActionExt::change_state()]
39 /// for type safety and for the state being enabled.
40 ///
41 /// Probably the only useful thing to do with a `GAction` is to put it
42 /// inside of a [`SimpleActionGroup`][crate::SimpleActionGroup].
43 ///
44 /// ## Properties
45 ///
46 ///
47 /// #### `enabled`
48 /// If @action is currently enabled.
49 ///
50 /// If the action is disabled then calls to [`ActionExt::activate()`][crate::prelude::ActionExt::activate()] and
51 /// [`ActionExt::change_state()`][crate::prelude::ActionExt::change_state()] have no effect.
52 ///
53 /// Readable
54 ///
55 ///
56 /// #### `name`
57 /// The name of the action. This is mostly meaningful for identifying
58 /// the action once it has been added to a [type@Gio.ActionGroup]. It is immutable.
59 ///
60 /// Readable
61 ///
62 ///
63 /// #### `parameter-type`
64 /// The type of the parameter that must be given when activating the
65 /// action. This is immutable, and may be `NULL` if no parameter is needed when
66 /// activating the action.
67 ///
68 /// Readable
69 ///
70 ///
71 /// #### `state`
72 /// The state of the action, or `NULL` if the action is stateless.
73 ///
74 /// Readable
75 ///
76 ///
77 /// #### `state-type`
78 /// The [type@GLib.VariantType] of the state that the action has, or `NULL` if the
79 /// action is stateless. This is immutable.
80 ///
81 /// Readable
82 ///
83 /// # Implements
84 ///
85 /// [`ActionExt`][trait@crate::prelude::ActionExt]
86 #[doc(alias = "GAction")]
87 pub struct Action(Interface<ffi::GAction, ffi::GActionInterface>);
88
89 match fn {
90 type_ => || ffi::g_action_get_type(),
91 }
92}
93
94impl Action {
95 pub const NONE: Option<&'static Action> = None;
96
97 /// Checks if @action_name is valid.
98 ///
99 /// @action_name is valid if it consists only of alphanumeric characters,
100 /// plus `-` and `.`. The empty string is not a valid action name.
101 ///
102 /// It is an error to call this function with a non-UTF-8 @action_name.
103 /// @action_name must not be `NULL`.
104 /// ## `action_name`
105 /// a potential action name
106 ///
107 /// # Returns
108 ///
109 /// `TRUE` if @action_name is valid
110 #[doc(alias = "g_action_name_is_valid")]
111 pub fn name_is_valid(action_name: &str) -> bool {
112 unsafe { from_glib(ffi::g_action_name_is_valid(action_name.to_glib_none().0)) }
113 }
114
115 /// Parses a detailed action name into its separate name and target
116 /// components.
117 ///
118 /// Detailed action names can have three formats.
119 ///
120 /// The first format is used to represent an action name with no target
121 /// value and consists of just an action name containing no whitespace
122 /// nor the characters `:`, `(` or `)`. For example: `app.action`.
123 ///
124 /// The second format is used to represent an action with a target value
125 /// that is a non-empty string consisting only of alphanumerics, plus `-`
126 /// and `.`. In that case, the action name and target value are
127 /// separated by a double colon (`::`). For example:
128 /// `app.action::target`.
129 ///
130 /// The third format is used to represent an action with any type of
131 /// target value, including strings. The target value follows the action
132 /// name, surrounded in parens. For example: `app.action(42)`. The
133 /// target value is parsed using `GLib::Variant::parse()`. If a tuple-typed
134 /// value is desired, it must be specified in the same way, resulting in
135 /// two sets of parens, for example: `app.action((1,2,3))`. A string
136 /// target can be specified this way as well: `app.action('target')`.
137 /// For strings, this third format must be used if target value is
138 /// empty or contains characters other than alphanumerics, `-` and `.`.
139 ///
140 /// If this function returns `TRUE`, a non-`NULL` value is guaranteed to be returned
141 /// in @action_name (if a pointer is passed in). A `NULL` value may still be
142 /// returned in @target_value, as the @detailed_name may not contain a target.
143 ///
144 /// If returned, the [type@GLib.Variant] in @target_value is guaranteed to not be floating.
145 /// ## `detailed_name`
146 /// a detailed action name
147 ///
148 /// # Returns
149 ///
150 /// `TRUE` if successful, else `FALSE` with @error set
151 ///
152 /// ## `action_name`
153 /// the action name
154 ///
155 /// ## `target_value`
156 /// the target value,
157 /// or `NULL` for no target
158 #[doc(alias = "g_action_parse_detailed_name")]
159 pub fn parse_detailed_name(
160 detailed_name: &str,
161 ) -> Result<(glib::GString, Option<glib::Variant>), glib::Error> {
162 unsafe {
163 let mut action_name = std::ptr::null_mut();
164 let mut target_value = std::ptr::null_mut();
165 let mut error = std::ptr::null_mut();
166 let is_ok = ffi::g_action_parse_detailed_name(
167 detailed_name.to_glib_none().0,
168 &mut action_name,
169 &mut target_value,
170 &mut error,
171 );
172 debug_assert_eq!(is_ok == glib::ffi::GFALSE, !error.is_null());
173 if error.is_null() {
174 Ok((from_glib_full(action_name), from_glib_full(target_value)))
175 } else {
176 Err(from_glib_full(error))
177 }
178 }
179 }
180
181 /// Formats a detailed action name from @action_name and @target_value.
182 ///
183 /// It is an error to call this function with an invalid action name.
184 ///
185 /// This function is the opposite of [`parse_detailed_name()`][Self::parse_detailed_name()].
186 /// It will produce a string that can be parsed back to the @action_name
187 /// and @target_value by that function.
188 ///
189 /// See that function for the types of strings that will be printed by
190 /// this function.
191 /// ## `action_name`
192 /// a valid action name
193 /// ## `target_value`
194 /// a [type@GLib.Variant] target value, or `NULL`
195 ///
196 /// # Returns
197 ///
198 /// a detailed format string
199 #[doc(alias = "g_action_print_detailed_name")]
200 pub fn print_detailed_name(
201 action_name: &str,
202 target_value: Option<&glib::Variant>,
203 ) -> glib::GString {
204 unsafe {
205 from_glib_full(ffi::g_action_print_detailed_name(
206 action_name.to_glib_none().0,
207 target_value.to_glib_none().0,
208 ))
209 }
210 }
211}
212
213/// Trait containing all [`struct@Action`] methods.
214///
215/// # Implementors
216///
217/// [`Action`][struct@crate::Action], [`PropertyAction`][struct@crate::PropertyAction], [`SimpleAction`][struct@crate::SimpleAction]
218pub trait ActionExt: IsA<Action> + 'static {
219 /// Activates the action.
220 ///
221 /// @parameter must be the correct type of parameter for the action (ie:
222 /// the parameter type given at construction time). If the parameter
223 /// type was `NULL` then @parameter must also be `NULL`.
224 ///
225 /// If the @parameter [type@GLib.Variant] is floating, it is consumed.
226 /// ## `parameter`
227 /// the parameter to the activation
228 #[doc(alias = "g_action_activate")]
229 fn activate(&self, parameter: Option<&glib::Variant>) {
230 unsafe {
231 ffi::g_action_activate(self.as_ref().to_glib_none().0, parameter.to_glib_none().0);
232 }
233 }
234
235 /// Request for the state of @self to be changed to @value.
236 ///
237 /// The action must be stateful and @value must be of the correct type.
238 /// See [`state_type()`][Self::state_type()].
239 ///
240 /// This call merely requests a change. The action may refuse to change
241 /// its state or may change its state to something other than @value.
242 /// See [`state_hint()`][Self::state_hint()].
243 ///
244 /// If the @value [type@GLib.Variant] is floating, it is consumed.
245 /// ## `value`
246 /// the new state
247 #[doc(alias = "g_action_change_state")]
248 fn change_state(&self, value: &glib::Variant) {
249 unsafe {
250 ffi::g_action_change_state(self.as_ref().to_glib_none().0, value.to_glib_none().0);
251 }
252 }
253
254 /// Checks if @self is currently enabled.
255 ///
256 /// An action must be enabled in order to be activated or in order to
257 /// have its state changed from outside callers.
258 ///
259 /// # Returns
260 ///
261 /// whether the action is enabled
262 #[doc(alias = "g_action_get_enabled")]
263 #[doc(alias = "get_enabled")]
264 #[doc(alias = "enabled")]
265 fn is_enabled(&self) -> bool {
266 unsafe { from_glib(ffi::g_action_get_enabled(self.as_ref().to_glib_none().0)) }
267 }
268
269 /// Queries the name of @self.
270 ///
271 /// # Returns
272 ///
273 /// the name of the action
274 #[doc(alias = "g_action_get_name")]
275 #[doc(alias = "get_name")]
276 fn name(&self) -> glib::GString {
277 unsafe { from_glib_none(ffi::g_action_get_name(self.as_ref().to_glib_none().0)) }
278 }
279
280 /// Queries the type of the parameter that must be given when activating
281 /// @self.
282 ///
283 /// When activating the action using [`activate()`][Self::activate()], the
284 /// [type@GLib.Variant] given to that function must be of the type returned by
285 /// this function.
286 ///
287 /// In the case that this function returns `NULL`, you must not give any
288 /// [type@GLib.Variant], but `NULL` instead.
289 ///
290 /// # Returns
291 ///
292 /// the parameter type
293 #[doc(alias = "g_action_get_parameter_type")]
294 #[doc(alias = "get_parameter_type")]
295 #[doc(alias = "parameter-type")]
296 fn parameter_type(&self) -> Option<glib::VariantType> {
297 unsafe {
298 from_glib_none(ffi::g_action_get_parameter_type(
299 self.as_ref().to_glib_none().0,
300 ))
301 }
302 }
303
304 /// Queries the current state of @self.
305 ///
306 /// If the action is not stateful then `NULL` will be returned. If the
307 /// action is stateful then the type of the return value is the type
308 /// given by [`state_type()`][Self::state_type()].
309 ///
310 /// The return value (if non-`NULL`) should be freed with
311 /// `GLib::Variant::unref()` when it is no longer required.
312 ///
313 /// # Returns
314 ///
315 /// the current state of the action
316 #[doc(alias = "g_action_get_state")]
317 #[doc(alias = "get_state")]
318 fn state(&self) -> Option<glib::Variant> {
319 unsafe { from_glib_full(ffi::g_action_get_state(self.as_ref().to_glib_none().0)) }
320 }
321
322 /// Requests a hint about the valid range of values for the state of
323 /// @self.
324 ///
325 /// If `NULL` is returned it either means that the action is not stateful
326 /// or that there is no hint about the valid range of values for the
327 /// state of the action.
328 ///
329 /// If a [type@GLib.Variant] array is returned then each item in the array is a
330 /// possible value for the state. If a [type@GLib.Variant] pair (ie: two-tuple) is
331 /// returned then the tuple specifies the inclusive lower and upper bound
332 /// of valid values for the state.
333 ///
334 /// In any case, the information is merely a hint. It may be possible to
335 /// have a state value outside of the hinted range and setting a value
336 /// within the range may fail.
337 ///
338 /// The return value (if non-`NULL`) should be freed with
339 /// `GLib::Variant::unref()` when it is no longer required.
340 ///
341 /// # Returns
342 ///
343 /// the state range hint
344 #[doc(alias = "g_action_get_state_hint")]
345 #[doc(alias = "get_state_hint")]
346 fn state_hint(&self) -> Option<glib::Variant> {
347 unsafe { from_glib_full(ffi::g_action_get_state_hint(self.as_ref().to_glib_none().0)) }
348 }
349
350 /// Queries the type of the state of @self.
351 ///
352 /// If the action is stateful (e.g. created with
353 /// [`SimpleAction::new_stateful()`][crate::SimpleAction::new_stateful()]) then this function returns the
354 /// [type@GLib.VariantType] of the state. This is the type of the initial value
355 /// given as the state. All calls to [`change_state()`][Self::change_state()] must give a
356 /// [type@GLib.Variant] of this type and [`state()`][Self::state()] will return a
357 /// [type@GLib.Variant] of the same type.
358 ///
359 /// If the action is not stateful (e.g. created with [`SimpleAction::new()`][crate::SimpleAction::new()])
360 /// then this function will return `NULL`. In that case, [`state()`][Self::state()]
361 /// will return `NULL` and you must not call [`change_state()`][Self::change_state()].
362 ///
363 /// # Returns
364 ///
365 /// the state type, if the action is stateful
366 #[doc(alias = "g_action_get_state_type")]
367 #[doc(alias = "get_state_type")]
368 #[doc(alias = "state-type")]
369 fn state_type(&self) -> Option<glib::VariantType> {
370 unsafe { from_glib_none(ffi::g_action_get_state_type(self.as_ref().to_glib_none().0)) }
371 }
372
373 #[doc(alias = "enabled")]
374 fn connect_enabled_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
375 unsafe extern "C" fn notify_enabled_trampoline<P: IsA<Action>, F: Fn(&P) + 'static>(
376 this: *mut ffi::GAction,
377 _param_spec: glib::ffi::gpointer,
378 f: glib::ffi::gpointer,
379 ) {
380 let f: &F = &*(f as *const F);
381 f(Action::from_glib_borrow(this).unsafe_cast_ref())
382 }
383 unsafe {
384 let f: Box_<F> = Box_::new(f);
385 connect_raw(
386 self.as_ptr() as *mut _,
387 c"notify::enabled".as_ptr() as *const _,
388 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
389 notify_enabled_trampoline::<Self, F> as *const (),
390 )),
391 Box_::into_raw(f),
392 )
393 }
394 }
395
396 #[doc(alias = "name")]
397 fn connect_name_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
398 unsafe extern "C" fn notify_name_trampoline<P: IsA<Action>, F: Fn(&P) + 'static>(
399 this: *mut ffi::GAction,
400 _param_spec: glib::ffi::gpointer,
401 f: glib::ffi::gpointer,
402 ) {
403 let f: &F = &*(f as *const F);
404 f(Action::from_glib_borrow(this).unsafe_cast_ref())
405 }
406 unsafe {
407 let f: Box_<F> = Box_::new(f);
408 connect_raw(
409 self.as_ptr() as *mut _,
410 c"notify::name".as_ptr() as *const _,
411 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
412 notify_name_trampoline::<Self, F> as *const (),
413 )),
414 Box_::into_raw(f),
415 )
416 }
417 }
418
419 #[doc(alias = "parameter-type")]
420 fn connect_parameter_type_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
421 unsafe extern "C" fn notify_parameter_type_trampoline<
422 P: IsA<Action>,
423 F: Fn(&P) + 'static,
424 >(
425 this: *mut ffi::GAction,
426 _param_spec: glib::ffi::gpointer,
427 f: glib::ffi::gpointer,
428 ) {
429 let f: &F = &*(f as *const F);
430 f(Action::from_glib_borrow(this).unsafe_cast_ref())
431 }
432 unsafe {
433 let f: Box_<F> = Box_::new(f);
434 connect_raw(
435 self.as_ptr() as *mut _,
436 c"notify::parameter-type".as_ptr() as *const _,
437 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
438 notify_parameter_type_trampoline::<Self, F> as *const (),
439 )),
440 Box_::into_raw(f),
441 )
442 }
443 }
444
445 #[doc(alias = "state")]
446 fn connect_state_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
447 unsafe extern "C" fn notify_state_trampoline<P: IsA<Action>, F: Fn(&P) + 'static>(
448 this: *mut ffi::GAction,
449 _param_spec: glib::ffi::gpointer,
450 f: glib::ffi::gpointer,
451 ) {
452 let f: &F = &*(f as *const F);
453 f(Action::from_glib_borrow(this).unsafe_cast_ref())
454 }
455 unsafe {
456 let f: Box_<F> = Box_::new(f);
457 connect_raw(
458 self.as_ptr() as *mut _,
459 c"notify::state".as_ptr() as *const _,
460 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
461 notify_state_trampoline::<Self, F> as *const (),
462 )),
463 Box_::into_raw(f),
464 )
465 }
466 }
467
468 #[doc(alias = "state-type")]
469 fn connect_state_type_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
470 unsafe extern "C" fn notify_state_type_trampoline<P: IsA<Action>, F: Fn(&P) + 'static>(
471 this: *mut ffi::GAction,
472 _param_spec: glib::ffi::gpointer,
473 f: glib::ffi::gpointer,
474 ) {
475 let f: &F = &*(f as *const F);
476 f(Action::from_glib_borrow(this).unsafe_cast_ref())
477 }
478 unsafe {
479 let f: Box_<F> = Box_::new(f);
480 connect_raw(
481 self.as_ptr() as *mut _,
482 c"notify::state-type".as_ptr() as *const _,
483 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
484 notify_state_type_trampoline::<Self, F> as *const (),
485 )),
486 Box_::into_raw(f),
487 )
488 }
489 }
490}
491
492impl<O: IsA<Action>> ActionExt for O {}