combo with callback function added

This commit is contained in:
orhanbalci 2016-05-27 01:19:35 +03:00
parent 7d56866c86
commit bd7e418878
2 changed files with 32 additions and 2 deletions

View File

@ -28,6 +28,15 @@ fn hello_world<'a>(ui: &Ui<'a>) {
.build(|| {
ui.text(im_str!("Hello world!"));
ui.text(im_str!("This...is...imgui-rs!"));
ui.combo3(im_str!("Sample combo"), &mut 1, |idx|{
println!("{} index closure", idx);
match idx {
0 => "zero\0",
1 => "one\0",
2 => "two\0",
_ => "three\0",
}
}, 3,2);
ui.separator();
let mouse_pos = ui.imgui().mouse_pos();
ui.text(im_str!("Mouse Position: ({:.1},{:.1})", mouse_pos.0, mouse_pos.1));

View File

@ -497,19 +497,40 @@ impl<'ui> Ui<'ui> {
pub fn menu_item<'p>(&self, label: ImStr<'p>) -> MenuItem<'ui, 'p> { MenuItem::new(label) }
}
extern "C" fn combo_item_getter(closure : *mut c_void, idx : c_int, out_text : *mut *const c_char)->bool{
let inner_closure : &mut &mut FnMut(i32)->&'static str = unsafe { mem::transmute(closure)};
unsafe{*out_text = inner_closure(idx).as_bytes().as_ptr() as *const c_char;}
//unsafe{*out_text = "orhan\0".as_bytes().as_ptr() as *const c_char;}
true
}
//Widgets: Combos
impl<'ui> Ui<'ui> {
pub fn combo<'p>(&self, label : ImStr<'p>, current_item :&mut i32, items : ImStr<'p>, height_in_items : i32) -> bool {
pub fn combo<'p>(&self, label : ImStr<'p>, current_item : &mut i32, items : &mut Vec<ImStr<'p>>, items_count : i32, height_in_items : i32) -> bool{
let items_inner : Vec<*const c_char> = items.into_iter().map(|item| item.as_ptr()).collect();
unsafe {
imgui_sys::igCombo(label.as_ptr(), current_item, items_inner.as_ptr() as *mut *const c_char, items_count, height_in_items)
}
}
pub fn combo2<'p>(&self, label : ImStr<'p>, current_item :&mut i32, items : ImStr<'p>, height_in_items : i32) -> bool {
unsafe{
imgui_sys::igCombo2(label.as_ptr(), current_item, items.as_ptr(), height_in_items)
}
}
pub fn combo3<'p, F>(&self, label : ImStr<'p>, current_item:&mut i32, mut items_getter : F, items_count : i32, height_in_items : i32) -> bool where F : FnMut(i32)->&'static str{
unsafe{
let callback : &mut FnMut(i32)->&'static str = &mut items_getter;
imgui_sys::igCombo3(label.as_ptr(), current_item, combo_item_getter, callback as *mut _ as *mut c_void , items_count, height_in_items)
}
}
}
//Widgets: ListBox
impl<'ui> Ui<'ui> {
pub fn list_box<'p>(&self, label : ImStr<'p>, current_item : &mut i32, items : &mut Vec<ImStr<'p>>, items_count : i32, height_in_items : i32)-> bool{
unsafe{
let items_inner : Vec<*const c_char> = items.into_iter().map(|item| item.as_ptr()).collect();
unsafe{
imgui_sys::igListBox(label.as_ptr(), current_item, items_inner.as_ptr() as *mut *const c_char,items_count, height_in_items)
}
}