1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
use imgui_sys;
use std::marker::PhantomData;
use super::{ImGuiSetCond, ImGuiTreeNodeFlags, ImGuiTreeNodeFlags_Bullet,
ImGuiTreeNodeFlags_DefaultOpen, ImGuiTreeNodeFlags_Leaf,
ImGuiTreeNodeFlags_OpenOnArrow, ImGuiTreeNodeFlags_OpenOnDoubleClick,
ImGuiTreeNodeFlags_Selected, ImStr, Ui};
#[must_use]
pub struct TreeNode<'ui, 'p> {
id: ImStr<'p>,
label: Option<ImStr<'p>>,
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(mut self, label: ImStr<'p>) -> Self {
self.label = Some(label);
self
}
#[inline]
pub fn opened(mut self, opened: bool, cond: ImGuiSetCond) -> Self {
self.opened = opened;
self.opened_cond = cond;
self
}
pub fn build<F: FnOnce()>(self, f: F) {
let render = unsafe {
if !self.opened_cond.is_empty() {
imgui_sys::igSetNextTreeNodeOpen(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() };
}
}
}
#[must_use]
pub struct CollapsingHeader<'ui, 'p> {
label: ImStr<'p>,
flags: ImGuiTreeNodeFlags,
_phantom: PhantomData<&'ui Ui<'ui>>,
}
impl<'ui, 'p> CollapsingHeader<'ui, 'p> {
pub fn new(label: ImStr<'p>) -> Self {
CollapsingHeader {
label: label,
flags: ImGuiTreeNodeFlags::empty(),
_phantom: PhantomData,
}
}
#[inline]
pub fn flags(mut self, flags: ImGuiTreeNodeFlags) -> Self {
self.flags = flags;
self
}
#[inline]
pub fn selected(mut self, value: bool) -> Self {
self.flags.set(ImGuiTreeNodeFlags_Selected, value);
self
}
#[inline]
pub fn default_open(mut self, value: bool) -> Self {
self.flags.set(ImGuiTreeNodeFlags_DefaultOpen, value);
self
}
#[inline]
pub fn open_on_double_click(mut self, value: bool) -> Self {
self.flags.set(ImGuiTreeNodeFlags_OpenOnDoubleClick, value);
self
}
#[inline]
pub fn open_on_arrow(mut self, value: bool) -> Self {
self.flags.set(ImGuiTreeNodeFlags_OpenOnArrow, value);
self
}
#[inline]
pub fn leaf(mut self, value: bool) -> Self {
self.flags.set(ImGuiTreeNodeFlags_Leaf, value);
self
}
#[inline]
pub fn bullet(mut self, value: bool) -> Self {
self.flags.set(ImGuiTreeNodeFlags_Bullet, value);
self
}
pub fn build(self) -> bool {
unsafe { imgui_sys::igCollapsingHeader(self.label.as_ptr(), self.flags) }
}
}