1use crate::style::{StyleColor, StyleVar, validate_style_color, validate_style_var};
2use crate::{Ui, sys};
3
4impl Ui {
5 #[doc(alias = "PushStyleColor")]
21 pub fn push_style_color(
22 &self,
23 style_color: StyleColor,
24 color: impl Into<[f32; 4]>,
25 ) -> ColorStackToken<'_> {
26 let color_array = color.into();
27 validate_style_color("Ui::push_style_color()", "color", color_array);
28 unsafe {
29 sys::igPushStyleColor_Vec4(
30 style_color as i32,
31 sys::ImVec4 {
32 x: color_array[0],
33 y: color_array[1],
34 z: color_array[2],
35 w: color_array[3],
36 },
37 )
38 };
39 ColorStackToken::new(self)
40 }
41
42 #[doc(alias = "PushStyleVar")]
58 pub fn push_style_var(&self, style_var: StyleVar) -> StyleStackToken<'_> {
59 validate_style_var("Ui::push_style_var()", style_var);
60 unsafe { push_style_var(style_var) };
61 StyleStackToken::new(self)
62 }
63}
64
65create_token!(
66 pub struct ColorStackToken<'ui>;
69
70 drop { unsafe { sys::igPopStyleColor(1) } }
72);
73
74impl ColorStackToken<'_> {
75 pub fn pop(self) {
77 self.end()
78 }
79}
80
81create_token!(
82 pub struct StyleStackToken<'ui>;
85
86 drop { unsafe { sys::igPopStyleVar(1) } }
88);
89
90impl StyleStackToken<'_> {
91 pub fn pop(self) {
93 self.end()
94 }
95}
96
97unsafe fn push_style_var(style_var: StyleVar) {
99 use StyleVar::*;
100 match style_var {
101 Alpha(v) => unsafe { sys::igPushStyleVar_Float(sys::ImGuiStyleVar_Alpha as i32, v) },
102 DisabledAlpha(v) => unsafe {
103 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_DisabledAlpha as i32, v)
104 },
105 WindowPadding(v) => {
106 let p: [f32; 2] = v;
107 let vec = sys::ImVec2 { x: p[0], y: p[1] };
108 unsafe { sys::igPushStyleVar_Vec2(sys::ImGuiStyleVar_WindowPadding as i32, vec) }
109 }
110 WindowRounding(v) => unsafe {
111 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_WindowRounding as i32, v)
112 },
113 WindowBorderSize(v) => unsafe {
114 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_WindowBorderSize as i32, v)
115 },
116 WindowMinSize(v) => {
117 let p: [f32; 2] = v;
118 let vec = sys::ImVec2 { x: p[0], y: p[1] };
119 unsafe { sys::igPushStyleVar_Vec2(sys::ImGuiStyleVar_WindowMinSize as i32, vec) }
120 }
121 WindowTitleAlign(v) => {
122 let p: [f32; 2] = v;
123 let vec = sys::ImVec2 { x: p[0], y: p[1] };
124 unsafe { sys::igPushStyleVar_Vec2(sys::ImGuiStyleVar_WindowTitleAlign as i32, vec) }
125 }
126 ChildRounding(v) => unsafe {
127 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_ChildRounding as i32, v)
128 },
129 ChildBorderSize(v) => unsafe {
130 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_ChildBorderSize as i32, v)
131 },
132 PopupRounding(v) => unsafe {
133 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_PopupRounding as i32, v)
134 },
135 PopupBorderSize(v) => unsafe {
136 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_PopupBorderSize as i32, v)
137 },
138 FramePadding(v) => {
139 let p: [f32; 2] = v;
140 let vec = sys::ImVec2 { x: p[0], y: p[1] };
141 unsafe { sys::igPushStyleVar_Vec2(sys::ImGuiStyleVar_FramePadding as i32, vec) }
142 }
143 FrameRounding(v) => unsafe {
144 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_FrameRounding as i32, v)
145 },
146 FrameBorderSize(v) => unsafe {
147 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_FrameBorderSize as i32, v)
148 },
149 ItemSpacing(v) => {
150 let p: [f32; 2] = v;
151 let vec = sys::ImVec2 { x: p[0], y: p[1] };
152 unsafe { sys::igPushStyleVar_Vec2(sys::ImGuiStyleVar_ItemSpacing as i32, vec) }
153 }
154 ItemInnerSpacing(v) => {
155 let p: [f32; 2] = v;
156 let vec = sys::ImVec2 { x: p[0], y: p[1] };
157 unsafe { sys::igPushStyleVar_Vec2(sys::ImGuiStyleVar_ItemInnerSpacing as i32, vec) }
158 }
159 IndentSpacing(v) => unsafe {
160 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_IndentSpacing as i32, v)
161 },
162 CellPadding(v) => {
163 let p: [f32; 2] = v;
164 let vec = sys::ImVec2 { x: p[0], y: p[1] };
165 unsafe { sys::igPushStyleVar_Vec2(sys::ImGuiStyleVar_CellPadding as i32, vec) }
166 }
167 ScrollbarSize(v) => unsafe {
168 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_ScrollbarSize as i32, v)
169 },
170 ScrollbarRounding(v) => unsafe {
171 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_ScrollbarRounding as i32, v)
172 },
173 ScrollbarPadding(v) => unsafe {
174 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_ScrollbarPadding as i32, v)
175 },
176 GrabMinSize(v) => unsafe {
177 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_GrabMinSize as i32, v)
178 },
179 GrabRounding(v) => unsafe {
180 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_GrabRounding as i32, v)
181 },
182 ImageRounding(v) => unsafe {
183 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_ImageRounding as i32, v)
184 },
185 ImageBorderSize(v) => unsafe {
186 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_ImageBorderSize as i32, v)
187 },
188 TabRounding(v) => unsafe {
189 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_TabRounding as i32, v)
190 },
191 TabBorderSize(v) => unsafe {
192 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_TabBorderSize as i32, v)
193 },
194 TabMinWidthBase(v) => unsafe {
195 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_TabMinWidthBase as i32, v)
196 },
197 TabMinWidthShrink(v) => unsafe {
198 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_TabMinWidthShrink as i32, v)
199 },
200 TabBarBorderSize(v) => unsafe {
201 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_TabBarBorderSize as i32, v)
202 },
203 TabBarOverlineSize(v) => unsafe {
204 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_TabBarOverlineSize as i32, v)
205 },
206 TableAngledHeadersAngle(v) => unsafe {
207 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_TableAngledHeadersAngle as i32, v)
208 },
209 TableAngledHeadersTextAlign(v) => {
210 let p: [f32; 2] = v;
211 let vec = sys::ImVec2 { x: p[0], y: p[1] };
212 unsafe {
213 sys::igPushStyleVar_Vec2(sys::ImGuiStyleVar_TableAngledHeadersTextAlign as i32, vec)
214 }
215 }
216 TreeLinesSize(v) => unsafe {
217 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_TreeLinesSize as i32, v)
218 },
219 TreeLinesRounding(v) => unsafe {
220 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_TreeLinesRounding as i32, v)
221 },
222 DragDropTargetRounding(v) => unsafe {
223 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_DragDropTargetRounding as i32, v)
224 },
225 ButtonTextAlign(v) => {
226 let p: [f32; 2] = v;
227 let vec = sys::ImVec2 { x: p[0], y: p[1] };
228 unsafe { sys::igPushStyleVar_Vec2(sys::ImGuiStyleVar_ButtonTextAlign as i32, vec) }
229 }
230 SelectableTextAlign(v) => {
231 let p: [f32; 2] = v;
232 let vec = sys::ImVec2 { x: p[0], y: p[1] };
233 unsafe { sys::igPushStyleVar_Vec2(sys::ImGuiStyleVar_SelectableTextAlign as i32, vec) }
234 }
235 SeparatorSize(v) => unsafe {
236 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_SeparatorSize as i32, v)
237 },
238 SeparatorTextBorderSize(v) => unsafe {
239 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_SeparatorTextBorderSize as i32, v)
240 },
241 SeparatorTextAlign(v) => {
242 let p: [f32; 2] = v;
243 let vec = sys::ImVec2 { x: p[0], y: p[1] };
244 unsafe { sys::igPushStyleVar_Vec2(sys::ImGuiStyleVar_SeparatorTextAlign as i32, vec) }
245 }
246 SeparatorTextPadding(v) => {
247 let p: [f32; 2] = v;
248 let vec = sys::ImVec2 { x: p[0], y: p[1] };
249 unsafe { sys::igPushStyleVar_Vec2(sys::ImGuiStyleVar_SeparatorTextPadding as i32, vec) }
250 }
251 DockingSeparatorSize(v) => unsafe {
252 sys::igPushStyleVar_Float(sys::ImGuiStyleVar_DockingSeparatorSize as i32, v)
253 },
254 }
255}