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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
// 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
#![allow(deprecated)]

use crate::TreeModel;
use glib::{
    prelude::*,
    signal::{connect_raw, SignalHandlerId},
    translate::*,
};
use std::{boxed::Box as Box_, fmt, mem::transmute};

glib::wrapper! {
    /// There is no replacement for this interface. You should
    ///   use [`SortListModel`][crate::SortListModel] to wrap your list model instead
    /// The interface for sortable models used by GtkTreeView
    ///
    /// [`TreeSortable`][crate::TreeSortable] is an interface to be implemented by tree models which
    /// support sorting. The [`TreeView`][crate::TreeView] uses the methods provided by this interface
    /// to sort the model.
    ///
    /// ## Signals
    ///
    ///
    /// #### `sort-column-changed`
    ///  The ::sort-column-changed signal is emitted when the sort column
    /// or sort order of @sortable is changed. The signal is emitted before
    /// the contents of @sortable are resorted.
    ///
    ///
    /// <details><summary><h4>TreeModel</h4></summary>
    ///
    ///
    /// #### `row-changed`
    ///  This signal is emitted when a row in the model has changed.
    ///
    ///
    ///
    ///
    /// #### `row-deleted`
    ///  This signal is emitted when a row has been deleted.
    ///
    /// Note that no iterator is passed to the signal handler,
    /// since the row is already deleted.
    ///
    /// This should be called by models after a row has been removed.
    /// The location pointed to by @path should be the location that
    /// the row previously was at. It may not be a valid location anymore.
    ///
    ///
    ///
    ///
    /// #### `row-has-child-toggled`
    ///  This signal is emitted when a row has gotten the first child
    /// row or lost its last child row.
    ///
    ///
    ///
    ///
    /// #### `row-inserted`
    ///  This signal is emitted when a new row has been inserted in
    /// the model.
    ///
    /// Note that the row may still be empty at this point, since
    /// it is a common pattern to first insert an empty row, and
    /// then fill it with the desired values.
    ///
    ///
    ///
    ///
    /// #### `rows-reordered`
    ///  This signal is emitted when the children of a node in the
    /// [`TreeModel`][crate::TreeModel] have been reordered.
    ///
    /// Note that this signal is not emitted
    /// when rows are reordered by DND, since this is implemented
    /// by removing and then reinserting the row.
    ///
    ///
    /// </details>
    ///
    /// # Implements
    ///
    /// [`TreeSortableExt`][trait@crate::prelude::TreeSortableExt], [`TreeModelExt`][trait@crate::prelude::TreeModelExt], [`TreeSortableExtManual`][trait@crate::prelude::TreeSortableExtManual], [`TreeModelExtManual`][trait@crate::prelude::TreeModelExtManual]
    #[doc(alias = "GtkTreeSortable")]
    pub struct TreeSortable(Interface<ffi::GtkTreeSortable, ffi::GtkTreeSortableIface>) @requires TreeModel;

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

impl TreeSortable {
    pub const NONE: Option<&'static TreeSortable> = None;
}

/// Trait containing all [`struct@TreeSortable`] methods.
///
/// # Implementors
///
/// [`ListStore`][struct@crate::ListStore], [`TreeModelSort`][struct@crate::TreeModelSort], [`TreeSortable`][struct@crate::TreeSortable], [`TreeStore`][struct@crate::TreeStore]
pub trait TreeSortableExt: 'static {
    /// Returns [`true`] if the model has a default sort function. This is used
    /// primarily by GtkTreeViewColumns in order to determine if a model can
    /// go back to the default state, or not.
    ///
    /// # Deprecated since 4.10
    ///
    ///
    /// # Returns
    ///
    /// [`true`], if the model has a default sort function
    #[cfg_attr(feature = "v4_10", deprecated = "Since 4.10")]
    #[allow(deprecated)]
    #[doc(alias = "gtk_tree_sortable_has_default_sort_func")]
    fn has_default_sort_func(&self) -> bool;

    /// Emits a `GtkTreeSortable::sort-column-changed` signal on @self.
    ///
    /// # Deprecated since 4.10
    ///
    #[cfg_attr(feature = "v4_10", deprecated = "Since 4.10")]
    #[allow(deprecated)]
    #[doc(alias = "gtk_tree_sortable_sort_column_changed")]
    fn sort_column_changed(&self);

    /// The ::sort-column-changed signal is emitted when the sort column
    /// or sort order of @sortable is changed. The signal is emitted before
    /// the contents of @sortable are resorted.
    #[doc(alias = "sort-column-changed")]
    fn connect_sort_column_changed<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
}

impl<O: IsA<TreeSortable>> TreeSortableExt for O {
    #[allow(deprecated)]
    fn has_default_sort_func(&self) -> bool {
        unsafe {
            from_glib(ffi::gtk_tree_sortable_has_default_sort_func(
                self.as_ref().to_glib_none().0,
            ))
        }
    }

    #[allow(deprecated)]
    fn sort_column_changed(&self) {
        unsafe {
            ffi::gtk_tree_sortable_sort_column_changed(self.as_ref().to_glib_none().0);
        }
    }

    fn connect_sort_column_changed<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
        unsafe extern "C" fn sort_column_changed_trampoline<
            P: IsA<TreeSortable>,
            F: Fn(&P) + 'static,
        >(
            this: *mut ffi::GtkTreeSortable,
            f: glib::ffi::gpointer,
        ) {
            let f: &F = &*(f as *const F);
            f(TreeSortable::from_glib_borrow(this).unsafe_cast_ref())
        }
        unsafe {
            let f: Box_<F> = Box_::new(f);
            connect_raw(
                self.as_ptr() as *mut _,
                b"sort-column-changed\0".as_ptr() as *const _,
                Some(transmute::<_, unsafe extern "C" fn()>(
                    sort_column_changed_trampoline::<Self, F> as *const (),
                )),
                Box_::into_raw(f),
            )
        }
    }
}

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