1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
// This file was generated by gir (https://github.com/gtk-rs/gir)
// from gir-files (https://github.com/gtk-rs/gir-files)
// DO NOT EDIT

use crate::Action;
use glib::object::IsA;
use glib::object::ObjectType as ObjectType_;
use glib::translate::*;
use glib::StaticType;
use std::fmt;

glib::wrapper! {
    /// A [`PropertyAction`][crate::PropertyAction] is a way to get a [`Action`][crate::Action] with a state value
    /// reflecting and controlling the value of a [`glib::Object`][crate::glib::Object] property.
    ///
    /// The state of the action will correspond to the value of the property.
    /// Changing it will change the property (assuming the requested value
    /// matches the requirements as specified in the `GParamSpec`).
    ///
    /// Only the most common types are presently supported. Booleans are
    /// mapped to booleans, strings to strings, signed/unsigned integers to
    /// int32/uint32 and floats and doubles to doubles.
    ///
    /// If the property is an enum then the state will be string-typed and
    /// conversion will automatically be performed between the enum value and
    /// "nick" string as per the `GEnumValue` table.
    ///
    /// Flags types are not currently supported.
    ///
    /// Properties of object types, boxed types and pointer types are not
    /// supported and probably never will be.
    ///
    /// Properties of [`glib::Variant`][struct@crate::glib::Variant] types are not currently supported.
    ///
    /// If the property is boolean-valued then the action will have a NULL
    /// parameter type, and activating the action (with no parameter) will
    /// toggle the value of the property.
    ///
    /// In all other cases, the parameter type will correspond to the type of
    /// the property.
    ///
    /// The general idea here is to reduce the number of locations where a
    /// particular piece of state is kept (and therefore has to be synchronised
    /// between). [`PropertyAction`][crate::PropertyAction] does not have a separate state that is kept
    /// in sync with the property value -- its state is the property value.
    ///
    /// For example, it might be useful to create a [`Action`][crate::Action] corresponding to
    /// the "visible-child-name" property of a `GtkStack` so that the current
    /// page can be switched from a menu. The active radio indication in the
    /// menu is then directly determined from the active page of the
    /// `GtkStack`.
    ///
    /// An anti-example would be binding the "active-id" property on a
    /// `GtkComboBox`. This is because the state of the combobox itself is
    /// probably uninteresting and is actually being used to control
    /// something else.
    ///
    /// Another anti-example would be to bind to the "visible-child-name"
    /// property of a `GtkStack` if this value is actually stored in
    /// [`Settings`][crate::Settings]. In that case, the real source of the value is
    /// [`Settings`][crate::Settings]. If you want a [`Action`][crate::Action] to control a setting stored in
    /// [`Settings`][crate::Settings], see [`SettingsExt::create_action()`][crate::prelude::SettingsExt::create_action()] instead, and possibly
    /// combine its use with [`SettingsExtManual::bind()`][crate::prelude::SettingsExtManual::bind()].
    ///
    /// # Implements
    ///
    /// [`trait@glib::ObjectExt`], [`ActionExt`][trait@crate::prelude::ActionExt]
    #[doc(alias = "GPropertyAction")]
    pub struct PropertyAction(Object<ffi::GPropertyAction>) @implements Action;

    match fn {
        type_ => || ffi::g_property_action_get_type(),
    }
}

impl PropertyAction {
    /// Creates a [`Action`][crate::Action] corresponding to the value of property
    /// `property_name` on `object`.
    ///
    /// The property must be existent and readable and writable (and not
    /// construct-only).
    ///
    /// This function takes a reference on `object` and doesn't release it
    /// until the action is destroyed.
    /// ## `name`
    /// the name of the action to create
    /// ## `object`
    /// the object that has the property
    ///  to wrap
    /// ## `property_name`
    /// the name of the property
    ///
    /// # Returns
    ///
    /// a new [`PropertyAction`][crate::PropertyAction]
    #[doc(alias = "g_property_action_new")]
    pub fn new(name: &str, object: &impl IsA<glib::Object>, property_name: &str) -> PropertyAction {
        unsafe {
            from_glib_full(ffi::g_property_action_new(
                name.to_glib_none().0,
                object.as_ref().to_glib_none().0,
                property_name.to_glib_none().0,
            ))
        }
    }

    /// If [`true`], the state of the action will be the negation of the
    /// property value, provided the property is boolean.
    #[doc(alias = "invert-boolean")]
    pub fn inverts_boolean(&self) -> bool {
        glib::ObjectExt::property(self, "invert-boolean")
    }
}

impl fmt::Display for PropertyAction {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        f.write_str("PropertyAction")
    }
}