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
144
145
146
147
148
149
150
151
152
// 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

#[cfg(feature = "v4_12")]
#[cfg_attr(docsrs, doc(cfg(feature = "v4_12")))]
use crate::SectionModel;
use glib::{
    prelude::*,
    signal::{connect_raw, SignalHandlerId},
    translate::*,
};
use std::{boxed::Box as Box_, fmt, mem::transmute};

#[cfg(feature = "v4_12")]
#[cfg_attr(docsrs, doc(cfg(feature = "v4_12")))]
glib::wrapper! {
    /// [`FlattenListModel`][crate::FlattenListModel] is a list model that concatenates other list models.
    ///
    /// [`FlattenListModel`][crate::FlattenListModel] takes a list model containing list models, and flattens
    /// it into a single model. Each list model becomes a section in the single model.
    ///
    /// ## Properties
    ///
    ///
    /// #### `item-type`
    ///  The type of items. See [`ListModelExtManual::item_type()`][crate::gio::prelude::ListModelExtManual::item_type()].
    ///
    /// Readable
    ///
    ///
    /// #### `model`
    ///  The model being flattened.
    ///
    /// Readable | Writeable
    ///
    ///
    /// #### `n-items`
    ///  The number of items. See [`ListModelExtManual::n_items()`][crate::gio::prelude::ListModelExtManual::n_items()].
    ///
    /// Readable
    ///
    /// # Implements
    ///
    /// [`trait@glib::ObjectExt`], [`trait@gio::prelude::ListModelExt`], [`SectionModelExt`][trait@crate::prelude::SectionModelExt]
    #[doc(alias = "GtkFlattenListModel")]
    pub struct FlattenListModel(Object<ffi::GtkFlattenListModel, ffi::GtkFlattenListModelClass>) @implements gio::ListModel, SectionModel;

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

#[cfg(not(any(feature = "v4_12")))]
glib::wrapper! {
    #[doc(alias = "GtkFlattenListModel")]
    pub struct FlattenListModel(Object<ffi::GtkFlattenListModel, ffi::GtkFlattenListModelClass>) @implements gio::ListModel;

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

impl FlattenListModel {
    /// Creates a new [`FlattenListModel`][crate::FlattenListModel] that flattens @list.
    /// ## `model`
    /// the model to be flattened
    ///
    /// # Returns
    ///
    /// a new [`FlattenListModel`][crate::FlattenListModel]
    #[doc(alias = "gtk_flatten_list_model_new")]
    pub fn new(model: Option<impl IsA<gio::ListModel>>) -> FlattenListModel {
        assert_initialized_main_thread!();
        unsafe {
            from_glib_full(ffi::gtk_flatten_list_model_new(
                model.map(|p| p.upcast()).into_glib_ptr(),
            ))
        }
    }

    /// Gets the model set via gtk_flatten_list_model_set_model().
    ///
    /// # Returns
    ///
    /// The model flattened by @self
    #[doc(alias = "gtk_flatten_list_model_get_model")]
    #[doc(alias = "get_model")]
    pub fn model(&self) -> Option<gio::ListModel> {
        unsafe { from_glib_none(ffi::gtk_flatten_list_model_get_model(self.to_glib_none().0)) }
    }

    /// Returns the model containing the item at the given position.
    /// ## `position`
    /// a position
    ///
    /// # Returns
    ///
    /// the model containing the item at @position
    #[doc(alias = "gtk_flatten_list_model_get_model_for_item")]
    #[doc(alias = "get_model_for_item")]
    pub fn model_for_item(&self, position: u32) -> Option<gio::ListModel> {
        unsafe {
            from_glib_none(ffi::gtk_flatten_list_model_get_model_for_item(
                self.to_glib_none().0,
                position,
            ))
        }
    }

    /// Sets a new model to be flattened.
    /// ## `model`
    /// the new model
    #[doc(alias = "gtk_flatten_list_model_set_model")]
    pub fn set_model(&self, model: Option<&impl IsA<gio::ListModel>>) {
        unsafe {
            ffi::gtk_flatten_list_model_set_model(
                self.to_glib_none().0,
                model.map(|p| p.as_ref()).to_glib_none().0,
            );
        }
    }

    #[doc(alias = "model")]
    pub fn connect_model_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
        unsafe extern "C" fn notify_model_trampoline<F: Fn(&FlattenListModel) + 'static>(
            this: *mut ffi::GtkFlattenListModel,
            _param_spec: glib::ffi::gpointer,
            f: glib::ffi::gpointer,
        ) {
            let f: &F = &*(f as *const F);
            f(&from_glib_borrow(this))
        }
        unsafe {
            let f: Box_<F> = Box_::new(f);
            connect_raw(
                self.as_ptr() as *mut _,
                b"notify::model\0".as_ptr() as *const _,
                Some(transmute::<_, unsafe extern "C" fn()>(
                    notify_model_trampoline::<F> as *const (),
                )),
                Box_::into_raw(f),
            )
        }
    }
}

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