gtk4/subclass/
sorter.rs
1use 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")]
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}