gtk4/subclass/
tree_model_filter.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3// rustdoc-stripper-ignore-next
4//! Traits intended for subclassing [`TreeModelFilter`].
5
6use 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    // Whether the row indicated by iter is visible
32    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 // always visible if not set
47            }
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}