dear_imgui/widget/
selectable.rs1#![allow(
2 clippy::cast_possible_truncation,
3 clippy::cast_sign_loss,
4 clippy::as_conversions
5)]
6use crate::Ui;
7use crate::sys;
8
9bitflags::bitflags! {
10 #[repr(transparent)]
12 #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
13 pub struct SelectableFlags: i32 {
14 const NO_AUTO_CLOSE_POPUPS = sys::ImGuiSelectableFlags_NoAutoClosePopups as i32;
16 const SPAN_ALL_COLUMNS = sys::ImGuiSelectableFlags_SpanAllColumns as i32;
18 const ALLOW_DOUBLE_CLICK = sys::ImGuiSelectableFlags_AllowDoubleClick as i32;
20 const DISABLED = sys::ImGuiSelectableFlags_Disabled as i32;
22 const ALLOW_OVERLAP = sys::ImGuiSelectableFlags_AllowOverlap as i32;
24 }
25}
26
27impl Ui {
28 #[doc(alias = "Selectable")]
34 pub fn selectable<T: AsRef<str>>(&self, label: T) -> bool {
35 self.selectable_config(label).build()
36 }
37
38 #[doc(alias = "Selectable")]
40 pub fn selectable_config<T: AsRef<str>>(&self, label: T) -> Selectable<'_, T> {
41 Selectable {
42 label,
43 selected: false,
44 flags: SelectableFlags::empty(),
45 size: [0.0, 0.0],
46 ui: self,
47 }
48 }
49}
50
51#[derive(Clone, Debug)]
53#[must_use]
54pub struct Selectable<'ui, T> {
55 label: T,
56 selected: bool,
57 flags: SelectableFlags,
58 size: [f32; 2],
59 ui: &'ui Ui,
60}
61
62impl<'ui, T: AsRef<str>> Selectable<'ui, T> {
63 #[doc(alias = "Selectable")]
65 #[deprecated(
66 since = "0.9.0",
67 note = "use `ui.selectable` or `ui.selectable_config`"
68 )]
69 pub fn new(label: T, ui: &'ui Ui) -> Self {
70 Selectable {
71 label,
72 selected: false,
73 flags: SelectableFlags::empty(),
74 size: [0.0, 0.0],
75 ui,
76 }
77 }
78 pub fn flags(mut self, flags: SelectableFlags) -> Self {
80 self.flags = flags;
81 self
82 }
83 pub fn selected(mut self, selected: bool) -> Self {
85 self.selected = selected;
86 self
87 }
88 pub fn close_popups(mut self, value: bool) -> Self {
92 self.flags
93 .set(SelectableFlags::NO_AUTO_CLOSE_POPUPS, !value);
94 self
95 }
96 pub fn span_all_columns(mut self, value: bool) -> Self {
100 self.flags.set(SelectableFlags::SPAN_ALL_COLUMNS, value);
101 self
102 }
103 pub fn allow_double_click(mut self, value: bool) -> Self {
107 self.flags.set(SelectableFlags::ALLOW_DOUBLE_CLICK, value);
108 self
109 }
110 pub fn disabled(mut self, value: bool) -> Self {
116 self.flags.set(SelectableFlags::DISABLED, value);
117 self
118 }
119 pub fn size(mut self, size: impl Into<[f32; 2]>) -> Self {
131 self.size = size.into();
132 self
133 }
134
135 pub fn build(self) -> bool {
139 let size_vec = sys::ImVec2 {
140 x: self.size[0],
141 y: self.size[1],
142 };
143 unsafe {
144 sys::igSelectable_Bool(
145 self.ui.scratch_txt(self.label),
146 self.selected,
147 self.flags.bits(),
148 size_vec,
149 )
150 }
151 }
152
153 pub fn build_with_ref(self, selected: &mut bool) -> bool {
155 if self.selected(*selected).build() {
156 *selected = !*selected;
157 true
158 } else {
159 false
160 }
161 }
162}