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")]
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}