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
73impl<'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 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
123pub 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
135pub 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}