INSTINCT Code Coverage Report


Directory: src/
File: internal/gui/widgets/Spinner.cpp
Date: 2025-02-07 16:54:41
Exec Total Coverage
Lines: 0 24 0.0%
Functions: 0 1 0.0%
Branches: 0 16 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 "Spinner.hpp"
10
11 #include <imgui_internal.h>
12
13 #include <cmath>
14
15 void NAV::gui::widgets::Spinner(const char* label, const ImU32& color, float radius, float thickness)
16 {
17 ImGuiWindow* window = ImGui::GetCurrentWindow();
18 if (window->SkipItems)
19 {
20 return;
21 }
22
23 ImGuiContext& g = *GImGui;
24 const ImGuiStyle& style = g.Style;
25 const ImGuiID id = window->GetID(label);
26
27 ImVec2 pos = window->DC.CursorPos;
28 ImVec2 size((radius) * 2 + style.FramePadding.x, (radius + style.FramePadding.y) * 2);
29
30 const ImRect bb(pos, ImVec2(pos.x + size.x, pos.y + size.y));
31 ImGui::ItemSize(bb, style.FramePadding.y);
32 if (!ImGui::ItemAdd(bb, id))
33 {
34 return;
35 }
36
37 // Render
38 window->DrawList->PathClear();
39
40 int num_segments = 30;
41 int start = static_cast<int>(std::abs(std::sin(g.Time * 1.8) * (num_segments - 5)));
42
43 const float a_min = IM_PI * 2.0F * static_cast<float>(start) / static_cast<float>(num_segments);
44 const float a_max = IM_PI * 2.0F * static_cast<float>(num_segments - 3) / static_cast<float>(num_segments);
45
46 const ImVec2 centre = ImVec2(pos.x + radius, pos.y + radius + style.FramePadding.y);
47
48 for (int i = 0; i < num_segments; i++)
49 {
50 const float a = a_min + (static_cast<float>(i) / static_cast<float>(num_segments)) * (a_max - a_min);
51 window->DrawList->PathLineTo(ImVec2(centre.x + ImCos(a + static_cast<float>(g.Time) * 8) * radius,
52 centre.y + ImSin(a + static_cast<float>(g.Time) * 8) * radius));
53 }
54
55 window->DrawList->PathStroke(color, false, thickness);
56 }
57