From 9e78e860000a14e1609d09adf4a0c1cd1b5527a6 Mon Sep 17 00:00:00 2001 From: Cameron Hart Date: Sun, 17 Jan 2016 20:05:30 +1100 Subject: [PATCH] Add support for popups and selectable widgets. --- examples/test_window_impl.rs | 26 ++++++++++++++++++++++++++ src/lib.rs | 23 +++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/examples/test_window_impl.rs b/examples/test_window_impl.rs index 28a645c..e2bcfb9 100644 --- a/examples/test_window_impl.rs +++ b/examples/test_window_impl.rs @@ -44,6 +44,7 @@ struct State { vec3i: [i32;3], col1: [f32;3], col2: [f32;4], + selected_fish: Option, auto_resize_state: AutoResizeState, file_menu: FileMenuState } @@ -90,6 +91,7 @@ impl Default for State { vec3i: [10, 20, 30], col1: [1.0, 0.0, 0.2], col2: [0.4, 0.7, 0.0, 0.5], + selected_fish: None, auto_resize_state: Default::default(), file_menu: Default::default() } @@ -335,6 +337,30 @@ fn show_test_window<'a>(ui: &Ui<'a>, state: &mut State, opened: &mut bool) { ui.spacing(); }); } + if ui.collapsing_header(im_str!("Popups & Modal windows")).build() { + ui.tree_node(im_str!("Popups")).build(|| { + ui.text_wrapped(im_str!("When a popup is active, it inhibits interacting with windows that are behind the popup. Clicking outside the popup closes it.")); + let names = [im_str!("Bream"), im_str!("Haddock"), im_str!("Mackerel"), im_str!("Pollock"), im_str!("Tilefish")]; + if ui.small_button(im_str!("Select..")) { + ui.open_popup(im_str!("select")); + } + ui.same_line(0.0); + ui.text( + match state.selected_fish { + Some(index) => names[index].clone(), + None => im_str!("") + }); + ui.popup(im_str!("select"), || { + ui.text(im_str!("Aquarium")); + ui.separator(); + for (index, name) in names.iter().enumerate() { + if ui.selectable(name.clone()) { + state.selected_fish = Some(index); + } + } + }); + }); + } }) } diff --git a/src/lib.rs b/src/lib.rs index aae068c..5341feb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -24,6 +24,8 @@ pub use imgui_sys::{ ImGuiInputTextFlags_AllowTabInput, ImGuiInputTextFlags_CtrlEnterForNewLine, ImGuiInputTextFlags_NoHorizontalScroll, ImGuiInputTextFlags_AlwaysInsertMode, ImGuiInputTextFlags_ReadOnly, + ImGuiSelectableFlags, + ImGuiSelectableFlags_DontClosePopups, ImGuiSelectableFlags_SpanAllColumns, ImGuiSetCond, ImGuiSetCond_Always, ImGuiSetCond_Once, ImGuiSetCond_FirstUseEver, ImGuiSetCond_Appearing, @@ -518,6 +520,13 @@ impl<'ui> Ui<'ui> { } } +// Widgets: Selectable / Lists +impl<'ui> Ui<'ui> { + pub fn selectable<'p>(&self, label: ImStr<'p>) -> bool { + unsafe { imgui_sys::igSelectable(label.as_ptr(), false, ImGuiSelectableFlags::empty(), ImVec2::new(0.0,0.0)) } + } +} + // Widgets: Menus impl<'ui> Ui<'ui> { pub fn main_menu_bar(&self, f: F) where F: FnOnce() { @@ -537,3 +546,17 @@ impl<'ui> Ui<'ui> { pub fn menu<'p>(&self, label: ImStr<'p>) -> Menu<'ui, 'p> { Menu::new(label) } pub fn menu_item<'p>(&self, label: ImStr<'p>) -> MenuItem<'ui, 'p> { MenuItem::new(label) } } + +// Widgets: Popups +impl<'ui> Ui<'ui> { + pub fn open_popup<'p>(&self, str_id: ImStr<'p>) { + unsafe { imgui_sys::igOpenPopup(str_id.as_ptr()) }; + } + pub fn popup<'p, F>(&self, str_id: ImStr<'p>, f: F) where F: FnOnce() { + let render = unsafe { imgui_sys::igBeginPopup(str_id.as_ptr()) }; + if render { + f(); + unsafe { imgui_sys::igEndPopup() }; + } + } +}