1use gio_sys;
6use glib;
7use glib::translate::*;
8use glib::{IsA, Object};
9use glib_sys;
10use gobject_sys;
11use std::cmp::Ordering;
12use ListStore;
13
14pub trait ListStoreExtManual {
15 fn insert_sorted<P: IsA<glib::Object>, F: FnMut(&Object, &Object) -> Ordering>(
16 &self,
17 item: &P,
18 compare_func: F,
19 ) -> u32;
20
21 #[cfg(any(feature = "v2_46", feature = "dox"))]
22 fn sort<F: FnMut(&Object, &Object) -> Ordering>(&self, compare_func: F);
23}
24
25impl<O: IsA<ListStore>> ListStoreExtManual for O {
26 fn insert_sorted<P: IsA<glib::Object>, F: FnMut(&Object, &Object) -> Ordering>(
27 &self,
28 item: &P,
29 compare_func: F,
30 ) -> u32 {
31 unsafe {
32 let mut func = compare_func;
33 let func_obj: &mut (dyn FnMut(&Object, &Object) -> Ordering) = &mut func;
34 let func_ptr = &func_obj as *const &mut (dyn FnMut(&Object, &Object) -> Ordering)
35 as glib_sys::gpointer;
36
37 gio_sys::g_list_store_insert_sorted(
38 self.as_ref().to_glib_none().0,
39 item.as_ref().to_glib_none().0,
40 Some(compare_func_trampoline),
41 func_ptr,
42 )
43 }
44 }
45
46 #[cfg(any(feature = "v2_46", feature = "dox"))]
47 fn sort<F: FnMut(&Object, &Object) -> Ordering>(&self, compare_func: F) {
48 unsafe {
49 let mut func = compare_func;
50 let func_obj: &mut (dyn FnMut(&Object, &Object) -> Ordering) = &mut func;
51 let func_ptr = &func_obj as *const &mut (dyn FnMut(&Object, &Object) -> Ordering)
52 as glib_sys::gpointer;
53
54 gio_sys::g_list_store_sort(
55 self.as_ref().to_glib_none().0,
56 Some(compare_func_trampoline),
57 func_ptr,
58 )
59 }
60 }
61}
62
63unsafe extern "C" fn compare_func_trampoline(
64 a: glib_sys::gconstpointer,
65 b: glib_sys::gconstpointer,
66 func: glib_sys::gpointer,
67) -> i32 {
68 let func = func as *mut &mut (dyn FnMut(&Object, &Object) -> Ordering);
69
70 let a = from_glib_borrow(a as *mut gobject_sys::GObject);
71 let b = from_glib_borrow(b as *mut gobject_sys::GObject);
72
73 match (*func)(&a, &b) {
74 Ordering::Less => -1,
75 Ordering::Equal => 0,
76 Ordering::Greater => 1,
77 }
78}