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 |
|
|
/// @file EnumCombo.hpp |
10 |
|
|
/// @brief Combo representing an enumeration |
11 |
|
|
/// @author T. Topp (topp@ins.uni-stuttgart.de) |
12 |
|
|
/// @date 2023-01-31 |
13 |
|
|
|
14 |
|
|
#pragma once |
15 |
|
|
|
16 |
|
|
#include <imgui.h> |
17 |
|
|
#include <fmt/core.h> |
18 |
|
|
|
19 |
|
|
namespace NAV::gui::widgets |
20 |
|
|
{ |
21 |
|
|
|
22 |
|
|
/// @brief Combo representing an enumeration |
23 |
|
|
/// @tparam T Enumeration Type |
24 |
|
|
/// @param[in] label Label to show beside the combo box. This has to be a unique id for ImGui. |
25 |
|
|
/// @param[in] enumeration Reference to the enumeration variable to select |
26 |
|
|
/// @param[in] startIdx Start Index in the enum (so skip first items) |
27 |
|
|
/// @return True if the value changed |
28 |
|
|
/// @attention The Enum type needs a last element called 'COUNT' |
29 |
|
|
template<typename T> |
30 |
|
✗ |
bool EnumCombo(const char* label, T& enumeration, size_t startIdx = 0) |
31 |
|
|
{ |
32 |
|
✗ |
bool clicked = false; |
33 |
|
✗ |
if (ImGui::BeginCombo(label, NAV::to_string(enumeration))) |
34 |
|
|
{ |
35 |
|
✗ |
for (size_t i = startIdx; i < static_cast<size_t>(T::COUNT); i++) |
36 |
|
|
{ |
37 |
|
✗ |
const bool is_selected = (static_cast<size_t>(enumeration) == i); |
38 |
|
✗ |
if (ImGui::Selectable(NAV::to_string(static_cast<T>(i)), is_selected)) |
39 |
|
|
{ |
40 |
|
✗ |
enumeration = static_cast<T>(i); |
41 |
|
✗ |
clicked = true; |
42 |
|
|
} |
43 |
|
|
|
44 |
|
|
// Set the initial focus when opening the combo (scrolling + keyboard navigation focus) |
45 |
|
✗ |
if (is_selected) |
46 |
|
|
{ |
47 |
|
✗ |
ImGui::SetItemDefaultFocus(); |
48 |
|
|
} |
49 |
|
|
} |
50 |
|
|
|
51 |
|
✗ |
ImGui::EndCombo(); |
52 |
|
|
} |
53 |
|
✗ |
return clicked; |
54 |
|
|
} |
55 |
|
|
|
56 |
|
|
/// @brief Combo representing two enumerations. Values will be displayed appended and set to the same value. |
57 |
|
|
/// @tparam T Enumeration Type |
58 |
|
|
/// @param[in] label Label to show beside the combo box. This has to be a unique id for ImGui. |
59 |
|
|
/// @param[in] enumeration1 Reference to the first enumeration variable to select |
60 |
|
|
/// @param[in] enumeration2 Reference to the second enumeration variable to set to the same value as the first one |
61 |
|
|
/// @param[in] previewAppendix Additional text to show in the combo preview |
62 |
|
|
/// @return True if the value changed |
63 |
|
|
/// @attention The Enum type needs a last element called 'COUNT' |
64 |
|
|
template<typename T> |
65 |
|
✗ |
bool EnumCombo(const char* label, T& enumeration1, T& enumeration2, const char* previewAppendix = "") |
66 |
|
|
{ |
67 |
|
✗ |
bool clicked = false; |
68 |
|
✗ |
std::string previewText = enumeration1 == enumeration2 |
69 |
|
✗ |
? fmt::format("{}{}", NAV::to_string(enumeration1), previewAppendix) |
70 |
|
✗ |
: fmt::format("{} | {}{}", NAV::to_string(enumeration1), NAV::to_string(enumeration2), previewAppendix); |
71 |
|
✗ |
if (ImGui::BeginCombo(label, previewText.c_str())) |
72 |
|
|
{ |
73 |
|
✗ |
for (size_t i = 0; i < static_cast<size_t>(T::COUNT); i++) |
74 |
|
|
{ |
75 |
|
✗ |
const bool is_selected = (static_cast<size_t>(enumeration1) == i); |
76 |
|
✗ |
if (ImGui::Selectable(NAV::to_string(static_cast<T>(i)), is_selected)) |
77 |
|
|
{ |
78 |
|
✗ |
enumeration1 = static_cast<T>(i); |
79 |
|
✗ |
enumeration2 = static_cast<T>(i); |
80 |
|
✗ |
clicked = true; |
81 |
|
|
} |
82 |
|
|
|
83 |
|
|
// Set the initial focus when opening the combo (scrolling + keyboard navigation focus) |
84 |
|
✗ |
if (is_selected) |
85 |
|
|
{ |
86 |
|
✗ |
ImGui::SetItemDefaultFocus(); |
87 |
|
|
} |
88 |
|
|
} |
89 |
|
|
|
90 |
|
✗ |
ImGui::EndCombo(); |
91 |
|
|
} |
92 |
|
✗ |
return clicked; |
93 |
|
✗ |
} |
94 |
|
|
|
95 |
|
|
} // namespace NAV::gui::widgets |
96 |
|
|
|