gtk4/subclass/
sorter.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 [`Sorter`].
5
6use glib::{translate::*, Object};
7
8use crate::{ffi, prelude::*, subclass::prelude::*, Ordering, Sorter, SorterOrder};
9
10pub trait SorterImpl: ObjectImpl + ObjectSubclass<Type: IsA<Sorter>> {
11    fn compare(&self, item1: &Object, item2: &Object) -> Ordering {
12        self.parent_compare(item1, item2)
13    }
14    #[doc(alias = "get_order")]
15    fn order(&self) -> SorterOrder {
16        self.parent_order()
17    }
18}
19
20pub trait SorterImplExt: SorterImpl {
21    fn parent_compare(&self, item1: &Object, item2: &Object) -> Ordering {
22        unsafe {
23            let data = Self::type_data();
24            let parent_class = data.as_ref().parent_class() as *mut ffi::GtkSorterClass;
25            let f = (*parent_class)
26                .compare
27                .expect("No parent class impl for \"compare\"");
28            from_glib(f(
29                self.obj().unsafe_cast_ref::<Sorter>().to_glib_none().0,
30                item1.to_glib_none().0,
31                item2.to_glib_none().0,
32            ))
33        }
34    }
35
36    fn parent_order(&self) -> SorterOrder {
37        unsafe {
38            let data = Self::type_data();
39            let parent_class = data.as_ref().parent_class() as *mut ffi::GtkSorterClass;
40            let f = (*parent_class)
41                .get_order
42                .expect("No parent class impl for \"get_order\"");
43            from_glib(f(self.obj().unsafe_cast_ref::<Sorter>().to_glib_none().0))
44        }
45    }
46}
47
48impl<T: SorterImpl> SorterImplExt for T {}
49
50unsafe impl<T: SorterImpl> IsSubclassable<T> for Sorter {
51    fn class_init(class: &mut glib::Class<Self>) {
52        Self::parent_class_init::<T>(class);
53
54        assert_initialized_main_thread!();
55
56        let klass = class.as_mut();
57        klass.compare = Some(sorter_compare::<T>);
58        klass.get_order = Some(sorter_get_order::<T>);
59    }
60}
61
62unsafe extern "C" fn sorter_compare<T: SorterImpl>(
63    ptr: *mut ffi::GtkSorter,
64    item1ptr: *mut glib::gobject_ffi::GObject,
65    item2ptr: *mut glib::gobject_ffi::GObject,
66) -> ffi::GtkOrdering {
67    let instance = &*(ptr as *mut T::Instance);
68    let imp = instance.imp();
69
70    imp.compare(&from_glib_borrow(item1ptr), &from_glib_borrow(item2ptr))
71        .into_glib()
72}
73
74unsafe extern "C" fn sorter_get_order<T: SorterImpl>(
75    ptr: *mut ffi::GtkSorter,
76) -> ffi::GtkSorterOrder {
77    let instance = &*(ptr as *mut T::Instance);
78    let imp = instance.imp();
79
80    imp.order().into_glib()
81}