From b14999b5a28f0603106d7bfe185c5fca4d8c38f4 Mon Sep 17 00:00:00 2001 From: Joonas Javanainen Date: Wed, 26 Aug 2015 11:46:12 +0100 Subject: [PATCH] Trees --- src/lib.rs | 9 +++++++++ src/trees.rs | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 src/trees.rs diff --git a/src/lib.rs b/src/lib.rs index c4245ed..23460e0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -32,11 +32,13 @@ pub use imgui_sys::{ }; pub use menus::{Menu, MenuItem}; pub use sliders::{SliderFloat, SliderInt}; +pub use trees::{TreeNode}; pub use widgets::{CollapsingHeader}; pub use window::{Window}; mod menus; mod sliders; +mod trees; mod widgets; mod window; @@ -305,6 +307,13 @@ impl<'ui> Ui<'ui> { } } +// Widgets: Trees +impl<'ui> Ui<'ui> { + pub fn tree_node<'p>(&self, id: ImStr<'p>) -> TreeNode<'ui, 'p> { + TreeNode::new(id) + } +} + // Widgets: Menus impl<'ui> Ui<'ui> { pub fn main_menu_bar(&self, f: F) where F: FnOnce() { diff --git a/src/trees.rs b/src/trees.rs new file mode 100644 index 0000000..9352059 --- /dev/null +++ b/src/trees.rs @@ -0,0 +1,55 @@ +use imgui_sys; +use std::marker::PhantomData; + +use super::{Ui, ImGuiSetCond, ImStr}; + +pub struct TreeNode<'ui, 'p> { + id: ImStr<'p>, + label: Option>, + opened: bool, + opened_cond: ImGuiSetCond, + _phantom: PhantomData<&'ui Ui<'ui>> +} + +impl<'ui, 'p> TreeNode<'ui, 'p> { + pub fn new(id: ImStr<'p>) -> Self { + TreeNode { + id: id, + label: None, + opened: false, + opened_cond: ImGuiSetCond::empty(), + _phantom: PhantomData + } + } + #[inline] + pub fn label(self, label: ImStr<'p>) -> Self { + TreeNode { + label: Some(label), + .. self + } + } + #[inline] + pub fn opened(self, opened: bool, cond: ImGuiSetCond) -> Self { + TreeNode { + opened: opened, + opened_cond: cond, + .. self + } + } + pub fn build(self, f: F) { + let render = unsafe { + if !self.opened_cond.is_empty() { + imgui_sys::igSetNextTreeNodeOpened(self.opened, self.opened_cond); + } + imgui_sys::igTreeNodeStr( + self.id.as_ptr(), + super::fmt_ptr(), + self.label.unwrap_or(self.id).as_ptr() + ) + }; + if render { + f(); + unsafe { imgui_sys::igTreePop() }; + } + } +}