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