1#![allow(
8 clippy::cast_possible_truncation,
9 clippy::cast_sign_loss,
10 clippy::as_conversions
11)]
12use crate::Ui;
13use crate::sys;
14use bitflags::bitflags;
15
16bitflags! {
17 #[repr(transparent)]
19 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
20 pub struct OldColumnFlags: i32 {
21 const NONE = sys::ImGuiOldColumnFlags_None as i32;
23 const NO_BORDER = sys::ImGuiOldColumnFlags_NoBorder as i32;
25 const NO_RESIZE = sys::ImGuiOldColumnFlags_NoResize as i32;
27 const NO_PRESERVE_WIDTHS = sys::ImGuiOldColumnFlags_NoPreserveWidths as i32;
29 const NO_FORCE_WITHIN_WINDOW = sys::ImGuiOldColumnFlags_NoForceWithinWindow as i32;
31 const GROW_PARENT_CONTENTS_SIZE = sys::ImGuiOldColumnFlags_GrowParentContentsSize as i32;
33 }
34}
35
36impl Default for OldColumnFlags {
37 fn default() -> Self {
38 OldColumnFlags::NONE
39 }
40}
41
42impl Ui {
44 #[doc(alias = "Columns")]
51 pub fn columns(&self, count: i32, id: impl AsRef<str>, border: bool) {
52 unsafe { sys::igColumns(count, self.scratch_txt(id), border) }
53 }
54
55 #[doc(alias = "BeginColumns")]
62 pub fn begin_columns(&self, id: impl AsRef<str>, count: i32, flags: OldColumnFlags) {
63 unsafe { sys::igBeginColumns(self.scratch_txt(id), count, flags.bits()) }
64 }
65
66 #[doc(alias = "BeginColumns")]
68 pub fn begin_columns_token(
69 &self,
70 id: impl AsRef<str>,
71 count: i32,
72 flags: OldColumnFlags,
73 ) -> ColumnsToken<'_> {
74 self.begin_columns(id, count, flags);
75 ColumnsToken { ui: self }
76 }
77
78 #[doc(alias = "EndColumns")]
80 pub fn end_columns(&self) {
81 unsafe { sys::igEndColumns() }
82 }
83
84 #[doc(alias = "NextColumn")]
88 pub fn next_column(&self) {
89 unsafe { sys::igNextColumn() }
90 }
91
92 #[doc(alias = "GetColumnIndex")]
94 pub fn current_column_index(&self) -> i32 {
95 unsafe { sys::igGetColumnIndex() }
96 }
97
98 #[doc(alias = "GetColumnWidth")]
100 pub fn current_column_width(&self) -> f32 {
101 unsafe { sys::igGetColumnWidth(-1) }
102 }
103
104 #[doc(alias = "GetColumnWidth")]
106 pub fn column_width(&self, column_index: i32) -> f32 {
107 unsafe { sys::igGetColumnWidth(column_index) }
108 }
109
110 #[doc(alias = "SetColumnWidth")]
112 pub fn set_current_column_width(&self, width: f32) {
113 unsafe { sys::igSetColumnWidth(-1, width) };
114 }
115
116 #[doc(alias = "SetColumnWidth")]
118 pub fn set_column_width(&self, column_index: i32, width: f32) {
119 unsafe { sys::igSetColumnWidth(column_index, width) };
120 }
121
122 #[doc(alias = "GetColumnOffset")]
124 pub fn current_column_offset(&self) -> f32 {
125 unsafe { sys::igGetColumnOffset(-1) }
126 }
127
128 #[doc(alias = "GetColumnOffset")]
130 pub fn column_offset(&self, column_index: i32) -> f32 {
131 unsafe { sys::igGetColumnOffset(column_index) }
132 }
133
134 #[doc(alias = "SetColumnOffset")]
136 pub fn set_current_column_offset(&self, offset_x: f32) {
137 unsafe { sys::igSetColumnOffset(-1, offset_x) };
138 }
139
140 #[doc(alias = "SetColumnOffset")]
142 pub fn set_column_offset(&self, column_index: i32, offset_x: f32) {
143 unsafe { sys::igSetColumnOffset(column_index, offset_x) };
144 }
145
146 #[doc(alias = "GetColumnsCount")]
148 pub fn column_count(&self) -> i32 {
149 unsafe { sys::igGetColumnsCount() }
150 }
151
152 #[doc(alias = "PushColumnClipRect")]
159 pub fn push_column_clip_rect(&self, column_index: i32) {
160 unsafe { sys::igPushColumnClipRect(column_index) }
161 }
162
163 #[doc(alias = "PushColumnsBackground")]
165 pub fn push_columns_background(&self) {
166 unsafe { sys::igPushColumnsBackground() }
167 }
168
169 #[doc(alias = "PopColumnsBackground")]
171 pub fn pop_columns_background(&self) {
172 unsafe { sys::igPopColumnsBackground() }
173 }
174
175 #[doc(alias = "GetColumnsID")]
177 pub fn get_columns_id(&self, str_id: impl AsRef<str>, count: i32) -> u32 {
178 unsafe { sys::igGetColumnsID(self.scratch_txt(str_id), count) }
179 }
180
181 pub fn is_any_column_resizing(&self) -> bool {
188 false
191 }
192
193 pub fn get_columns_total_width(&self) -> f32 {
195 let count = self.column_count();
196 if count <= 0 {
197 return 0.0;
198 }
199
200 let mut total_width = 0.0;
201 for i in 0..count {
202 total_width += self.column_width(i);
203 }
204 total_width
205 }
206
207 pub fn set_columns_equal_width(&self) {
209 let count = self.column_count();
210 if count <= 1 {
211 return;
212 }
213
214 let total_width = self.get_columns_total_width();
215 let equal_width = total_width / count as f32;
216
217 for i in 0..count {
218 self.set_column_width(i, equal_width);
219 }
220 }
221
222 pub fn get_column_width_percentage(&self, column_index: i32) -> f32 {
224 let total_width = self.get_columns_total_width();
225 if total_width <= 0.0 {
226 return 0.0;
227 }
228
229 let column_width = self.column_width(column_index);
230 (column_width / total_width) * 100.0
231 }
232
233 pub fn set_column_width_percentage(&self, column_index: i32, percentage: f32) {
235 let total_width = self.get_columns_total_width();
236 if total_width <= 0.0 {
237 return;
238 }
239
240 let new_width = (total_width * percentage) / 100.0;
241 self.set_column_width(column_index, new_width);
242 }
243}
244
245#[must_use]
247pub struct ColumnsToken<'ui> {
248 ui: &'ui Ui,
249}
250
251impl Drop for ColumnsToken<'_> {
252 fn drop(&mut self) {
253 self.ui.end_columns();
254 }
255}