gtk/auto/
tree_model_filter.rs1use glib::object::IsA;
6use glib::translate::*;
7use glib::StaticType;
8use glib::Value;
9use gobject_sys;
10use gtk_sys;
11use std::boxed::Box as Box_;
12use std::fmt;
13use TreeDragSource;
14use TreeIter;
15use TreeModel;
16use TreePath;
17
18glib_wrapper! {
19 pub struct TreeModelFilter(Object<gtk_sys::GtkTreeModelFilter, gtk_sys::GtkTreeModelFilterClass, TreeModelFilterClass>) @implements TreeDragSource, TreeModel;
20
21 match fn {
22 get_type => || gtk_sys::gtk_tree_model_filter_get_type(),
23 }
24}
25
26pub const NONE_TREE_MODEL_FILTER: Option<&TreeModelFilter> = None;
27
28pub trait TreeModelFilterExt: 'static {
29 fn clear_cache(&self);
30
31 fn convert_child_iter_to_iter(&self, child_iter: &TreeIter) -> Option<TreeIter>;
32
33 fn convert_child_path_to_path(&self, child_path: &TreePath) -> Option<TreePath>;
34
35 fn convert_iter_to_child_iter(&self, filter_iter: &TreeIter) -> TreeIter;
36
37 fn convert_path_to_child_path(&self, filter_path: &TreePath) -> Option<TreePath>;
38
39 fn get_model(&self) -> Option<TreeModel>;
40
41 fn refilter(&self);
42
43 fn set_visible_column(&self, column: i32);
46
47 fn set_visible_func<P: Fn(&TreeModel, &TreeIter) -> bool + 'static>(&self, func: P);
48
49 fn get_property_child_model(&self) -> Option<TreeModel>;
50}
51
52impl<O: IsA<TreeModelFilter>> TreeModelFilterExt for O {
53 fn clear_cache(&self) {
54 unsafe {
55 gtk_sys::gtk_tree_model_filter_clear_cache(self.as_ref().to_glib_none().0);
56 }
57 }
58
59 fn convert_child_iter_to_iter(&self, child_iter: &TreeIter) -> Option<TreeIter> {
60 unsafe {
61 let mut filter_iter = TreeIter::uninitialized();
62 let ret = from_glib(gtk_sys::gtk_tree_model_filter_convert_child_iter_to_iter(
63 self.as_ref().to_glib_none().0,
64 filter_iter.to_glib_none_mut().0,
65 mut_override(child_iter.to_glib_none().0),
66 ));
67 if ret {
68 Some(filter_iter)
69 } else {
70 None
71 }
72 }
73 }
74
75 fn convert_child_path_to_path(&self, child_path: &TreePath) -> Option<TreePath> {
76 unsafe {
77 from_glib_full(gtk_sys::gtk_tree_model_filter_convert_child_path_to_path(
78 self.as_ref().to_glib_none().0,
79 mut_override(child_path.to_glib_none().0),
80 ))
81 }
82 }
83
84 fn convert_iter_to_child_iter(&self, filter_iter: &TreeIter) -> TreeIter {
85 unsafe {
86 let mut child_iter = TreeIter::uninitialized();
87 gtk_sys::gtk_tree_model_filter_convert_iter_to_child_iter(
88 self.as_ref().to_glib_none().0,
89 child_iter.to_glib_none_mut().0,
90 mut_override(filter_iter.to_glib_none().0),
91 );
92 child_iter
93 }
94 }
95
96 fn convert_path_to_child_path(&self, filter_path: &TreePath) -> Option<TreePath> {
97 unsafe {
98 from_glib_full(gtk_sys::gtk_tree_model_filter_convert_path_to_child_path(
99 self.as_ref().to_glib_none().0,
100 mut_override(filter_path.to_glib_none().0),
101 ))
102 }
103 }
104
105 fn get_model(&self) -> Option<TreeModel> {
106 unsafe {
107 from_glib_none(gtk_sys::gtk_tree_model_filter_get_model(
108 self.as_ref().to_glib_none().0,
109 ))
110 }
111 }
112
113 fn refilter(&self) {
114 unsafe {
115 gtk_sys::gtk_tree_model_filter_refilter(self.as_ref().to_glib_none().0);
116 }
117 }
118
119 fn set_visible_column(&self, column: i32) {
124 unsafe {
125 gtk_sys::gtk_tree_model_filter_set_visible_column(
126 self.as_ref().to_glib_none().0,
127 column,
128 );
129 }
130 }
131
132 fn set_visible_func<P: Fn(&TreeModel, &TreeIter) -> bool + 'static>(&self, func: P) {
133 let func_data: Box_<P> = Box::new(func);
134 unsafe extern "C" fn func_func<P: Fn(&TreeModel, &TreeIter) -> bool + 'static>(
135 model: *mut gtk_sys::GtkTreeModel,
136 iter: *mut gtk_sys::GtkTreeIter,
137 data: glib_sys::gpointer,
138 ) -> glib_sys::gboolean {
139 let model = from_glib_borrow(model);
140 let iter = from_glib_borrow(iter);
141 let callback: &P = &*(data as *mut _);
142 let res = (*callback)(&model, &iter);
143 res.to_glib()
144 }
145 let func = Some(func_func::<P> as _);
146 unsafe extern "C" fn destroy_func<P: Fn(&TreeModel, &TreeIter) -> bool + 'static>(
147 data: glib_sys::gpointer,
148 ) {
149 let _callback: Box_<P> = Box_::from_raw(data as *mut _);
150 }
151 let destroy_call3 = Some(destroy_func::<P> as _);
152 let super_callback0: Box_<P> = func_data;
153 unsafe {
154 gtk_sys::gtk_tree_model_filter_set_visible_func(
155 self.as_ref().to_glib_none().0,
156 func,
157 Box::into_raw(super_callback0) as *mut _,
158 destroy_call3,
159 );
160 }
161 }
162
163 fn get_property_child_model(&self) -> Option<TreeModel> {
164 unsafe {
165 let mut value = Value::from_type(<TreeModel as StaticType>::static_type());
166 gobject_sys::g_object_get_property(
167 self.to_glib_none().0 as *mut gobject_sys::GObject,
168 b"child-model\0".as_ptr() as *const _,
169 value.to_glib_none_mut().0,
170 );
171 value.get()
172 }
173 }
174}
175
176impl fmt::Display for TreeModelFilter {
177 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
178 write!(f, "TreeModelFilter")
179 }
180}