dear_imgui_rs/widget/multi_select/
options.rs1use crate::sys;
2
3bitflags::bitflags! {
4 #[repr(transparent)]
9 #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
10 pub struct MultiSelectFlags: i32 {
11 const NONE = sys::ImGuiMultiSelectFlags_None as i32;
13 const SINGLE_SELECT = sys::ImGuiMultiSelectFlags_SingleSelect as i32;
15 const NO_SELECT_ALL = sys::ImGuiMultiSelectFlags_NoSelectAll as i32;
17 const NO_RANGE_SELECT = sys::ImGuiMultiSelectFlags_NoRangeSelect as i32;
19 const NO_AUTO_SELECT = sys::ImGuiMultiSelectFlags_NoAutoSelect as i32;
21 const NO_AUTO_CLEAR = sys::ImGuiMultiSelectFlags_NoAutoClear as i32;
23 const NO_AUTO_CLEAR_ON_RESELECT =
25 sys::ImGuiMultiSelectFlags_NoAutoClearOnReselect as i32;
26 const BOX_SELECT_NO_SCROLL = sys::ImGuiMultiSelectFlags_BoxSelectNoScroll as i32;
28 const CLEAR_ON_ESCAPE = sys::ImGuiMultiSelectFlags_ClearOnEscape as i32;
30 const CLEAR_ON_CLICK_VOID = sys::ImGuiMultiSelectFlags_ClearOnClickVoid as i32;
32 const NO_SELECT_ON_RIGHT_CLICK =
34 sys::ImGuiMultiSelectFlags_NoSelectOnRightClick as i32;
35 }
36}
37
38#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
40pub enum MultiSelectBoxSelect {
41 OneDimensional,
43 TwoDimensional,
45}
46
47impl MultiSelectBoxSelect {
48 #[inline]
49 const fn raw(self) -> i32 {
50 match self {
51 Self::OneDimensional => sys::ImGuiMultiSelectFlags_BoxSelect1d as i32,
52 Self::TwoDimensional => sys::ImGuiMultiSelectFlags_BoxSelect2d as i32,
53 }
54 }
55}
56
57#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
59pub enum MultiSelectClickPolicy {
60 Auto,
63 ClickAlways,
65 ClickRelease,
67}
68
69impl MultiSelectClickPolicy {
70 #[inline]
71 const fn raw(self) -> i32 {
72 match self {
73 Self::Auto => sys::ImGuiMultiSelectFlags_SelectOnAuto as i32,
74 Self::ClickAlways => sys::ImGuiMultiSelectFlags_SelectOnClickAlways as i32,
75 Self::ClickRelease => sys::ImGuiMultiSelectFlags_SelectOnClickRelease as i32,
76 }
77 }
78}
79
80#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
82pub enum MultiSelectScopeKind {
83 Window,
85 WindowWithNavWrapX,
87 Rect,
89}
90
91impl MultiSelectScopeKind {
92 #[inline]
93 const fn raw(self) -> i32 {
94 match self {
95 Self::Window => sys::ImGuiMultiSelectFlags_ScopeWindow as i32,
96 Self::WindowWithNavWrapX => {
97 (sys::ImGuiMultiSelectFlags_ScopeWindow | sys::ImGuiMultiSelectFlags_NavWrapX)
98 as i32
99 }
100 Self::Rect => sys::ImGuiMultiSelectFlags_ScopeRect as i32,
101 }
102 }
103}
104
105#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
108pub struct MultiSelectOptions {
109 pub flags: MultiSelectFlags,
110 pub click_policy: Option<MultiSelectClickPolicy>,
111 pub box_select: Option<MultiSelectBoxSelect>,
112 pub scope: Option<MultiSelectScopeKind>,
113}
114
115impl MultiSelectOptions {
116 pub const fn new() -> Self {
117 Self {
118 flags: MultiSelectFlags::NONE,
119 click_policy: None,
120 box_select: None,
121 scope: None,
122 }
123 }
124
125 pub fn flags(mut self, flags: MultiSelectFlags) -> Self {
126 self.flags = flags;
127 self
128 }
129
130 pub fn click_policy(mut self, policy: MultiSelectClickPolicy) -> Self {
131 self.click_policy = Some(policy);
132 self
133 }
134
135 pub fn box_select(mut self, mode: MultiSelectBoxSelect) -> Self {
136 self.box_select = Some(mode);
137 self
138 }
139
140 pub fn scope(mut self, scope: MultiSelectScopeKind) -> Self {
141 self.scope = Some(scope);
142 self
143 }
144
145 pub fn bits(self) -> i32 {
146 self.raw()
147 }
148
149 #[inline]
150 pub(crate) fn raw(self) -> i32 {
151 self.flags.bits()
152 | self.click_policy.map_or(0, MultiSelectClickPolicy::raw)
153 | self.box_select.map_or(0, MultiSelectBoxSelect::raw)
154 | self.scope.map_or(0, MultiSelectScopeKind::raw)
155 }
156}
157
158impl Default for MultiSelectOptions {
159 fn default() -> Self {
160 Self::new()
161 }
162}
163
164impl From<MultiSelectFlags> for MultiSelectOptions {
165 fn from(flags: MultiSelectFlags) -> Self {
166 Self::new().flags(flags)
167 }
168}