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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
// 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 gio_sys;
use glib;
use glib::object::IsA;
use glib::translate::*;
use glib::GString;
use std::fmt;
use std::ptr;

glib_wrapper! {
    /// `MenuAttributeIter` is an opaque structure type. You must access it
    /// using the functions below.
    ///
    /// # Implements
    ///
    /// [`MenuAttributeIterExt`](trait.MenuAttributeIterExt.html), [`glib::object::ObjectExt`](../glib/object/trait.ObjectExt.html)
    pub struct MenuAttributeIter(Object<gio_sys::GMenuAttributeIter, gio_sys::GMenuAttributeIterClass, MenuAttributeIterClass>);

    match fn {
        get_type => || gio_sys::g_menu_attribute_iter_get_type(),
    }
}

pub const NONE_MENU_ATTRIBUTE_ITER: Option<&MenuAttributeIter> = None;

/// Trait containing all `MenuAttributeIter` methods.
///
/// # Implementors
///
/// [`MenuAttributeIter`](struct.MenuAttributeIter.html)
pub trait MenuAttributeIterExt: 'static {
    /// Gets the name of the attribute at the current iterator position, as
    /// a string.
    ///
    /// The iterator is not advanced.
    ///
    /// # Returns
    ///
    /// the name of the attribute
    fn get_name(&self) -> Option<GString>;

    /// This function combines `MenuAttributeIterExt::next` with
    /// `MenuAttributeIterExt::get_name` and `MenuAttributeIterExt::get_value`.
    ///
    /// First the iterator is advanced to the next (possibly first) attribute.
    /// If that fails, then `false` is returned and there are no other
    /// effects.
    ///
    /// If successful, `name` and `value` are set to the name and value of the
    /// attribute that has just been advanced to. At this point,
    /// `MenuAttributeIterExt::get_name` and `MenuAttributeIterExt::get_value` will
    /// return the same values again.
    ///
    /// The value returned in `name` remains valid for as long as the iterator
    /// remains at the current position. The value returned in `value` must
    /// be unreffed using `glib::Variant::unref` when it is no longer in use.
    /// ## `out_name`
    /// the type of the attribute
    /// ## `value`
    /// the attribute value
    ///
    /// # Returns
    ///
    /// `true` on success, or `false` if there is no additional
    ///  attribute
    fn get_next(&self) -> Option<(GString, glib::Variant)>;

    /// Gets the value of the attribute at the current iterator position.
    ///
    /// The iterator is not advanced.
    ///
    /// # Returns
    ///
    /// the value of the current attribute
    fn get_value(&self) -> Option<glib::Variant>;

    /// Attempts to advance the iterator to the next (possibly first)
    /// attribute.
    ///
    /// `true` is returned on success, or `false` if there are no more
    /// attributes.
    ///
    /// You must call this function when you first acquire the iterator
    /// to advance it to the first attribute (and determine if the first
    /// attribute exists at all).
    ///
    /// # Returns
    ///
    /// `true` on success, or `false` when there are no more attributes
    fn next(&self) -> bool;
}

impl<O: IsA<MenuAttributeIter>> MenuAttributeIterExt for O {
    fn get_name(&self) -> Option<GString> {
        unsafe {
            from_glib_none(gio_sys::g_menu_attribute_iter_get_name(
                self.as_ref().to_glib_none().0,
            ))
        }
    }

    fn get_next(&self) -> Option<(GString, glib::Variant)> {
        unsafe {
            let mut out_name = ptr::null();
            let mut value = ptr::null_mut();
            let ret = from_glib(gio_sys::g_menu_attribute_iter_get_next(
                self.as_ref().to_glib_none().0,
                &mut out_name,
                &mut value,
            ));
            if ret {
                Some((from_glib_none(out_name), from_glib_full(value)))
            } else {
                None
            }
        }
    }

    fn get_value(&self) -> Option<glib::Variant> {
        unsafe {
            from_glib_full(gio_sys::g_menu_attribute_iter_get_value(
                self.as_ref().to_glib_none().0,
            ))
        }
    }

    fn next(&self) -> bool {
        unsafe {
            from_glib(gio_sys::g_menu_attribute_iter_next(
                self.as_ref().to_glib_none().0,
            ))
        }
    }
}

impl fmt::Display for MenuAttributeIter {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "MenuAttributeIter")
    }
}