diff --git a/examples/hello_world.rs b/examples/hello_world.rs index 92396c5..8c7e9a6 100644 --- a/examples/hello_world.rs +++ b/examples/hello_world.rs @@ -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)); diff --git a/src/lib.rs b/src/lib.rs index 9903bdf..30d7f23 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -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>, 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>, 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) } }