gio/
list_store.rs

1// Copyright 2018, The Gtk-rs Project Developers.
2// See the COPYRIGHT file at the top-level directory of this distribution.
3// Licensed under the MIT license, see the LICENSE file or <http://opensource.org/licenses/MIT>
4
5use 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}