Unravel Engine C++ Reference
Loading...
Searching...
No Matches
inspector_basetypes.cpp
Go to the documentation of this file.
2#include "imgui_widgets/utils.h"
3
4namespace unravel
5{
6
7template<typename T>
9 entt::meta_any& var,
10 const var_info& info,
11 const entt::meta_custom& custom,
12 const char* fmt0 = "Min:",
13 const char* fmt1 = "Max:") -> inspect_result
14{
15 auto& data = var.cast<range<T>&>();
16
17 T min{};
18 T max{};
19 float step = 0.01f;
20
21 T* min_ptr{};
22 T* max_ptr{};
23 auto min_var = entt::get_attribute(custom, "min");
24 if(min_var && min_var.allow_cast<T>())
25 {
26 min = min_var.cast<T>();
27 min_ptr = &min;
28 }
29
30
31 auto max_var = entt::get_attribute(custom, "max");
32 if(max_var && max_var.allow_cast<T>())
33 {
34 max = max_var.cast<T>();
35 max_ptr = &max;
36 }
37
38
39 auto step_var = entt::get_attribute(custom, "step");
40 if(step_var && step_var.try_cast<float>())
41 {
42 step = step_var.cast<float>();
43 }
44
45 const auto formatted0 = fmt::format("{}{}", fmt0, ImGui::GetDataPrintFormat<T>());
46 const auto formatted1 = fmt::format("{}{}", fmt1, ImGui::GetDataPrintFormat<T>());
47
48 std::array<const char*, 2> formats = {{formatted0.c_str(), formatted1.c_str()}};
49
50 inspect_result result{};
51 T prev_min = data.min;
52 T prev_max = data.max;
53 result.changed = ImGui::DragMultiFormatScalarN("##",
54 ImGui::GetDataType<T>(),
55 &data.min,
56 2,
57 step,
58 min_ptr,
59 max_ptr,
60 formats.data());
61
62 if(result.changed)
63 {
64 bool min_changed = prev_min != data.min;
65 bool max_changed = prev_max != data.max;
66 if(max_changed && data.max < data.min)
67 {
68 data.max = data.min;
69 }
70
71 if(min_changed && data.min > data.max)
72 {
73 data.min = data.max;
74 }
75 }
76
77 ImGui::ActiveItemWrapMousePos();
78
79 result.edit_finished = ImGui::IsItemDeactivatedAfterEdit();
80
81 // ImGui::DrawItemActivityOutline();
82
83 return result;
84}
85
86template<typename T>
88 entt::meta_any& var,
89 const var_info& info,
90 const entt::meta_custom& custom,
91 const char* fmt0 = "Min:",
92 const char* fmt1 = "Max:") -> inspect_result
93{
94 auto& data = var.cast<size<T>&>();
95
96 T min{};
97 T max{};
98
99 T* min_ptr{};
100 T* max_ptr{};
101 auto min_var = entt::get_attribute(custom, "min");
102 if(min_var && min_var.allow_cast<T>())
103 {
104 min = min_var.cast<T>();
105 min_ptr = &min;
106 }
107
108 auto max_var = entt::get_attribute(custom, "max");
109 if(max_var && max_var.allow_cast<T>())
110 {
111 max = max_var.cast<T>();
112 max_ptr = &max;
113 }
114 const auto formatted0 = fmt::format("{}{}", fmt0, ImGui::GetDataPrintFormat<T>());
115 const auto formatted1 = fmt::format("{}{}", fmt1, ImGui::GetDataPrintFormat<T>());
116
117 std::array<const char*, 2> formats = {{formatted0.c_str(), formatted1.c_str()}};
118
119 inspect_result result{};
120 result.changed = ImGui::DragMultiFormatScalarN("##",
121 ImGui::GetDataType<T>(),
122 &data.width,
123 2,
124 0.5f,
125 min_ptr,
126 max_ptr,
127 formats.data());
128 ImGui::ActiveItemWrapMousePos();
129
130 result.edit_finished = ImGui::IsItemDeactivatedAfterEdit();
131
132 // ImGui::DrawItemActivityOutline();
133
134 return result;
135}
136
138 entt::meta_any& var,
139 const meta_any_proxy& var_proxy,
140 const var_info& info,
141 const entt::meta_custom& custom) -> inspect_result
142{
143 return inspect_range_scalar<float>(ctx, var, info, custom);
144}
145
147 entt::meta_any& var,
148 const meta_any_proxy& var_proxy,
149 const var_info& info,
150 const entt::meta_custom& custom) -> inspect_result
151{
152 return inspect_range_scalar<double>(ctx, var, info, custom);
153}
154
156 entt::meta_any& var,
157 const meta_any_proxy& var_proxy,
158 const var_info& info,
159 const entt::meta_custom& custom) -> inspect_result
160{
161 return inspect_range_scalar<int8_t>(ctx, var, info, custom);
162}
163
165 entt::meta_any& var,
166 const meta_any_proxy& var_proxy,
167 const var_info& info,
168 const entt::meta_custom& custom) -> inspect_result
169{
170 return inspect_range_scalar<int16_t>(ctx, var, info, custom);
171}
172
174 entt::meta_any& var,
175 const meta_any_proxy& var_proxy,
176 const var_info& info,
177 const entt::meta_custom& custom) -> inspect_result
178{
179 return inspect_range_scalar<int32_t>(ctx, var, info, custom);
180}
181
183 entt::meta_any& var,
184 const meta_any_proxy& var_proxy,
185 const var_info& info,
186 const entt::meta_custom& custom) -> inspect_result
187{
188 return inspect_range_scalar<int64_t>(ctx, var, info, custom);
189}
190
192 entt::meta_any& var,
193 const meta_any_proxy& var_proxy,
194 const var_info& info,
195 const entt::meta_custom& custom) -> inspect_result
196{
197 return inspect_range_scalar<uint8_t>(ctx, var, info, custom);
198}
199
201 entt::meta_any& var,
202 const meta_any_proxy& var_proxy,
203 const var_info& info,
204 const entt::meta_custom& custom) -> inspect_result
205{
206 return inspect_range_scalar<uint16_t>(ctx, var, info, custom);
207}
208
210 entt::meta_any& var,
211 const meta_any_proxy& var_proxy,
212 const var_info& info,
213 const entt::meta_custom& custom) -> inspect_result
214{
215 return inspect_range_scalar<uint32_t>(ctx, var, info, custom);
216}
217
219 entt::meta_any& var,
220 const meta_any_proxy& var_proxy,
221 const var_info& info,
222 const entt::meta_custom& custom) -> inspect_result
223{
224 return inspect_range_scalar<uint64_t>(ctx, var, info, custom);
225}
226
228 entt::meta_any& var,
229 const meta_any_proxy& var_proxy,
230 const var_info& info,
231 const entt::meta_custom& custom) -> inspect_result
232{
233 return inspect_size_scalar<float>(ctx, var, info, custom, "W:", "H:");
234}
235
237 entt::meta_any& var,
238 const meta_any_proxy& var_proxy,
239 const var_info& info,
240 const entt::meta_custom& custom) -> inspect_result
241{
242 return inspect_size_scalar<double>(ctx, var, info, custom, "W:", "H:");
243}
244
246 entt::meta_any& var,
247 const meta_any_proxy& var_proxy,
248 const var_info& info,
249 const entt::meta_custom& custom) -> inspect_result
250{
251 return inspect_size_scalar<int8_t>(ctx, var, info, custom, "W:", "H:");
252}
253
255 entt::meta_any& var,
256 const meta_any_proxy& var_proxy,
257 const var_info& info,
258 const entt::meta_custom& custom) -> inspect_result
259{
260 return inspect_size_scalar<int16_t>(ctx, var, info, custom, "W:", "H:");
261}
262
264 entt::meta_any& var,
265 const meta_any_proxy& var_proxy,
266 const var_info& info,
267 const entt::meta_custom& custom) -> inspect_result
268{
269 return inspect_size_scalar<int32_t>(ctx, var, info, custom, "W:", "H:");
270}
271
273 entt::meta_any& var,
274 const meta_any_proxy& var_proxy,
275 const var_info& info,
276 const entt::meta_custom& custom) -> inspect_result
277{
278 return inspect_size_scalar<int64_t>(ctx, var, info, custom, "W:", "H:");
279}
280
282 entt::meta_any& var,
283 const meta_any_proxy& var_proxy,
284 const var_info& info,
285 const entt::meta_custom& custom) -> inspect_result
286{
287 return inspect_size_scalar<uint8_t>(ctx, var, info, custom, "W:", "H:");
288}
289
291 entt::meta_any& var,
292 const meta_any_proxy& var_proxy,
293 const var_info& info,
294 const entt::meta_custom& custom) -> inspect_result
295{
296 return inspect_size_scalar<uint16_t>(ctx, var, info, custom, "W:", "H:");
297}
298
300 entt::meta_any& var,
301 const meta_any_proxy& var_proxy,
302 const var_info& info,
303 const entt::meta_custom& custom) -> inspect_result
304{
305 return inspect_size_scalar<uint32_t>(ctx, var, info, custom, "W:", "H:");
306}
307
309 entt::meta_any& var,
310 const meta_any_proxy& var_proxy,
311 const var_info& info,
312 const entt::meta_custom& custom) -> inspect_result
313{
314 return inspect_size_scalar<uint64_t>(ctx, var, info, custom, "W:", "H:");
315}
316
317} // namespace unravel
auto get_attribute(const meta_custom &custom, const char *name) -> const meta_any &
auto inspect_size_scalar(rtti::context &ctx, entt::meta_any &var, const var_info &info, const entt::meta_custom &custom, const char *fmt0="Min:", const char *fmt1="Max:") -> inspect_result
auto inspect_range_scalar(rtti::context &ctx, entt::meta_any &var, const var_info &info, const entt::meta_custom &custom, const char *fmt0="Min:", const char *fmt1="Max:") -> inspect_result
Result of an inspection operation indicating what changes occurred.
Definition inspector.h:146
bool changed
Whether the value was modified during inspection.
Definition inspector.h:148
auto inspect(rtti::context &ctx, entt::meta_any &var, const meta_any_proxy &var_proxy, const var_info &info, const entt::meta_custom &custom) -> inspect_result override
auto inspect(rtti::context &ctx, entt::meta_any &var, const meta_any_proxy &var_proxy, const var_info &info, const entt::meta_custom &custom) -> inspect_result override
auto inspect(rtti::context &ctx, entt::meta_any &var, const meta_any_proxy &var_proxy, const var_info &info, const entt::meta_custom &custom) -> inspect_result override
auto inspect(rtti::context &ctx, entt::meta_any &var, const meta_any_proxy &var_proxy, const var_info &info, const entt::meta_custom &custom) -> inspect_result override
auto inspect(rtti::context &ctx, entt::meta_any &var, const meta_any_proxy &var_proxy, const var_info &info, const entt::meta_custom &custom) -> inspect_result override
auto inspect(rtti::context &ctx, entt::meta_any &var, const meta_any_proxy &var_proxy, const var_info &info, const entt::meta_custom &custom) -> inspect_result override
auto inspect(rtti::context &ctx, entt::meta_any &var, const meta_any_proxy &var_proxy, const var_info &info, const entt::meta_custom &custom) -> inspect_result override
auto inspect(rtti::context &ctx, entt::meta_any &var, const meta_any_proxy &var_proxy, const var_info &info, const entt::meta_custom &custom) -> inspect_result override
auto inspect(rtti::context &ctx, entt::meta_any &var, const meta_any_proxy &var_proxy, const var_info &info, const entt::meta_custom &custom) -> inspect_result override
auto inspect(rtti::context &ctx, entt::meta_any &var, const meta_any_proxy &var_proxy, const var_info &info, const entt::meta_custom &custom) -> inspect_result override
auto inspect(rtti::context &ctx, entt::meta_any &var, const meta_any_proxy &var_proxy, const var_info &info, const entt::meta_custom &custom) -> inspect_result override
auto inspect(rtti::context &ctx, entt::meta_any &var, const meta_any_proxy &var_proxy, const var_info &info, const entt::meta_custom &custom) -> inspect_result override
auto inspect(rtti::context &ctx, entt::meta_any &var, const meta_any_proxy &var_proxy, const var_info &info, const entt::meta_custom &custom) -> inspect_result override
auto inspect(rtti::context &ctx, entt::meta_any &var, const meta_any_proxy &var_proxy, const var_info &info, const entt::meta_custom &custom) -> inspect_result override
auto inspect(rtti::context &ctx, entt::meta_any &var, const meta_any_proxy &var_proxy, const var_info &info, const entt::meta_custom &custom) -> inspect_result override
auto inspect(rtti::context &ctx, entt::meta_any &var, const meta_any_proxy &var_proxy, const var_info &info, const entt::meta_custom &custom) -> inspect_result override
auto inspect(rtti::context &ctx, entt::meta_any &var, const meta_any_proxy &var_proxy, const var_info &info, const entt::meta_custom &custom) -> inspect_result override
auto inspect(rtti::context &ctx, entt::meta_any &var, const meta_any_proxy &var_proxy, const var_info &info, const entt::meta_custom &custom) -> inspect_result override
auto inspect(rtti::context &ctx, entt::meta_any &var, const meta_any_proxy &var_proxy, const var_info &info, const entt::meta_custom &custom) -> inspect_result override
auto inspect(rtti::context &ctx, entt::meta_any &var, const meta_any_proxy &var_proxy, const var_info &info, const entt::meta_custom &custom) -> inspect_result override
Safe deferred property access proxy for arbitrary object properties.
Definition inspector.h:198
Metadata about a variable being inspected.
Definition inspector.h:133