MakeGuiElement.h
Go to the documentation of this file.
1#pragma once
2
3#include <SimoxUtility/meta/type_traits/is_any_of.h>
4#include <SimoxUtility/meta/type_traits/is_std_array.h>
5
7#include "../Common.h"
8
9namespace armarx::meta::cfg
10{
11 template <class CL, class MT, MT CL::*ptr>
13 {
15
16 static void
17 SetMin(auto& builder, [[maybe_unused]] MT defaultValue)
18 {
19 if constexpr (is_not_undefined_t(element::min))
20 {
21 builder.min(element::min);
22 }
23 else
24 {
25 builder.min(std::min(MT{0}, defaultValue));
26 }
27 }
28
29 static void
30 SetMax(auto& builder, [[maybe_unused]] MT defaultValue)
31 {
32 if constexpr (is_not_undefined_t(element::max))
33 {
34 builder.max(element::max);
35 }
36 else
37 {
38 builder.max(std::max(MT{100}, defaultValue));
39 }
40 }
41
42 static void
43 SetDescription(auto& builder)
44 {
45 if constexpr (is_not_undefined_t(element::description))
46 {
47 builder.toolTip(element::description);
48 }
49 }
50
51 static void
52 SetSteps(auto& builder)
53 {
54 if constexpr (is_not_undefined_t(element::steps))
55 {
56 builder.steps(element::steps);
57 }
58 }
59
60 static void
61 SetDecimals(auto& builder)
62 {
63 if constexpr (is_not_undefined_t(element::decimals))
64 {
65 builder.decimals(element::decimals);
66 }
67 }
68
69 static std::string
70 GetLabel(const std::string& name)
71 {
72 if constexpr (is_not_undefined_t(element::label))
73 {
74 return element::label;
75 }
76 return name;
77 }
78
79 static auto
80 MakeLabel(const std::string& name)
81 {
82 auto b = RemoteGui::makeTextLabel(GetLabel(name));
84 return b;
85 }
86 };
87} // namespace armarx::meta::cfg
88
89//element def (variant types except int)
90namespace armarx::meta::cfg
91{
92 template <class CL, class MT, MT CL::*ptr, class = void>
93 struct gui_definition_create_element : std::false_type
94 {
95 };
96
97#define create_specalization_for_type(type) \
98 template <class CL, type CL::*ptr> \
99 struct gui_definition_create_element<CL, type, ptr, void> : std::true_type \
100 { \
101 using element = gui_definition_create_element_details<CL, type, ptr>; \
102 static std::vector<RemoteGui::WidgetPtr> \
103 create(type val, const std::string& prefix, const std::string& name); \
104 }; \
105 template <class CL, type CL::*ptr> \
106 std::vector<RemoteGui::WidgetPtr> gui_definition_create_element<CL, type, ptr>::create( \
107 type val, const std::string& prefix, const std::string& name)
108
110 {
112 using widget_t = typename element::widget_t;
113 static constexpr bool is_spinbox =
114 simox::meta::is_any_of_v<widget_t, RemoteGui::FloatSpinBox, undefined_t>;
115 static constexpr bool is_slider = std::is_same_v<RemoteGui::FloatSlider, widget_t>;
116
117 static_assert(is_spinbox || is_slider, "the given type for element_widget can't be used");
118
119 auto w = [&]
120 {
121 if constexpr (is_slider)
122 {
123 return RemoteGui::makeFloatSlider(ConcatID(prefix, name)).value(val);
124 }
125 else
126 {
127 return RemoteGui::makeFloatSpinBox(ConcatID(prefix, name)).value(val);
128 }
129 }();
130 element::SetMin(w, 0);
131 element::SetMax(w, 100);
132 element::SetDescription(w);
133 element::SetSteps(w);
134 if constexpr (is_spinbox)
135 {
136 element::SetDecimals(w);
137 }
138 else
139 {
140 static_assert(!is_not_undefined_t(element::decimals),
141 "element_decimals can't be set for a slider");
142 }
143
144 return {element::MakeLabel(name), w};
145 }
146
148 {
150 using widget_t = typename element::widget_t;
151 static constexpr bool is_checkbox =
152 simox::meta::is_any_of_v<widget_t, RemoteGui::CheckBox, undefined_t>;
153 static constexpr bool is_toggleButton = std::is_same_v<RemoteGui::ToggleButton, widget_t>;
154
155 static_assert(is_checkbox || is_toggleButton,
156 "the given type for element_widget can't be used");
157
158 auto w = [&]
159 {
160 if constexpr (is_checkbox)
161 {
162 return RemoteGui::makeCheckBox(ConcatID(prefix, name)).value(val);
163 }
164 else
165 {
166 return RemoteGui::makeToggleButton(ConcatID(prefix, name)).value(val);
167 }
168 }();
169 w.label(element::GetLabel(name));
170
171 static_assert(!is_not_undefined_t(element::min),
172 "element_min can't be set for bool widgets");
173 static_assert(!is_not_undefined_t(element::max),
174 "element_max can't be set for bool widgets");
175
176 element::SetDescription(w);
177
178 static_assert(!is_not_undefined_t(element::decimals),
179 "element_decimals can't be set for bool widgets");
180 static_assert(!is_not_undefined_t(element::steps),
181 "element_steps can't be set for bool widgets");
182 return {w};
183 }
184
186 {
188 return {
190 RemoteGui::makeLineEdit(ConcatID(prefix, name)).value(val) ///TODO
191 };
192 }
193
195 {
197 return {
199 RemoteGui::makePosRPYSpinBoxes(ConcatID(prefix, name)).value(val) ///TODO
200 };
201 }
202
204 {
206 using widget_t = typename element::widget_t;
207 static constexpr bool is_spinbox =
208 simox::meta::is_any_of_v<widget_t, RemoteGui::FloatSpinBox, undefined_t>;
209 auto w = RemoteGui::makeVector3fSpinBoxes(ConcatID(prefix, name)).value(val);
210 if constexpr (is_not_undefined_t(element::min))
211 {
212 element::SetMin(w, Eigen::Vector3f(-100, -100, -100));
213 }
214 else
215 {
216 }
217 if constexpr (is_not_undefined_t(element::max))
218 {
219 element::SetMax(w, Eigen::Vector3f(100, 100, 100));
220 }
221 else
222 {
223 }
224 element::SetSteps(w);
225 if constexpr (is_spinbox)
226 {
227 element::SetDecimals(w);
228 }
229 else
230 {
231 static_assert(!is_not_undefined_t(element::decimals),
232 "element_decimals can't be set for a slider");
233 }
234 return {
235 RemoteGui::makeTextLabel(name), w ///TODO
236
237 };
238 }
239
240#undef create_specalization_for_type
241} // namespace armarx::meta::cfg
242
243//element def (integral types except bool)
244namespace armarx::meta::cfg
245{
246 template <class CL, class MT, MT CL::*ptr>
248 CL,
249 MT,
250 ptr,
251 std::enable_if_t<std::is_integral_v<MT> && !std::is_same_v<MT, bool>>> : std::true_type
252 {
254
255 static std::vector<RemoteGui::WidgetPtr>
256 create(MT val, const std::string& prefix, const std::string& name)
257 {
259 using widget_t = typename element::widget_t;
260 static constexpr bool is_spinbox =
261 simox::meta::is_any_of_v<widget_t, RemoteGui::IntSpinBox, undefined_t>;
262 static constexpr bool is_slider = std::is_same_v<RemoteGui::IntSlider, widget_t>;
263
264 static_assert(is_spinbox || is_slider,
265 "the given type for element_widget can't be used");
266
267 auto w = [&]
268 {
269 if constexpr (is_slider)
270 {
271 return RemoteGui::makeIntSlider(ConcatID(prefix, name)).value(val);
272 }
273 else
274 {
275 return RemoteGui::makeIntSpinBox(ConcatID(prefix, name)).value(val);
276 }
277 }();
278
279 element::SetMin(w, 0);
280 element::SetMax(w, 100);
281
283
284 static_assert(!is_not_undefined_t(element::decimals),
285 "element_decimals can't be set for int spin boxes or sliders");
286 static_assert(!is_not_undefined_t(element::steps),
287 "element_steps can't be set for int spin boxes or sliders");
288
289 return {element::MakeLabel(name), w};
290 }
291 };
292} // namespace armarx::meta::cfg
293
294#include <SimoxUtility/meta/enum/adapt_enum.h>
295
296//element def (enum types)
297namespace armarx::meta::cfg
298{
299 template <class CL, class MT, MT CL::*ptr>
301 MT,
302 ptr,
303 std::enable_if_t<simox::meta::is_enum_adapted_v<MT>>> :
304 std::true_type
305 {
307
308 static std::vector<RemoteGui::WidgetPtr>
309 create(MT val, const std::string& prefix, const std::string& name)
310 {
312 static_assert(simox::meta::is_any_of_v<typename element::widget_t,
313 RemoteGui::ComboBox,
315 "the given type for element_widget can't be used");
316 static_assert(is_undefined_t(element::min));
317 static_assert(is_undefined_t(element::max));
318 static_assert(is_undefined_t(element::decimals));
319 static_assert(is_undefined_t(element::steps));
320 static_assert(is_undefined_t(element::label));
321
322 auto builder = RemoteGui::makeComboBox(ConcatID(prefix, name));
323
324 const auto& names = simox::meta::enum_names<MT>;
325
326 builder.addOptions(names.template names<std::vector>());
327 builder.value(names.to_name(val));
329
330 return {element::MakeLabel(name), builder};
331 }
332 };
333} // namespace armarx::meta::cfg
#define create_specalization_for_type(type)
detail::IntSpinBoxBuilder makeIntSpinBox(std::string const &name)
detail::ToggleButtonBuilder makeToggleButton(std::string const &name)
Definition BoolWidgets.h:35
detail::CheckBoxBuilder makeCheckBox(std::string const &name)
Definition BoolWidgets.h:27
detail::ComboBoxBuilder makeComboBox(std::string const &name)
detail::FloatSliderBuilder makeFloatSlider(std::string const &name)
detail::FloatSpinBoxBuilder makeFloatSpinBox(std::string const &name)
detail::PosRPYSpinBoxesBuilder makePosRPYSpinBoxes(std::string const &name, float limpos=1000, float limrpy=M_PI)
detail::LabelBuilder makeTextLabel(std::string const &text)
detail::IntSliderBuilder makeIntSlider(std::string const &name)
detail::Vector3fSpinBoxesBuilder makeVector3fSpinBoxes(std::string const &name, float limpos=1000)
detail::LineEditBuilder makeLineEdit(std::string const &name)
::simox::meta::undefined_t undefined_t
Definition common.h:17
std::string ConcatID(const std::string &prefix, const std::string &suffix)
Definition ConcatID.h:8
Derived & value(ValueT const &value)
Definition Basic.h:84
element_widget< CL, MT, ptr > widget_t
static std::vector< RemoteGui::WidgetPtr > create(MT val, const std::string &prefix, const std::string &name)
static std::vector< RemoteGui::WidgetPtr > create(MT val, const std::string &prefix, const std::string &name)
static void SetMax(auto &builder, MT defaultValue)
static void SetMin(auto &builder, MT defaultValue)
static std::string GetLabel(const std::string &name)
#define ARMARX_TRACE
Definition trace.h:77