dear_imnodes/
style.rs

1use crate::sys;
2use dear_imgui_rs::sys as imgui_sys;
3
4#[repr(u32)]
5#[derive(Copy, Clone, Debug, PartialEq, Eq)]
6pub enum ColorElement {
7    NodeBackground = sys::ImNodesCol_NodeBackground as u32,
8    NodeBackgroundHovered = sys::ImNodesCol_NodeBackgroundHovered as u32,
9    NodeBackgroundSelected = sys::ImNodesCol_NodeBackgroundSelected as u32,
10    NodeOutline = sys::ImNodesCol_NodeOutline as u32,
11    TitleBar = sys::ImNodesCol_TitleBar as u32,
12    TitleBarHovered = sys::ImNodesCol_TitleBarHovered as u32,
13    TitleBarSelected = sys::ImNodesCol_TitleBarSelected as u32,
14    Link = sys::ImNodesCol_Link as u32,
15    LinkHovered = sys::ImNodesCol_LinkHovered as u32,
16    LinkSelected = sys::ImNodesCol_LinkSelected as u32,
17    Pin = sys::ImNodesCol_Pin as u32,
18    PinHovered = sys::ImNodesCol_PinHovered as u32,
19    BoxSelector = sys::ImNodesCol_BoxSelector as u32,
20    BoxSelectorOutline = sys::ImNodesCol_BoxSelectorOutline as u32,
21    GridBackground = sys::ImNodesCol_GridBackground as u32,
22    GridLine = sys::ImNodesCol_GridLine as u32,
23    GridLinePrimary = sys::ImNodesCol_GridLinePrimary as u32,
24    MiniMapBackground = sys::ImNodesCol_MiniMapBackground as u32,
25    MiniMapBackgroundHovered = sys::ImNodesCol_MiniMapBackgroundHovered as u32,
26    MiniMapOutline = sys::ImNodesCol_MiniMapOutline as u32,
27    MiniMapOutlineHovered = sys::ImNodesCol_MiniMapOutlineHovered as u32,
28    MiniMapNodeBackground = sys::ImNodesCol_MiniMapNodeBackground as u32,
29    MiniMapNodeBackgroundHovered = sys::ImNodesCol_MiniMapNodeBackgroundHovered as u32,
30    MiniMapNodeBackgroundSelected = sys::ImNodesCol_MiniMapNodeBackgroundSelected as u32,
31    MiniMapNodeOutline = sys::ImNodesCol_MiniMapNodeOutline as u32,
32    MiniMapLink = sys::ImNodesCol_MiniMapLink as u32,
33    MiniMapLinkSelected = sys::ImNodesCol_MiniMapLinkSelected as u32,
34    MiniMapCanvas = sys::ImNodesCol_MiniMapCanvas as u32,
35    MiniMapCanvasOutline = sys::ImNodesCol_MiniMapCanvasOutline as u32,
36}
37
38pub struct ColorToken;
39impl ColorToken {
40    pub fn pop(self) {}
41}
42impl Drop for ColorToken {
43    fn drop(&mut self) {
44        unsafe { sys::imnodes_PopColorStyle() };
45    }
46}
47
48pub struct StyleVarToken;
49impl StyleVarToken {
50    pub fn pop(self) {}
51}
52impl Drop for StyleVarToken {
53    fn drop(&mut self) {
54        unsafe { sys::imnodes_PopStyleVar(1) };
55    }
56}
57
58pub enum StyleVarValue {
59    Float(f32),
60    Vec2([f32; 2]),
61}
62
63pub struct AttributeFlagToken;
64impl AttributeFlagToken {
65    pub fn pop(self) {}
66}
67impl Drop for AttributeFlagToken {
68    fn drop(&mut self) {
69        unsafe { sys::imnodes_PopAttributeFlag() };
70    }
71}
72
73/// Style helpers available from NodeEditor
74impl<'ui> crate::NodeEditor<'ui> {
75    pub fn push_attribute_flag(&self, flag: crate::AttributeFlags) -> AttributeFlagToken {
76        unsafe { sys::imnodes_PushAttributeFlag(flag.bits()) };
77        AttributeFlagToken
78    }
79
80    pub fn push_color(&self, elem: ColorElement, color: [f32; 4]) -> ColorToken {
81        // Use Dear ImGui's helper for packing RGBA -> ABGR (u32)
82        let col = unsafe {
83            imgui_sys::igColorConvertFloat4ToU32(imgui_sys::ImVec4 {
84                x: color[0],
85                y: color[1],
86                z: color[2],
87                w: color[3],
88            })
89        };
90        unsafe { sys::imnodes_PushColorStyle(elem as i32, col) };
91        ColorToken
92    }
93
94    pub fn push_style_var(&self, var: crate::StyleVar, value: StyleVarValue) -> StyleVarToken {
95        match value {
96            StyleVarValue::Float(v) => unsafe { sys::imnodes_PushStyleVar_Float(var as i32, v) },
97            StyleVarValue::Vec2(v) => unsafe {
98                sys::imnodes_PushStyleVar_Vec2(var as i32, sys::ImVec2_c { x: v[0], y: v[1] })
99            },
100        }
101        StyleVarToken
102    }
103
104    pub fn push_style_var_f32(&self, var: i32, value: f32) -> StyleVarToken {
105        unsafe { sys::imnodes_PushStyleVar_Float(var, value) };
106        StyleVarToken
107    }
108
109    pub fn push_style_var_vec2(&self, var: i32, value: [f32; 2]) -> StyleVarToken {
110        unsafe {
111            sys::imnodes_PushStyleVar_Vec2(
112                var,
113                sys::ImVec2_c {
114                    x: value[0],
115                    y: value[1],
116                },
117            )
118        };
119        StyleVarToken
120    }
121}
122
123/// Convert RGBA floats [0,1] to ImGui-packed ABGR (u32)
124pub fn rgba_to_abgr_u32(rgba: [f32; 4]) -> u32 {
125    unsafe {
126        imgui_sys::igColorConvertFloat4ToU32(imgui_sys::ImVec4 {
127            x: rgba[0],
128            y: rgba[1],
129            z: rgba[2],
130            w: rgba[3],
131        }) as u32
132    }
133}
134
135/// Convert ImGui-packed ABGR (u32) to RGBA floats [0,1]
136pub fn abgr_u32_to_rgba(col: u32) -> [f32; 4] {
137    let out = unsafe { imgui_sys::igColorConvertU32ToFloat4(col) };
138    [out.x, out.y, out.z, out.w]
139}