Skip to main content

dear_imgui_rs/stacks/
style.rs

1use crate::style::{StyleColor, StyleVar, validate_style_color, validate_style_var};
2use crate::{Ui, sys};
3
4impl Ui {
5    /// Changes a style color by pushing a change to the color stack.
6    ///
7    /// Returns a `ColorStackToken` that must be popped by calling `.pop()`
8    ///
9    /// # Examples
10    ///
11    /// ```no_run
12    /// # use dear_imgui_rs::*;
13    /// # let mut ctx = Context::create();
14    /// # let ui = ctx.frame();
15    /// const RED: [f32; 4] = [1.0, 0.0, 0.0, 1.0];
16    /// let color = ui.push_style_color(StyleColor::Text, RED);
17    /// ui.text("I'm red!");
18    /// color.pop();
19    /// ```
20    #[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    /// Changes a style variable by pushing a change to the style stack.
43    ///
44    /// Returns a `StyleStackToken` that can be popped by calling `.end()`
45    /// or by allowing to drop.
46    ///
47    /// # Examples
48    ///
49    /// ```no_run
50    /// # use dear_imgui_rs::*;
51    /// # let mut ctx = Context::create();
52    /// # let ui = ctx.frame();
53    /// let style = ui.push_style_var(StyleVar::Alpha(0.2));
54    /// ui.text("I'm transparent!");
55    /// style.pop();
56    /// ```
57    #[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    /// Tracks a color pushed to the color stack that can be popped by calling `.end()`
67    /// or by dropping.
68    pub struct ColorStackToken<'ui>;
69
70    /// Pops a change from the color stack.
71    drop { unsafe { sys::igPopStyleColor(1) } }
72);
73
74impl ColorStackToken<'_> {
75    /// Pops a change from the color stack.
76    pub fn pop(self) {
77        self.end()
78    }
79}
80
81create_token!(
82    /// Tracks a style pushed to the style stack that can be popped by calling `.end()`
83    /// or by dropping.
84    pub struct StyleStackToken<'ui>;
85
86    /// Pops a change from the style stack.
87    drop { unsafe { sys::igPopStyleVar(1) } }
88);
89
90impl StyleStackToken<'_> {
91    /// Pops a change from the style stack.
92    pub fn pop(self) {
93        self.end()
94    }
95}
96
97/// Helper function to push style variables
98unsafe 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}