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    /// Gets the order that @self conforms to.
15    ///
16    /// See [`SorterOrder`][crate::SorterOrder] for details
17    /// of the possible return values.
18    ///
19    /// This function is intended to allow optimizations.
20    ///
21    /// # Returns
22    ///
23    /// The order
24    #[doc(alias = "get_order")]
25    fn order(&self) -> SorterOrder {
26        self.parent_order()
27    }
28}
29
30pub trait SorterImplExt: SorterImpl {
31    fn parent_compare(&self, item1: &Object, item2: &Object) -> Ordering {
32        unsafe {
33            let data = Self::type_data();
34            let parent_class = data.as_ref().parent_class() as *mut ffi::GtkSorterClass;
35            let f = (*parent_class)
36                .compare
37                .expect("No parent class impl for \"compare\"");
38            from_glib(f(
39                self.obj().unsafe_cast_ref::<Sorter>().to_glib_none().0,
40                item1.to_glib_none().0,
41                item2.to_glib_none().0,
42            ))
43        }
44    }
45
46    fn parent_order(&self) -> SorterOrder {
47        unsafe {
48            let data = Self::type_data();
49            let parent_class = data.as_ref().parent_class() as *mut ffi::GtkSorterClass;
50            let f = (*parent_class)
51                .get_order
52                .expect("No parent class impl for \"get_order\"");
53            from_glib(f(self.obj().unsafe_cast_ref::<Sorter>().to_glib_none().0))
54        }
55    }
56}
57
58impl<T: SorterImpl> SorterImplExt for T {}
59
60unsafe impl<T: SorterImpl> IsSubclassable<T> for Sorter {
61    fn class_init(class: &mut glib::Class<Self>) {
62        Self::parent_class_init::<T>(class);
63
64        assert_initialized_main_thread!();
65
66        let klass = class.as_mut();
67        klass.compare = Some(sorter_compare::<T>);
68        klass.get_order = Some(sorter_get_order::<T>);
69    }
70}
71
72unsafe extern "C" fn sorter_compare<T: SorterImpl>(
73    ptr: *mut ffi::GtkSorter,
74    item1ptr: *mut glib::gobject_ffi::GObject,
75    item2ptr: *mut glib::gobject_ffi::GObject,
76) -> ffi::GtkOrdering {
77    let instance = &*(ptr as *mut T::Instance);
78    let imp = instance.imp();
79
80    imp.compare(&from_glib_borrow(item1ptr), &from_glib_borrow(item2ptr))
81        .into_glib()
82}
83
84unsafe extern "C" fn sorter_get_order<T: SorterImpl>(
85    ptr: *mut ffi::GtkSorter,
86) -> ffi::GtkSorterOrder {
87    let instance = &*(ptr as *mut T::Instance);
88    let imp = instance.imp();
89
90    imp.order().into_glib()
91}