gtk4/subclass/
tree_model_filter.rs1use glib::{translate::*, Value};
7
8use crate::{ffi, prelude::*, subclass::prelude::*, TreeIter, TreeModel, TreeModelFilter};
9
10#[cfg_attr(feature = "v4_10", deprecated = "Since 4.10")]
11#[allow(deprecated)]
12pub trait TreeModelFilterImpl: ObjectImpl + ObjectSubclass<Type: IsA<TreeModelFilter>> {
13 fn visible<M: IsA<TreeModel>>(&self, child_model: &M, iter: &TreeIter) -> bool {
14 self.parent_visible(child_model, iter)
15 }
16
17 fn modify<M: IsA<TreeModel>>(
18 &self,
19 child_model: &M,
20 iter: &TreeIter,
21 value: Value,
22 column: i32,
23 ) {
24 self.parent_modify(child_model, iter, value, column)
25 }
26}
27
28#[cfg_attr(feature = "v4_10", deprecated = "Since 4.10")]
29#[allow(deprecated)]
30pub trait TreeModelFilterImplExt: TreeModelFilterImpl {
31 fn parent_visible<M: IsA<TreeModel>>(&self, child_model: &M, iter: &TreeIter) -> bool {
33 unsafe {
34 let data = Self::type_data();
35 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTreeModelFilterClass;
36 if let Some(f) = (*parent_class).visible {
37 from_glib(f(
38 self.obj()
39 .unsafe_cast_ref::<TreeModelFilter>()
40 .to_glib_none()
41 .0,
42 child_model.as_ref().to_glib_none().0,
43 iter.to_glib_none().0 as *mut _,
44 ))
45 } else {
46 true }
48 }
49 }
50
51 fn parent_modify<M: IsA<TreeModel>>(
52 &self,
53 child_model: &M,
54 iter: &TreeIter,
55 value: Value,
56 index: i32,
57 ) {
58 unsafe {
59 let data = Self::type_data();
60 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTreeModelFilterClass;
61 if let Some(f) = (*parent_class).modify {
62 f(
63 self.obj()
64 .unsafe_cast_ref::<TreeModelFilter>()
65 .to_glib_none()
66 .0,
67 child_model.as_ref().to_glib_none().0,
68 iter.to_glib_none().0 as *mut _,
69 value.to_glib_none().0 as *mut _,
70 index,
71 )
72 }
73 }
74 }
75}
76
77impl<T: TreeModelFilterImpl> TreeModelFilterImplExt for T {}
78
79unsafe impl<T: TreeModelFilterImpl> IsSubclassable<T> for TreeModelFilter {
80 fn class_init(class: &mut glib::Class<Self>) {
81 Self::parent_class_init::<T>(class);
82
83 assert_initialized_main_thread!();
84
85 let klass = class.as_mut();
86 klass.visible = Some(tree_model_filter_visible::<T>);
87 klass.modify = Some(tree_model_filter_modify::<T>);
88 }
89}
90
91unsafe extern "C" fn tree_model_filter_visible<T: TreeModelFilterImpl>(
92 ptr: *mut ffi::GtkTreeModelFilter,
93 child_modelptr: *mut ffi::GtkTreeModel,
94 iterptr: *mut ffi::GtkTreeIter,
95) -> glib::ffi::gboolean {
96 let instance = &*(ptr as *mut T::Instance);
97 let imp = instance.imp();
98 let child_model: Borrowed<TreeModel> = from_glib_borrow(child_modelptr);
99 let iter: Borrowed<TreeIter> = from_glib_borrow(iterptr);
100
101 imp.visible(&*child_model, &iter).into_glib()
102}
103
104unsafe extern "C" fn tree_model_filter_modify<T: TreeModelFilterImpl>(
105 ptr: *mut ffi::GtkTreeModelFilter,
106 child_modelptr: *mut ffi::GtkTreeModel,
107 iterptr: *mut ffi::GtkTreeIter,
108 valueptr: *mut glib::gobject_ffi::GValue,
109 column: i32,
110) {
111 let instance = &*(ptr as *mut T::Instance);
112 let imp = instance.imp();
113 let child_model: Borrowed<TreeModel> = from_glib_borrow(child_modelptr);
114 let iter: Borrowed<TreeIter> = from_glib_borrow(iterptr);
115 let value: Value = from_glib_full(valueptr);
116
117 imp.modify(&*child_model, &iter, value, column)
118}