Skip to content

Instantly share code, notes, and snippets.

@GuillaumeGomez
Last active August 29, 2015 22:06
Show Gist options
  • Save GuillaumeGomez/6c36dc4f8161c9dc016f to your computer and use it in GitHub Desktop.
Save GuillaumeGomez/6c36dc4f8161c9dc016f to your computer and use it in GitHub Desktop.
// Copyright 2013-2015, The Rust-GNOME Project Developers.
// See the COPYRIGHT file at the top-level directory of this distribution.
// Licensed under the MIT license, see the LICENSE file or <http://opensource.org/licenses/MIT>
//! TreeSortable is an interface to be implemented by tree models which support sorting. The
//! TreeView uses the methods provided by this interface to sort the model.
use ffi;
use glib::{to_bool};
use std::ptr;
use libc::c_void;
use std::mem::transmute;
use std::cell::RefCell;
unsafe fn into_raw<T>(b: Box<T>) -> *mut T { transmute(b) }
/// The interface for sortable models used by GtkTreeView
pub trait TreeSortableTrait {
fn sort_column_changed(&self) {
unsafe {
ffi::gtk_tree_sortable_sort_column_changed(self.unwrap_pointer())
}
}
fn get_sort_column_id(&self, sort_column_id: &mut i32, order: &mut ::SortType) -> bool {
unsafe {
to_bool(ffi::gtk_tree_sortable_get_sort_column_id(self.unwrap_pointer(),
sort_column_id, order))
}
}
fn set_sort_column_id(&self, sort_column_id: i32, order: ::SortType) {
println!("{:?}", self.unwrap_pointer());
unsafe {
ffi::gtk_tree_sortable_set_sort_column_id(self.unwrap_pointer(),
sort_column_id, order)
}
}
fn set_sort_func(&self, sort_column_id: i32, func: Box<Fn(&::TreeModel, &::TreeIter, &::TreeIter) -> i32>) {
unsafe {
let f: Box<Box<Fn(&::TreeModel, &::TreeIter, &::TreeIter) -> i32>> = Box::new(func);
let s_f: Box<extern "C" fn(*mut ffi::GtkTreeModel, *mut ffi::GtkTreeIter, *mut ffi::GtkTreeIter,
Box<Fn(&::TreeModel, &::TreeIter, &::TreeIter) -> i32>) -> i32> = Box::new(tree_sortable_sort_func);
ffi::gtk_tree_sortable_set_sort_func(self.unwrap_pointer(),
sort_column_id, into_raw(s_f) as *mut c_void, transmute(f), ptr::null_mut())
}
}
fn set_default_sort_func(&self, func: Box<Fn(&::TreeModel, &::TreeIter, &::TreeIter) -> i32>) {
unsafe {
let f: Box<Box<Fn(&::TreeModel, &::TreeIter, &::TreeIter) -> i32>> = Box::new(func);
let s_f: Box<extern "C" fn(*mut ffi::GtkTreeModel, *mut ffi::GtkTreeIter, *mut ffi::GtkTreeIter,
Box<Fn(&::TreeModel, &::TreeIter, &::TreeIter) -> i32>) -> i32> = Box::new(tree_sortable_sort_func);
ffi::gtk_tree_sortable_set_default_sort_func(self.unwrap_pointer(),
into_raw(s_f) as *mut c_void, transmute(f), ptr::null_mut())
}
}
fn has_default_sort_func(&self) -> bool {
unsafe {
to_bool(ffi::gtk_tree_sortable_has_default_sort_func(self.unwrap_pointer()))
}
}
#[doc(hidden)]
fn unwrap_pointer(&self) -> *mut ffi::GtkTreeSortable;
#[doc(hidden)]
fn wrap_pointer(c_treesortable: *mut ffi::GtkTreeSortable) -> ::TreeSortable;
}
extern "C" fn tree_sortable_sort_func(model: *mut ffi::GtkTreeModel, a: *mut ffi::GtkTreeIter, b: *mut ffi::GtkTreeIter,
mut func: Box<Fn(&::TreeModel, &::TreeIter, &::TreeIter) -> i32>) -> i32 {
println!("seems ok");
func(&::TreeModel::wrap_pointer(model), &::TreeIter::wrap_pointer(a), &::TreeIter::wrap_pointer(b))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment