dear_imgui_rs/widget/
selectable.rs1#![allow(
7 clippy::cast_possible_truncation,
8 clippy::cast_sign_loss,
9 clippy::as_conversions
10)]
11use crate::Ui;
12use crate::sys;
13
14bitflags::bitflags! {
15 #[repr(transparent)]
17 #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
18 pub struct SelectableFlags: i32 {
19 const NO_AUTO_CLOSE_POPUPS = sys::ImGuiSelectableFlags_NoAutoClosePopups as i32;
21 const SPAN_ALL_COLUMNS = sys::ImGuiSelectableFlags_SpanAllColumns as i32;
23 const ALLOW_DOUBLE_CLICK = sys::ImGuiSelectableFlags_AllowDoubleClick as i32;
25 const DISABLED = sys::ImGuiSelectableFlags_Disabled as i32;
27 const ALLOW_OVERLAP = sys::ImGuiSelectableFlags_AllowOverlap as i32;
29 }
30}
31
32impl Ui {
33 #[doc(alias = "Selectable")]
39 pub fn selectable<T: AsRef<str>>(&self, label: T) -> bool {
40 self.selectable_config(label).build()
41 }
42
43 #[doc(alias = "Selectable")]
45 pub fn selectable_config<T: AsRef<str>>(&self, label: T) -> Selectable<'_, T> {
46 Selectable {
47 label,
48 selected: false,
49 flags: SelectableFlags::empty(),
50 size: [0.0, 0.0],
51 ui: self,
52 }
53 }
54}
55
56#[derive(Clone, Debug)]
58#[must_use]
59pub struct Selectable<'ui, T> {
60 label: T,
61 selected: bool,
62 flags: SelectableFlags,
63 size: [f32; 2],
64 ui: &'ui Ui,
65}
66
67impl<'ui, T: AsRef<str>> Selectable<'ui, T> {
68 #[doc(alias = "Selectable")]
70 #[deprecated(
71 since = "0.9.0",
72 note = "use `ui.selectable` or `ui.selectable_config`"
73 )]
74 pub fn new(label: T, ui: &'ui Ui) -> Self {
75 Selectable {
76 label,
77 selected: false,
78 flags: SelectableFlags::empty(),
79 size: [0.0, 0.0],
80 ui,
81 }
82 }
83 pub fn flags(mut self, flags: SelectableFlags) -> Self {
85 self.flags = flags;
86 self
87 }
88 pub fn selected(mut self, selected: bool) -> Self {
90 self.selected = selected;
91 self
92 }
93 pub fn close_popups(mut self, value: bool) -> Self {
97 self.flags
98 .set(SelectableFlags::NO_AUTO_CLOSE_POPUPS, !value);
99 self
100 }
101 pub fn span_all_columns(mut self, value: bool) -> Self {
105 self.flags.set(SelectableFlags::SPAN_ALL_COLUMNS, value);
106 self
107 }
108 pub fn allow_double_click(mut self, value: bool) -> Self {
112 self.flags.set(SelectableFlags::ALLOW_DOUBLE_CLICK, value);
113 self
114 }
115 pub fn disabled(mut self, value: bool) -> Self {
121 self.flags.set(SelectableFlags::DISABLED, value);
122 self
123 }
124 pub fn size(mut self, size: impl Into<[f32; 2]>) -> Self {
136 self.size = size.into();
137 self
138 }
139
140 pub fn build(self) -> bool {
144 let size_vec = sys::ImVec2 {
145 x: self.size[0],
146 y: self.size[1],
147 };
148 unsafe {
149 sys::igSelectable_Bool(
150 self.ui.scratch_txt(self.label),
151 self.selected,
152 self.flags.bits(),
153 size_vec,
154 )
155 }
156 }
157
158 pub fn build_with_ref(self, selected: &mut bool) -> bool {
160 if self.selected(*selected).build() {
161 *selected = !*selected;
162 true
163 } else {
164 false
165 }
166 }
167}