Last active
August 29, 2015 22:06
-
-
Save GuillaumeGomez/6c36dc4f8161c9dc016f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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