dear_imgui_rs/widget/table/
options.rs1use crate::sys;
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5bitflags::bitflags! {
6 #[repr(transparent)]
11 #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
12 pub struct TableFlags: i32 {
13 const NONE = 0;
15 const RESIZABLE = sys::ImGuiTableFlags_Resizable as i32;
17 const REORDERABLE = sys::ImGuiTableFlags_Reorderable as i32;
19 const HIDEABLE = sys::ImGuiTableFlags_Hideable as i32;
21 const SORTABLE = sys::ImGuiTableFlags_Sortable as i32;
23 const NO_SAVED_SETTINGS = sys::ImGuiTableFlags_NoSavedSettings as i32;
25 const CONTEXT_MENU_IN_BODY = sys::ImGuiTableFlags_ContextMenuInBody as i32;
27 const ROW_BG = sys::ImGuiTableFlags_RowBg as i32;
29 const BORDERS_INNER_H = sys::ImGuiTableFlags_BordersInnerH as i32;
31 const BORDERS_OUTER_H = sys::ImGuiTableFlags_BordersOuterH as i32;
33 const BORDERS_INNER_V = sys::ImGuiTableFlags_BordersInnerV as i32;
35 const BORDERS_OUTER_V = sys::ImGuiTableFlags_BordersOuterV as i32;
37 const BORDERS_H = Self::BORDERS_INNER_H.bits() | Self::BORDERS_OUTER_H.bits();
39 const BORDERS_V = Self::BORDERS_INNER_V.bits() | Self::BORDERS_OUTER_V.bits();
41 const BORDERS_INNER = Self::BORDERS_INNER_V.bits() | Self::BORDERS_INNER_H.bits();
43 const BORDERS_OUTER = Self::BORDERS_OUTER_V.bits() | Self::BORDERS_OUTER_H.bits();
45 const BORDERS = Self::BORDERS_INNER.bits() | Self::BORDERS_OUTER.bits();
47 const NO_BORDERS_IN_BODY = sys::ImGuiTableFlags_NoBordersInBody as i32;
49 const NO_BORDERS_IN_BODY_UNTIL_RESIZE = sys::ImGuiTableFlags_NoBordersInBodyUntilResize as i32;
51 const NO_HOST_EXTEND_X = sys::ImGuiTableFlags_NoHostExtendX as i32;
53 const NO_HOST_EXTEND_Y = sys::ImGuiTableFlags_NoHostExtendY as i32;
55 const NO_KEEP_COLUMNS_VISIBLE = sys::ImGuiTableFlags_NoKeepColumnsVisible as i32;
57 const PRECISE_WIDTHS = sys::ImGuiTableFlags_PreciseWidths as i32;
59 const NO_CLIP = sys::ImGuiTableFlags_NoClip as i32;
61 const PAD_OUTER_X = sys::ImGuiTableFlags_PadOuterX as i32;
63 const NO_PAD_OUTER_X = sys::ImGuiTableFlags_NoPadOuterX as i32;
65 const NO_PAD_INNER_X = sys::ImGuiTableFlags_NoPadInnerX as i32;
67 const SCROLL_X = sys::ImGuiTableFlags_ScrollX as i32;
69 const SCROLL_Y = sys::ImGuiTableFlags_ScrollY as i32;
71 const SORT_MULTI = sys::ImGuiTableFlags_SortMulti as i32;
73 const SORT_TRISTATE = sys::ImGuiTableFlags_SortTristate as i32;
75 const HIGHLIGHT_HOVERED_COLUMN = sys::ImGuiTableFlags_HighlightHoveredColumn as i32;
77 }
78}
79
80#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
82pub enum TableSizingPolicy {
83 FixedFit,
85 FixedSame,
87 StretchProp,
89 StretchSame,
91}
92
93impl TableSizingPolicy {
94 #[inline]
95 const fn raw(self) -> i32 {
96 match self {
97 Self::FixedFit => sys::ImGuiTableFlags_SizingFixedFit as i32,
98 Self::FixedSame => sys::ImGuiTableFlags_SizingFixedSame as i32,
99 Self::StretchProp => sys::ImGuiTableFlags_SizingStretchProp as i32,
100 Self::StretchSame => sys::ImGuiTableFlags_SizingStretchSame as i32,
101 }
102 }
103}
104
105#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
108pub struct TableOptions {
109 pub flags: TableFlags,
110 pub sizing_policy: Option<TableSizingPolicy>,
111}
112
113impl Default for TableOptions {
114 fn default() -> Self {
115 Self::new()
116 }
117}
118
119impl TableOptions {
120 pub const fn new() -> Self {
121 Self {
122 flags: TableFlags::NONE,
123 sizing_policy: None,
124 }
125 }
126
127 pub fn flags(mut self, flags: TableFlags) -> Self {
128 self.flags = flags;
129 self
130 }
131
132 pub fn sizing_policy(mut self, policy: TableSizingPolicy) -> Self {
133 self.sizing_policy = Some(policy);
134 self
135 }
136
137 pub fn bits(self) -> i32 {
138 self.raw()
139 }
140
141 #[inline]
142 pub(crate) fn raw(self) -> i32 {
143 self.flags.bits() | self.sizing_policy.map_or(0, TableSizingPolicy::raw)
144 }
145
146 #[inline]
147 pub(crate) fn validate(self, caller: &str) {
148 let unsupported_flags = self.flags.bits() & !TableFlags::all().bits();
149 assert!(
150 unsupported_flags == 0,
151 "{caller} received non-independent ImGuiTableFlags bits: 0x{unsupported_flags:X}"
152 );
153 let bits = self.raw();
154 let sizing_mask = sys::ImGuiTableFlags_SizingMask_ as i32;
155 let supported = TableFlags::all().bits() | sizing_mask;
156 let unsupported = bits & !supported;
157 assert!(
158 unsupported == 0,
159 "{caller} received unsupported ImGuiTableFlags bits: 0x{unsupported:X}"
160 );
161 let sizing_policy = bits & sizing_mask;
162 assert!(
163 is_valid_table_sizing_policy(sizing_policy),
164 "{caller} received invalid table sizing policy bits: 0x{sizing_policy:X}"
165 );
166 }
167}
168
169#[inline]
170const fn is_valid_table_sizing_policy(bits: i32) -> bool {
171 bits == 0
172 || bits == TableSizingPolicy::FixedFit.raw()
173 || bits == TableSizingPolicy::FixedSame.raw()
174 || bits == TableSizingPolicy::StretchProp.raw()
175 || bits == TableSizingPolicy::StretchSame.raw()
176}
177
178impl From<TableFlags> for TableOptions {
179 fn from(flags: TableFlags) -> Self {
180 Self::new().flags(flags)
181 }
182}
183
184#[cfg(feature = "serde")]
185impl Serialize for TableFlags {
186 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
187 where
188 S: serde::Serializer,
189 {
190 serializer.serialize_i32(self.bits())
191 }
192}
193
194#[cfg(feature = "serde")]
195impl<'de> Deserialize<'de> for TableFlags {
196 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
197 where
198 D: serde::Deserializer<'de>,
199 {
200 let bits = i32::deserialize(deserializer)?;
201 Ok(TableFlags::from_bits_retain(bits))
202 }
203}
204
205bitflags::bitflags! {
206 #[repr(transparent)]
211 #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
212 pub struct TableColumnFlags: i32 {
213 const NONE = 0;
215 const DISABLED = sys::ImGuiTableColumnFlags_Disabled as i32;
217 const DEFAULT_HIDE = sys::ImGuiTableColumnFlags_DefaultHide as i32;
219 const DEFAULT_SORT = sys::ImGuiTableColumnFlags_DefaultSort as i32;
221 const NO_RESIZE = sys::ImGuiTableColumnFlags_NoResize as i32;
223 const NO_REORDER = sys::ImGuiTableColumnFlags_NoReorder as i32;
225 const NO_HIDE = sys::ImGuiTableColumnFlags_NoHide as i32;
227 const NO_CLIP = sys::ImGuiTableColumnFlags_NoClip as i32;
229 const NO_SORT = sys::ImGuiTableColumnFlags_NoSort as i32;
231 const NO_SORT_ASCENDING = sys::ImGuiTableColumnFlags_NoSortAscending as i32;
233 const NO_SORT_DESCENDING = sys::ImGuiTableColumnFlags_NoSortDescending as i32;
235 const NO_HEADER_LABEL = sys::ImGuiTableColumnFlags_NoHeaderLabel as i32;
237 const NO_HEADER_WIDTH = sys::ImGuiTableColumnFlags_NoHeaderWidth as i32;
239 const PREFER_SORT_ASCENDING = sys::ImGuiTableColumnFlags_PreferSortAscending as i32;
241 const PREFER_SORT_DESCENDING = sys::ImGuiTableColumnFlags_PreferSortDescending as i32;
243 const ANGLED_HEADER = sys::ImGuiTableColumnFlags_AngledHeader as i32;
245 }
246}
247
248#[derive(Clone, Copy, Debug, PartialEq)]
250pub enum TableColumnWidth {
251 Fixed(f32),
253 Stretch(f32),
255}
256
257impl TableColumnWidth {
258 pub const fn fixed(width: f32) -> Self {
259 Self::Fixed(width)
260 }
261
262 pub const fn stretch(weight: f32) -> Self {
263 Self::Stretch(weight)
264 }
265
266 #[inline]
267 pub(crate) const fn raw_flags(self) -> i32 {
268 match self {
269 Self::Fixed(_) => sys::ImGuiTableColumnFlags_WidthFixed as i32,
270 Self::Stretch(_) => sys::ImGuiTableColumnFlags_WidthStretch as i32,
271 }
272 }
273
274 #[inline]
275 pub(crate) const fn value(self) -> f32 {
276 match self {
277 Self::Fixed(value) | Self::Stretch(value) => value,
278 }
279 }
280}
281
282#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
284pub enum TableColumnIndent {
285 Enable,
287 Disable,
289}
290
291impl TableColumnIndent {
292 #[inline]
293 pub const fn bits(self) -> i32 {
294 self.raw_flags()
295 }
296
297 #[inline]
298 pub(crate) const fn raw_flags(self) -> i32 {
299 match self {
300 Self::Enable => sys::ImGuiTableColumnFlags_IndentEnable as i32,
301 Self::Disable => sys::ImGuiTableColumnFlags_IndentDisable as i32,
302 }
303 }
304}
305
306bitflags::bitflags! {
307 #[repr(transparent)]
309 #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
310 pub struct TableColumnStateFlags: i32 {
311 const NONE = 0;
313 const DISABLED = sys::ImGuiTableColumnFlags_Disabled as i32;
315 const DEFAULT_HIDE = sys::ImGuiTableColumnFlags_DefaultHide as i32;
317 const DEFAULT_SORT = sys::ImGuiTableColumnFlags_DefaultSort as i32;
319 const WIDTH_FIXED = sys::ImGuiTableColumnFlags_WidthFixed as i32;
321 const WIDTH_STRETCH = sys::ImGuiTableColumnFlags_WidthStretch as i32;
323 const NO_RESIZE = sys::ImGuiTableColumnFlags_NoResize as i32;
325 const NO_REORDER = sys::ImGuiTableColumnFlags_NoReorder as i32;
327 const NO_HIDE = sys::ImGuiTableColumnFlags_NoHide as i32;
329 const NO_CLIP = sys::ImGuiTableColumnFlags_NoClip as i32;
331 const NO_SORT = sys::ImGuiTableColumnFlags_NoSort as i32;
333 const NO_SORT_ASCENDING = sys::ImGuiTableColumnFlags_NoSortAscending as i32;
335 const NO_SORT_DESCENDING = sys::ImGuiTableColumnFlags_NoSortDescending as i32;
337 const NO_HEADER_LABEL = sys::ImGuiTableColumnFlags_NoHeaderLabel as i32;
339 const NO_HEADER_WIDTH = sys::ImGuiTableColumnFlags_NoHeaderWidth as i32;
341 const PREFER_SORT_ASCENDING = sys::ImGuiTableColumnFlags_PreferSortAscending as i32;
343 const PREFER_SORT_DESCENDING = sys::ImGuiTableColumnFlags_PreferSortDescending as i32;
345 const INDENT_ENABLE = sys::ImGuiTableColumnFlags_IndentEnable as i32;
347 const INDENT_DISABLE = sys::ImGuiTableColumnFlags_IndentDisable as i32;
349 const ANGLED_HEADER = sys::ImGuiTableColumnFlags_AngledHeader as i32;
351 const IS_ENABLED = sys::ImGuiTableColumnFlags_IsEnabled as i32;
353 const IS_VISIBLE = sys::ImGuiTableColumnFlags_IsVisible as i32;
355 const IS_SORTED = sys::ImGuiTableColumnFlags_IsSorted as i32;
357 const IS_HOVERED = sys::ImGuiTableColumnFlags_IsHovered as i32;
359 }
360}
361
362impl From<TableColumnFlags> for TableColumnStateFlags {
363 fn from(flags: TableColumnFlags) -> Self {
364 Self::from_bits_retain(flags.bits())
365 }
366}
367
368impl TableColumnFlags {
369 #[inline]
370 pub(crate) fn validate_for_setup(
371 self,
372 caller: &str,
373 width: Option<TableColumnWidth>,
374 indent: Option<TableColumnIndent>,
375 ) {
376 let unsupported_flags = self.bits() & !TableColumnFlags::all().bits();
377 assert!(
378 unsupported_flags == 0,
379 "{caller} received non-independent ImGuiTableColumnFlags bits: 0x{unsupported_flags:X}"
380 );
381 let bits = self.bits()
382 | width.map_or(0, TableColumnWidth::raw_flags)
383 | indent.map_or(0, TableColumnIndent::raw_flags);
384 let width_mask = sys::ImGuiTableColumnFlags_WidthMask_ as i32;
385 let indent_mask = sys::ImGuiTableColumnFlags_IndentMask_ as i32;
386 let supported = TableColumnFlags::all().bits() | width_mask | indent_mask;
387 let unsupported = bits & !supported;
388 assert!(
389 unsupported == 0,
390 "{caller} received unsupported ImGuiTableColumnFlags bits: 0x{unsupported:X}"
391 );
392 assert!(
393 (bits & width_mask).count_ones() <= 1,
394 "{caller} accepts at most one table column width policy"
395 );
396 assert!(
397 (bits & indent_mask).count_ones() <= 1,
398 "{caller} accepts at most one table column indent policy"
399 );
400 }
401}
402
403#[cfg(feature = "serde")]
404impl Serialize for TableColumnFlags {
405 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
406 where
407 S: serde::Serializer,
408 {
409 serializer.serialize_i32(self.bits())
410 }
411}
412
413#[cfg(feature = "serde")]
414impl<'de> Deserialize<'de> for TableColumnFlags {
415 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
416 where
417 D: serde::Deserializer<'de>,
418 {
419 let bits = i32::deserialize(deserializer)?;
420 Ok(TableColumnFlags::from_bits_retain(bits))
421 }
422}
423
424#[cfg(feature = "serde")]
425impl Serialize for TableColumnStateFlags {
426 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
427 where
428 S: serde::Serializer,
429 {
430 serializer.serialize_i32(self.bits())
431 }
432}
433
434#[cfg(feature = "serde")]
435impl<'de> Deserialize<'de> for TableColumnStateFlags {
436 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
437 where
438 D: serde::Deserializer<'de>,
439 {
440 let bits = i32::deserialize(deserializer)?;
441 Ok(TableColumnStateFlags::from_bits_retain(bits))
442 }
443}