diff options
Diffstat (limited to 'core/src/UI/UI_Utils.cpp')
-rw-r--r-- | core/src/UI/UI_Utils.cpp | 315 |
1 files changed, 0 insertions, 315 deletions
diff --git a/core/src/UI/UI_Utils.cpp b/core/src/UI/UI_Utils.cpp deleted file mode 100644 index a2bf692..0000000 --- a/core/src/UI/UI_Utils.cpp +++ /dev/null @@ -1,315 +0,0 @@ -#include "UI.hpp" - -#include <IconsFontAwesome.h> -#include <imgui.h> - -#define IMGUI_DEFINE_MATH_OPERATORS -#include <imgui_internal.h> - -void ImGui::SetNextWindowSizeRelScreen(float xPercent, float yPercent, ImGuiCond cond) -{ - auto vs = ImGui::GetMainViewport()->Size; - ImGui::SetNextWindowSize({ vs.x * xPercent, vs.y * yPercent }, cond); -} - -void ImGui::SetNextWindowCentered(ImGuiCond cond) -{ - auto vs = ImGui::GetMainViewport()->Size; - ImGui::SetNextWindowPos({ vs.x / 2, vs.y / 2 }, cond, { 0.5f, 0.5f }); -} - -void ImGui::PushDisabled() -{ - ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); - ImGui::PushStyleVar(ImGuiStyleVar_Alpha, 0.5f * ImGui::GetStyle().Alpha); -} - -void ImGui::PopDisabled() -{ - ImGui::PopItemFlag(); - ImGui::PopStyleVar(); -} - -bool ImGui::Button(const char* label, bool disabled) -{ - return Button(label, ImVec2{}, disabled); -} - -bool ImGui::Button(const char* label, const ImVec2& sizeArg, bool disabled) -{ - if (disabled) PushDisabled(); - bool res = ImGui::Button(label, sizeArg); - if (disabled) PopDisabled(); - - // Help clang-tidy's static analyzer: if the button is disabled, res should always be false - assert(!disabled || (disabled && !res)); - - return res; -} - -void ImGui::ErrorIcon() -{ - ImGui::PushStyleColor(ImGuiCol_Text, ImVec4{ 237 / 255.0f, 67 / 255.0f, 55 / 255.0f, 1.0f }); // #ED4337 - ImGui::Text(ICON_FA_EXCLAMATION_CIRCLE); - ImGui::PopStyleColor(); -} - -void ImGui::ErrorMessage(const char* fmt, ...) -{ - ErrorIcon(); - SameLine(); - - va_list args; - va_start(args, fmt); - TextV(fmt, args); - va_end(args); -} - -void ImGui::WarningIcon() -{ - ImGui::PushStyleColor(ImGuiCol_Text, ImVec4{ 255 / 255.0f, 184 / 255.0f, 24 / 255.0f, 1.0f }); // #FFB818 - ImGui::Text(ICON_FA_EXCLAMATION_TRIANGLE); - ImGui::PopStyleColor(); -} - -void ImGui::WarningMessage(const char* fmt, ...) -{ - WarningIcon(); - SameLine(); - - va_list args; - va_start(args, fmt); - TextV(fmt, args); - va_end(args); -} - -void ImGui::DrawIcon(ImDrawList* drawList, const ImVec2& a, const ImVec2& b, IconType type, bool filled, ImU32 color, ImU32 innerColor) -{ - // Taken from https://github.com/thedmd/imgui-node-editor/blob/master/examples/blueprints-example/utilities/drawing.cpp - // ax::NodeEditor::DrawIcon - - // Brace style was adapted but no names are changed - - auto rect = ImRect(a, b); - auto rect_x = rect.Min.x; - auto rect_y = rect.Min.y; - auto rect_w = rect.Max.x - rect.Min.x; - auto rect_h = rect.Max.y - rect.Min.y; - auto rect_center_x = (rect.Min.x + rect.Max.x) * 0.5f; - auto rect_center_y = (rect.Min.y + rect.Max.y) * 0.5f; - auto rect_center = ImVec2(rect_center_x, rect_center_y); - const auto outline_scale = rect_w / 24.0f; - const auto extra_segments = static_cast<int>(2 * outline_scale); // for full circle - - if (type == IconType::Flow) { - const auto origin_scale = rect_w / 24.0f; - - const auto offset_x = 1.0f * origin_scale; - const auto offset_y = 0.0f * origin_scale; - const auto margin = 2.0f * origin_scale; - const auto rounding = 0.1f * origin_scale; - const auto tip_round = 0.7f; // percentage of triangle edge (for tip) - //const auto edge_round = 0.7f; // percentage of triangle edge (for corner) - const auto canvas = ImRect( - rect.Min.x + margin + offset_x, - rect.Min.y + margin + offset_y, - rect.Max.x - margin + offset_x, - rect.Max.y - margin + offset_y); - const auto canvas_x = canvas.Min.x; - const auto canvas_y = canvas.Min.y; - const auto canvas_w = canvas.Max.x - canvas.Min.x; - const auto canvas_h = canvas.Max.y - canvas.Min.y; - - const auto left = canvas_x + canvas_w * 0.5f * 0.3f; - const auto right = canvas_x + canvas_w - canvas_w * 0.5f * 0.3f; - const auto top = canvas_y + canvas_h * 0.5f * 0.2f; - const auto bottom = canvas_y + canvas_h - canvas_h * 0.5f * 0.2f; - const auto center_y = (top + bottom) * 0.5f; - //const auto angle = AX_PI * 0.5f * 0.5f * 0.5f; - - const auto tip_top = ImVec2(canvas_x + canvas_w * 0.5f, top); - const auto tip_right = ImVec2(right, center_y); - const auto tip_bottom = ImVec2(canvas_x + canvas_w * 0.5f, bottom); - - drawList->PathLineTo(ImVec2(left, top) + ImVec2(0, rounding)); - drawList->PathBezierCurveTo( - ImVec2(left, top), - ImVec2(left, top), - ImVec2(left, top) + ImVec2(rounding, 0)); - drawList->PathLineTo(tip_top); - drawList->PathLineTo(tip_top + (tip_right - tip_top) * tip_round); - drawList->PathBezierCurveTo( - tip_right, - tip_right, - tip_bottom + (tip_right - tip_bottom) * tip_round); - drawList->PathLineTo(tip_bottom); - drawList->PathLineTo(ImVec2(left, bottom) + ImVec2(rounding, 0)); - drawList->PathBezierCurveTo( - ImVec2(left, bottom), - ImVec2(left, bottom), - ImVec2(left, bottom) - ImVec2(0, rounding)); - - if (!filled) { - if (innerColor & 0xFF000000) { - drawList->AddConvexPolyFilled(drawList->_Path.Data, drawList->_Path.Size, innerColor); - } - - drawList->PathStroke(color, true, 2.0f * outline_scale); - } else { - drawList->PathFillConvex(color); - } - } else { - auto triangleStart = rect_center_x + 0.32f * rect_w; - - auto rect_offset = -static_cast<int>(rect_w * 0.25f * 0.25f); - - rect.Min.x += rect_offset; - rect.Max.x += rect_offset; - rect_x += rect_offset; - rect_center_x += rect_offset * 0.5f; - rect_center.x += rect_offset * 0.5f; - - if (type == IconType::Circle) { - const auto c = rect_center; - - if (!filled) { - const auto r = 0.5f * rect_w / 2.0f - 0.5f; - - if (innerColor & 0xFF000000) - drawList->AddCircleFilled(c, r, innerColor, 12 + extra_segments); - drawList->AddCircle(c, r, color, 12 + extra_segments, 2.0f * outline_scale); - } else { - drawList->AddCircleFilled(c, 0.5f * rect_w / 2.0f, color, 12 + extra_segments); - } - } - - if (type == IconType::Square) { - if (filled) { - const auto r = 0.5f * rect_w / 2.0f; - const auto p0 = rect_center - ImVec2(r, r); - const auto p1 = rect_center + ImVec2(r, r); - - drawList->AddRectFilled(p0, p1, color, 0, 15 + extra_segments); - } else { - const auto r = 0.5f * rect_w / 2.0f - 0.5f; - const auto p0 = rect_center - ImVec2(r, r); - const auto p1 = rect_center + ImVec2(r, r); - - if (innerColor & 0xFF000000) - drawList->AddRectFilled(p0, p1, innerColor, 0, 15 + extra_segments); - - drawList->AddRect(p0, p1, color, 0, 15 + extra_segments, 2.0f * outline_scale); - } - } - - if (type == IconType::Grid) { - const auto r = 0.5f * rect_w / 2.0f; - const auto w = ceilf(r / 3.0f); - - const auto baseTl = ImVec2(floorf(rect_center_x - w * 2.5f), floorf(rect_center_y - w * 2.5f)); - const auto baseBr = ImVec2(floorf(baseTl.x + w), floorf(baseTl.y + w)); - - auto tl = baseTl; - auto br = baseBr; - for (int i = 0; i < 3; ++i) { - tl.x = baseTl.x; - br.x = baseBr.x; - drawList->AddRectFilled(tl, br, color); - tl.x += w * 2; - br.x += w * 2; - if (i != 1 || filled) - drawList->AddRectFilled(tl, br, color); - tl.x += w * 2; - br.x += w * 2; - drawList->AddRectFilled(tl, br, color); - - tl.y += w * 2; - br.y += w * 2; - } - - triangleStart = br.x + w + 1.0f / 24.0f * rect_w; - } - - if (type == IconType::RoundSquare) { - if (filled) { - const auto r = 0.5f * rect_w / 2.0f; - const auto cr = r * 0.5f; - const auto p0 = rect_center - ImVec2(r, r); - const auto p1 = rect_center + ImVec2(r, r); - - drawList->AddRectFilled(p0, p1, color, cr, 15); - } else { - const auto r = 0.5f * rect_w / 2.0f - 0.5f; - const auto cr = r * 0.5f; - const auto p0 = rect_center - ImVec2(r, r); - const auto p1 = rect_center + ImVec2(r, r); - - if (innerColor & 0xFF000000) - drawList->AddRectFilled(p0, p1, innerColor, cr, 15); - - drawList->AddRect(p0, p1, color, cr, 15, 2.0f * outline_scale); - } - } else if (type == IconType::Diamond) { - if (filled) { - const auto r = 0.607f * rect_w / 2.0f; - const auto c = rect_center; - - drawList->PathLineTo(c + ImVec2(0, -r)); - drawList->PathLineTo(c + ImVec2(r, 0)); - drawList->PathLineTo(c + ImVec2(0, r)); - drawList->PathLineTo(c + ImVec2(-r, 0)); - drawList->PathFillConvex(color); - } else { - const auto r = 0.607f * rect_w / 2.0f - 0.5f; - const auto c = rect_center; - - drawList->PathLineTo(c + ImVec2(0, -r)); - drawList->PathLineTo(c + ImVec2(r, 0)); - drawList->PathLineTo(c + ImVec2(0, r)); - drawList->PathLineTo(c + ImVec2(-r, 0)); - - if (innerColor & 0xFF000000) - drawList->AddConvexPolyFilled(drawList->_Path.Data, drawList->_Path.Size, innerColor); - - drawList->PathStroke(color, true, 2.0f * outline_scale); - } - } else { - const auto triangleTip = triangleStart + rect_w * (0.45f - 0.32f); - - drawList->AddTriangleFilled( - ImVec2(ceilf(triangleTip), rect_y + rect_h * 0.5f), - ImVec2(triangleStart, rect_center_y + 0.15f * rect_h), - ImVec2(triangleStart, rect_center_y - 0.15f * rect_h), - color); - } - } -} - -void ImGui::Icon(const ImVec2& size, IconType type, bool filled, const ImVec4& color, const ImVec4& innerColor) -{ - // Taken from https://github.com/thedmd/imgui-node-editor/blob/master/examples/blueprints-example/utilities/widgets.cpp - // ax::NodeEditor::Icon - - if (ImGui::IsRectVisible(size)) - { - auto cursorPos = ImGui::GetCursorScreenPos(); - auto drawList = ImGui::GetWindowDrawList(); - DrawIcon(drawList, cursorPos, cursorPos + size, type, filled, ImColor(color), ImColor(innerColor)); - } - - ImGui::Dummy(size); -} - -bool ImGui::Splitter(bool splitVertically, float thickness, float* size1, float* size2, float minSize1, float minSize2, float splitterLongAxisSize) -{ - // Taken from https://github.com/thedmd/imgui-node-editor/blob/master/examples/blueprints-example/blueprints-example.cpp - // ::Splitter - - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - ImGuiID id = window->GetID("##Splitter"); - ImRect bb; - bb.Min = window->DC.CursorPos + (splitVertically ? ImVec2(*size1, 0.0f) : ImVec2(0.0f, *size1)); - bb.Max = bb.Min + CalcItemSize(splitVertically ? ImVec2(thickness, splitterLongAxisSize) : ImVec2(splitterLongAxisSize, thickness), 0.0f, 0.0f); - return SplitterBehavior(bb, id, splitVertically ? ImGuiAxis_X : ImGuiAxis_Y, size1, size2, minSize1, minSize2, 0.0f); -} |