INSTINCT Code Coverage Report


Directory: src/
File: internal/gui/windows/NodeEditorStyleEditor.cpp
Date: 2025-02-07 16:54:41
Exec Total Coverage
Lines: 0 75 0.0%
Functions: 0 2 0.0%
Branches: 0 38 0.0%

Line Branch Exec Source
1 // This file is part of INSTINCT, the INS Toolkit for Integrated
2 // Navigation Concepts and Training by the Institute of Navigation of
3 // the University of Stuttgart, Germany.
4 //
5 // This Source Code Form is subject to the terms of the Mozilla Public
6 // License, v. 2.0. If a copy of the MPL was not distributed with this
7 // file, You can obtain one at https://mozilla.org/MPL/2.0/.
8
9 #include "NodeEditorStyleEditor.hpp"
10
11 #include <imgui.h>
12 #include <imgui_node_editor.h>
13 #include "internal/gui/NodeEditorApplication.hpp"
14
15 namespace ed = ax::NodeEditor;
16
17 namespace NAV::gui::windows
18 {
19
20 bool nodeEditorLightMode = false;
21
22 } // namespace NAV::gui::windows
23
24 void NAV::gui::windows::ShowNodeEditorStyleEditor(bool* show, std::vector<ImVec4>& colors, const std::vector<const char*>& colorNames)
25 {
26 if (!ImGui::Begin("Node Editor Style", show))
27 {
28 ImGui::End();
29 return;
30 }
31
32 auto paneWidth = ImGui::GetContentRegionAvail().x;
33
34 auto& editorStyle = ed::GetStyle();
35 ImGui::BeginHorizontal("Style buttons", ImVec2(paneWidth, 0), 1.0F);
36 ImGui::TextUnformatted("Values");
37 ImGui::Spring();
38 if (ImGui::Button("Reset to defaults"))
39 {
40 editorStyle = ed::Style();
41 }
42 ImGui::EndHorizontal();
43 ImGui::Spacing();
44 ImGui::DragFloat4("Node Padding", &editorStyle.NodePadding.x, 0.1F, 0.0F, 40.0F);
45 ImGui::DragFloat("Node Rounding", &editorStyle.NodeRounding, 0.1F, 0.0F, 40.0F);
46 ImGui::DragFloat("Node Border Width", &editorStyle.NodeBorderWidth, 0.1F, 0.0F, 15.0F);
47 ImGui::DragFloat("Hovered Node Border Width", &editorStyle.HoveredNodeBorderWidth, 0.1F, 0.0F, 15.0F);
48 ImGui::DragFloat("Selected Node Border Width", &editorStyle.SelectedNodeBorderWidth, 0.1F, 0.0F, 15.0F);
49 ImGui::DragFloat("Pin Rounding", &editorStyle.PinRounding, 0.1F, 0.0F, 40.0F);
50 ImGui::DragFloat("Pin Border Width", &editorStyle.PinBorderWidth, 0.1F, 0.0F, 15.0F);
51 ImGui::DragFloat("Link Strength", &editorStyle.LinkStrength, 1.0F, 0.0F, 500.0F);
52 // ImVec2 SourceDirection;
53 // ImVec2 TargetDirection;
54 ImGui::DragFloat("Scroll Duration", &editorStyle.ScrollDuration, 0.001F, 0.0F, 2.0F);
55 ImGui::DragFloat("Flow Marker Distance", &editorStyle.FlowMarkerDistance, 1.0F, 1.0F, 200.0F);
56 ImGui::DragFloat("Flow Speed", &editorStyle.FlowSpeed, 1.0F, 1.0F, 2000.0F);
57 ImGui::DragFloat("Flow Duration", &editorStyle.FlowDuration, 0.001F, 0.0F, 5.0F);
58 // ImVec2 PivotAlignment;
59 // ImVec2 PivotSize;
60 // ImVec2 PivotScale;
61 // float PinCorners;
62 // float PinRadius;
63 // float PinArrowSize;
64 // float PinArrowWidth;
65 ImGui::DragFloat("Group Rounding", &editorStyle.GroupRounding, 0.1F, 0.0F, 40.0F);
66 ImGui::DragFloat("Group Border Width", &editorStyle.GroupBorderWidth, 0.1F, 0.0F, 15.0F);
67
68 ImGui::Separator();
69
70 static ImGuiColorEditFlags edit_mode = ImGuiColorEditFlags_DisplayRGB;
71 ImGui::BeginHorizontal("Color Mode", ImVec2(paneWidth, 0), 1.0F);
72 ImGui::TextUnformatted("Filter Colors");
73 ImGui::Spring();
74 if (ImGui::Checkbox("Light mode", &nodeEditorLightMode)) { ApplyDarkLightMode(colors); }
75 ImGui::Spring(0);
76 ImGui::RadioButton("RGB", &edit_mode, ImGuiColorEditFlags_DisplayRGB);
77 ImGui::Spring(0);
78 ImGui::RadioButton("HSV", &edit_mode, ImGuiColorEditFlags_DisplayHSV);
79 ImGui::Spring(0);
80 ImGui::RadioButton("HEX", &edit_mode, ImGuiColorEditFlags_DisplayHex);
81 ImGui::EndHorizontal();
82
83 static ImGuiTextFilter filter;
84 filter.Draw("##NodeEditorStyleEditor", paneWidth);
85
86 ImGui::Spacing();
87
88 ImGui::PushItemWidth(-160);
89 for (int i = 0; i < ed::StyleColor_Count; i++)
90 {
91 const auto* name = ed::GetStyleColorName(static_cast<ed::StyleColor>(i));
92 if (!filter.PassFilter(name))
93 {
94 continue;
95 }
96
97 ImGui::ColorEdit4(name, &editorStyle.Colors[i].x, edit_mode); // NOLINT(cppcoreguidelines-pro-bounds-constant-array-index)
98 }
99
100 for (size_t i = 0; i < colors.size(); i++)
101 {
102 const auto* name = colorNames.at(i);
103 if (!filter.PassFilter(name))
104 {
105 continue;
106 }
107 ImGui::ColorEdit4(name, &colors.at(i).x, edit_mode); // NOLINT(cppcoreguidelines-pro-bounds-constant-array-index)
108 }
109 ImGui::PopItemWidth();
110
111 ImGui::End();
112 }
113
114 void NAV::gui::windows::ApplyDarkLightMode(std::vector<ImVec4>& colors)
115 {
116 auto& editorStyle = ed::GetStyle();
117 if (nodeEditorLightMode)
118 {
119 editorStyle.Colors[ed::StyleColor_Bg] = ImColor(255, 255, 255, 255);
120 editorStyle.Colors[ed::StyleColor_Grid] = ImColor(120, 120, 120, 40);
121 editorStyle.Colors[ed::StyleColor_GroupBg] = ImColor(130, 130, 130, 160);
122
123 colors[NodeEditorApplication::COLOR_GROUP_HEADER_TEXT] = ImColor(0, 0, 0, 255);
124 colors[NodeEditorApplication::COLOR_GROUP_HEADER_BG] = ImColor(115, 115, 115, 0);
125 colors[NodeEditorApplication::COLOR_GROUP_OUTER_BORDER] = ImColor(255, 255, 255, 64);
126
127 ImGui::StyleColorsLight();
128 ImGui::GetStyle().Colors[ImGuiCol_WindowBg] = ImColor(255, 255, 255, 255);
129 ImGui::GetStyle().Colors[ImGuiCol_FrameBg] = ImColor(240, 240, 240, 255);
130 }
131 else
132 {
133 ed::Style defaultStyle{};
134 for (int i = 0; i < ed::StyleColor_Count; i++)
135 {
136 editorStyle.Colors[i] = defaultStyle.Colors[i]; // NOLINT(cppcoreguidelines-pro-bounds-constant-array-index)
137 }
138
139 colors[NodeEditorApplication::COLOR_GROUP_HEADER_TEXT] = ImColor(1.0F, 1.0F, 1.0F, 1.0F);
140 colors[NodeEditorApplication::COLOR_GROUP_HEADER_BG] = ImColor(1.0F, 1.0F, 1.0F, 0.25F);
141 colors[NodeEditorApplication::COLOR_GROUP_OUTER_BORDER] = ImColor(1.0F, 1.0F, 1.0F, 0.25F);
142
143 ImGui::StyleColorsDark();
144 }
145 }
146