5#include <monopp/mono_field_invoker.h>
6#include <monopp/mono_property_invoker.h>
24auto find_attribute(
const std::string&
name,
const std::vector<mono::mono_object>& attribs) -> mono::mono_object
26 auto it = std::find_if(std::begin(attribs),
28 [&](
const mono::mono_object& obj)
30 return obj.get_type().get_name() ==
name;
33 if(it != std::end(attribs))
59 auto invoker = mono::make_field_invoker<T>(
field);
60 return invoker.get_value(obj);
63 void set_value(mono::mono_object& obj,
const T& value)
const
65 auto invoker = mono::make_field_invoker<T>(
field);
66 invoker.set_value(obj, value);
71 return field.get_attributes();
76 return field.get_type();
101 auto invoker = mono::make_property_invoker<T>(
property);
102 return invoker.get_value(obj);
105 void set_value(mono::mono_object& obj,
const T& value)
const
107 auto invoker = mono::make_property_invoker<T>(
property);
108 invoker.set_value(obj, value);
113 return property.get_attributes();
118 return property.get_type();
130template<
typename T,
typename ProxyType>
135 field_proxy.
impl->get_name = [obj_proxy, script_proxy]()
137 auto parent_name = obj_proxy.impl->get_name();
138 if(parent_name.empty())
140 return script_proxy.get_name();
142 return fmt::format(
"{}/{}", parent_name, script_proxy.get_name());
145 field_proxy.
impl->getter = [obj_proxy, script_proxy](entt::meta_any& result)
mutable
147 entt::meta_any obj_var;
148 if(obj_proxy.impl->getter(obj_var) && obj_var)
150 auto& mono_obj = obj_var.cast<mono::mono_object&>();
151 auto field_value = script_proxy.get_value(mono_obj);
153 result = entt::meta_any{std::in_place_type<T>, field_value};
159 field_proxy.
impl->setter = [obj_proxy, script_proxy](
meta_any_proxy& proxy,
const entt::meta_any& value, uint64_t execution_count)
mutable
161 entt::meta_any obj_var;
162 if(obj_proxy.impl->getter(obj_var) && obj_var)
164 auto& mono_obj = obj_var.cast<mono::mono_object&>();
165 if(value.allow_cast<T>())
167 script_proxy.set_value(mono_obj, value.cast<T>());
168 return obj_proxy.impl->setter(proxy, obj_var, execution_count);
183 template<
typename Invoker>
187 auto field_name = mutable_field.get_name();
189 handle_proxy.
impl->get_name = [obj_proxy, field_name]()
191 auto parent_name = obj_proxy.impl->get_name();
192 if(parent_name.empty())
196 return fmt::format(
"{}/{}", parent_name, field_name);
199 handle_proxy.
impl->getter = [obj_proxy, field_name, &ctx](entt::meta_any& result)
mutable
201 entt::meta_any obj_var;
202 if(obj_proxy.impl->getter(obj_var) && obj_var)
204 auto& mono_obj = obj_var.cast<mono::mono_object&>();
207 auto obj_type = mono_obj.get_type();
208 auto field = obj_type.get_field(field_name);
209 auto invoker = mono::make_field_invoker<entt::entity>(field);
211 auto entity = invoker.get_value(mono_obj);
212 auto& ec = ctx.get_cached<
ecs>();
213 auto&
scene = ec.get_scene();
216 result = entt::meta_any{std::in_place_type<entt::handle>,
handle};
222 handle_proxy.
impl->setter = [obj_proxy, field_name](
meta_any_proxy& proxy,
const entt::meta_any& value, uint64_t execution_count)
mutable
224 entt::meta_any obj_var;
225 if(obj_proxy.impl->getter(obj_var) && obj_var)
227 auto& mono_obj = obj_var.cast<mono::mono_object&>();
228 if(value.allow_cast<entt::handle>())
231 auto obj_type = mono_obj.get_type();
232 auto field = obj_type.get_field(field_name);
233 auto invoker = mono::make_field_invoker<entt::entity>(field);
235 auto handle = value.cast<entt::handle>();
236 invoker.set_value(mono_obj,
handle.entity());
237 return obj_proxy.impl->setter(proxy, obj_var, execution_count);
252template<
typename T,
typename Invoker>
256 auto field_name = mutable_field.get_name();
258 asset_proxy.
impl->get_name = [obj_proxy, field_name]()
260 auto parent_name = obj_proxy.impl->get_name();
261 if(parent_name.empty())
265 return fmt::format(
"{}/{}", parent_name, field_name);
268 asset_proxy.
impl->getter = [obj_proxy, field_name, &ctx](entt::meta_any& result)
mutable
270 entt::meta_any obj_var;
271 if(obj_proxy.impl->getter(obj_var) && obj_var)
273 auto& mono_obj = obj_var.cast<mono::mono_object&>();
276 auto obj_type = mono_obj.get_type();
277 auto field = obj_type.get_field(field_name);
278 auto invoker = mono::make_field_invoker<mono::mono_object>(field);
280 auto val = invoker.get_value(mono_obj);
286 const auto& field_type = invoker.get_type();
287 auto prop = field_type.get_property(
"uid");
288 auto mutable_prop = mono::make_property_invoker<hpp::uuid>(prop);
289 auto uid = mutable_prop.get_value(val);
292 asset = am.get_asset<T>(uid);
296 result = entt::meta_any{std::in_place_type<asset_handle<T>>, asset};
302 asset_proxy.
impl->setter = [obj_proxy, field_name](
meta_any_proxy& proxy,
const entt::meta_any& value, uint64_t execution_count)
mutable
304 entt::meta_any obj_var;
305 if(obj_proxy.impl->getter(obj_var) && obj_var)
307 auto& mono_obj = obj_var.cast<mono::mono_object&>();
311 auto obj_type = mono_obj.get_type();
312 auto field = obj_type.get_field(field_name);
313 auto invoker = mono::make_field_invoker<mono::mono_object>(field);
316 const auto& field_type = invoker.get_type();
318 auto val = invoker.get_value(mono_obj);
321 val = field_type.new_instance();
322 invoker.set_value(mono_obj, val);
327 auto prop = field_type.get_property(
"uid");
328 auto mutable_prop = mono::make_property_invoker<hpp::uuid>(prop);
329 mutable_prop.set_value(val, asset.uid());
332 return obj_proxy.impl->setter(proxy, obj_var, execution_count);
347template<
typename T,
typename Invoker>
351 auto field_name = mutable_field.get_name();
353 element_proxy.
impl->get_name = [obj_proxy, field_name, index]()
355 auto parent_name = obj_proxy.impl->get_name();
356 auto element_name = fmt::format(
"{}[{}]", field_name, index);
357 if(parent_name.empty())
361 return fmt::format(
"{}/{}", parent_name, element_name);
364 element_proxy.
impl->getter = [obj_proxy, field_name, index](entt::meta_any& result)
mutable
366 entt::meta_any obj_var;
367 if(obj_proxy.impl->getter(obj_var) && obj_var)
369 auto& mono_obj = obj_var.cast<mono::mono_object&>();
372 auto obj_type = mono_obj.get_type();
373 auto field = obj_type.get_field(field_name);
374 auto invoker = mono::make_field_invoker<mono::mono_object>(field);
376 auto val = invoker.get_value(mono_obj);
377 mono::mono_array<T> array(val);
379 if(index < array.size())
381 auto element_value = array.get(index);
383 result = entt::meta_any{std::in_place_type<T>, element_value};
390 element_proxy.
impl->setter = [obj_proxy, field_name, index](
meta_any_proxy& proxy,
const entt::meta_any& value, uint64_t execution_count)
mutable
392 entt::meta_any obj_var;
393 if(obj_proxy.impl->getter(obj_var) && obj_var)
395 auto& mono_obj = obj_var.cast<mono::mono_object&>();
396 if(value.allow_cast<T>())
399 auto obj_type = mono_obj.get_type();
400 auto field = obj_type.get_field(field_name);
401 auto invoker = mono::make_field_invoker<mono::mono_object>(field);
403 auto val = invoker.get_value(mono_obj);
404 mono::mono_array<T> array(val);
406 if(index < array.size())
408 array.set(index, value.cast<T>());
410 return obj_proxy.impl->setter(proxy, obj_var, execution_count);
417 return element_proxy;
425 mono::mono_object& obj,
427 mono::mono_field& field,
430 auto invoker = mono::make_field_invoker<T>(field);
442 mono::mono_object& obj,
444 mono::mono_field& field,
455 if(!field_proxy.impl->getter(var))
468 auto tooltip_attrib =
find_attribute(
"TooltipAttribute", attribs);
471 if(tooltip_attrib.valid())
473 auto invoker = mono::make_field_invoker<std::string>(tooltip_attrib.get_type(),
"tooltip");
474 tooltip = invoker.get_value(tooltip_attrib);
479 if(min_attrib.valid())
481 auto invoker = mono::make_field_invoker<float>(min_attrib.get_type(),
"min");
482 float min_value = invoker.get_value(min_attrib);
483 meta_attribs[
"min"] = min_value;
486 if(range_attrib.valid())
488 auto invoker = mono::make_field_invoker<float>(range_attrib.get_type(),
"min");
489 float min_value = invoker.get_value(range_attrib);
490 meta_attribs[
"min"] = min_value;
492 auto max_invoker = mono::make_field_invoker<float>(range_attrib.get_type(),
"max");
493 float max_value = max_invoker.get_value(range_attrib);
494 meta_attribs[
"max"] = max_value;
497 if(max_attrib.valid())
499 auto invoker = mono::make_field_invoker<float>(max_attrib.get_type(),
"max");
500 float max_value = invoker.get_value(max_attrib);
501 meta_attribs[
"max"] = max_value;
504 if(step_attrib.valid())
506 auto invoker = mono::make_field_invoker<float>(step_attrib.get_type(),
"step");
507 float step_value = invoker.get_value(step_attrib);
508 meta_attribs[
"step"] = step_value;
515 result |=
inspect_var(ctx, var, field_proxy, info, custom);
522 mono::mono_object& obj,
524 mono::mono_property& property,
527 auto invoker = mono::make_property_invoker<T>(property);
539 mono::mono_object& obj,
541 mono::mono_property& property,
552 if(!prop_proxy.impl->getter(var))
565 auto tooltip_attrib =
find_attribute(
"TooltipAttribute", attribs);
568 if(tooltip_attrib.valid())
570 auto invoker = mono::make_field_invoker<std::string>(tooltip_attrib.get_type(),
"tooltip");
571 tooltip = invoker.get_value(tooltip_attrib);
576 if(min_attrib.valid())
578 auto invoker = mono::make_field_invoker<float>(min_attrib.get_type(),
"min");
579 float min_value = invoker.get_value(min_attrib);
580 meta_attribs[
"min"] = min_value;
583 if(range_attrib.valid())
585 auto invoker = mono::make_field_invoker<float>(range_attrib.get_type(),
"min");
586 float min_value = invoker.get_value(range_attrib);
587 meta_attribs[
"min"] = min_value;
589 auto max_invoker = mono::make_field_invoker<float>(range_attrib.get_type(),
"max");
590 float max_value = max_invoker.get_value(range_attrib);
591 meta_attribs[
"max"] = max_value;
594 if(max_attrib.valid())
596 auto invoker = mono::make_field_invoker<float>(max_attrib.get_type(),
"max");
597 float max_value = invoker.get_value(max_attrib);
598 meta_attribs[
"max"] = max_value;
601 if(step_attrib.valid())
603 auto invoker = mono::make_field_invoker<float>(step_attrib.get_type(),
"step");
604 float step_value = invoker.get_value(step_attrib);
605 meta_attribs[
"step"] = step_value;
612 result |=
inspect_var(ctx, var, prop_proxy, info, custom);
622 static auto value_to_name(T value,
const std::vector<std::pair<T, std::string>>& mapping) ->
const std::string&
624 for(
const auto& kvp : mapping)
626 if(kvp.first == value)
632 static const std::string empty;
636 static auto name_to_value(
const std::string&
name,
const std::vector<std::pair<T, std::string>>& mapping) -> T
638 for(
const auto& kvp : mapping)
640 if(kvp.second ==
name)
646 return std::numeric_limits<T>::max();
649 template<
typename Invoker>
651 mono::mono_object& obj,
653 const Invoker& mutable_field,
654 const std::vector<std::pair<T, std::string>>& mapping,
657 auto val = mutable_field.get_value(obj);
661 auto attribs = mutable_field.get_attributes();
662 auto tooltip_attrib =
find_attribute(
"TooltipAttribute", attribs);
665 if(tooltip_attrib.valid())
667 auto invoker = mono::make_field_invoker<std::string>(tooltip_attrib.get_type(),
"tooltip");
668 tooltip = invoker.get_value(tooltip_attrib);
673 std::vector<const char*> cstrings{};
674 cstrings.reserve(mapping.size());
678 for(
const auto& pair : mapping)
680 cstrings.push_back(pair.second.c_str());
682 if(current_name == pair.second)
693 ImGui::LabelText(
"##enum",
"%s", cstrings[current_idx]);
697 int listbox_item_size =
static_cast<int>(cstrings.size());
699 ImGuiComboFlags flags = 0;
701 if(ImGui::BeginCombo(
"##enum", cstrings[current_idx], flags))
703 for(
int n = 0; n < listbox_item_size; n++)
705 const bool is_selected = (current_idx == n);
707 if(ImGui::Selectable(cstrings[n], is_selected))
715 ImGui::DrawItemActivityOutline();
719 ImGui::SetItemDefaultFocus();
725 ImGui::DrawItemActivityOutline();
730 mutable_field.set_value(obj, val);
737 mono::mono_object& obj,
739 mono::mono_field& field,
746 const auto& field_type = field.get_type();
748 auto invoker = mono::make_field_invoker<T>(field);
749 auto mapping = field_type.get_enum_values<T>();
757 mono::mono_object& obj,
759 mono::mono_field& field,
760 const std::vector<std::pair<T, std::string>>& mapping,
775 auto tooltip_attrib =
find_attribute(
"TooltipAttribute", attribs);
778 if(tooltip_attrib.valid())
780 auto invoker = mono::make_field_invoker<std::string>(tooltip_attrib.get_type(),
"tooltip");
781 tooltip = invoker.get_value(tooltip_attrib);
786 std::vector<const char*> cstrings{};
787 cstrings.reserve(mapping.size());
791 for(
const auto& pair : mapping)
793 cstrings.push_back(pair.second.c_str());
795 if(current_name == pair.second)
806 ImGui::LabelText(
"##enum",
"%s", cstrings[current_idx]);
810 int listbox_item_size =
static_cast<int>(cstrings.size());
812 ImGuiComboFlags flags = 0;
814 if(ImGui::BeginCombo(
"##enum", cstrings[current_idx], flags))
816 for(
int n = 0; n < listbox_item_size; n++)
818 const bool is_selected = (current_idx == n);
820 if(ImGui::Selectable(cstrings[n], is_selected))
828 entt::meta_any new_value = entt::forward_as_meta(val);
829 entt::meta_any old_value;
830 field_proxy.impl->getter(old_value);
836 ImGui::DrawItemActivityOutline();
840 ImGui::SetItemDefaultFocus();
846 ImGui::DrawItemActivityOutline();
853 mono::mono_object& obj,
855 mono::mono_property& property,
862 const auto& field_type =
property.get_type();
864 auto invoker = mono::make_property_invoker<T>(property);
865 auto mapping = field_type.get_enum_values<T>();
873 mono::mono_object& obj,
875 mono::mono_property& property,
876 const std::vector<std::pair<T, std::string>>& mapping,
891 auto tooltip_attrib =
find_attribute(
"TooltipAttribute", attribs);
894 if(tooltip_attrib.valid())
896 auto invoker = mono::make_field_invoker<std::string>(tooltip_attrib.get_type(),
"tooltip");
897 tooltip = invoker.get_value(tooltip_attrib);
902 std::vector<const char*> cstrings{};
903 cstrings.reserve(mapping.size());
907 for(
const auto& pair : mapping)
909 cstrings.push_back(pair.second.c_str());
911 if(current_name == pair.second)
922 ImGui::LabelText(
"##enum",
"%s", cstrings[current_idx]);
926 int listbox_item_size =
static_cast<int>(cstrings.size());
928 ImGuiComboFlags flags = 0;
930 if(ImGui::BeginCombo(
"##enum", cstrings[current_idx], flags))
932 for(
int n = 0; n < listbox_item_size; n++)
934 const bool is_selected = (current_idx == n);
936 if(ImGui::Selectable(cstrings[n], is_selected))
944 entt::meta_any new_value = entt::forward_as_meta(val);
945 entt::meta_any old_value;
946 prop_proxy.impl->getter(old_value);
952 ImGui::DrawItemActivityOutline();
956 ImGui::SetItemDefaultFocus();
962 ImGui::DrawItemActivityOutline();
972 template<
typename Invoker>
974 mono::mono_object& obj,
976 const Invoker& mutable_field,
981 auto attribs = mutable_field.get_attributes();
982 auto tooltip_attrib =
find_attribute(
"TooltipAttribute", attribs);
985 if(tooltip_attrib.valid())
987 auto invoker = mono::make_field_invoker<std::string>(tooltip_attrib.get_type(),
"tooltip");
988 tooltip = invoker.get_value(tooltip_attrib);
996 if(!handle_proxy.impl->getter(var))
1003 result |=
inspect_var(ctx, var, handle_proxy, info);
1010 mono::mono_object& obj,
1012 mono::mono_field& field,
1015 auto invoker = mono::make_field_invoker<entt::entity>(field);
1021 return inspect_invoker(ctx, obj, obj_proxy, invoker, field_info);
1025 mono::mono_object& obj,
1027 mono::mono_property& field,
1030 auto invoker = mono::make_property_invoker<entt::entity>(field);
1036 return inspect_invoker(ctx, obj, obj_proxy, invoker, field_info);
1043 template<
typename Invoker>
1045 mono::mono_object& obj,
1047 const Invoker& mutable_field,
1052 auto attribs = mutable_field.get_attributes();
1053 auto tooltip_attrib =
find_attribute(
"TooltipAttribute", attribs);
1056 if(tooltip_attrib.valid())
1058 auto invoker = mono::make_field_invoker<std::string>(tooltip_attrib.get_type(),
"tooltip");
1059 tooltip = invoker.get_value(tooltip_attrib);
1067 if(!asset_proxy.impl->getter(var))
1074 result |=
inspect_var(ctx, var, asset_proxy, info);
1081 mono::mono_object& obj,
1083 mono::mono_field& field,
1086 auto invoker = mono::make_field_invoker<mono::mono_object>(field);
1092 return inspect_invoker(ctx, obj, obj_proxy, invoker, field_info);
1096 mono::mono_object& obj,
1098 mono::mono_property& field,
1101 auto invoker = mono::make_property_invoker<mono::mono_object>(field);
1107 return inspect_invoker(ctx, obj, obj_proxy, invoker, field_info);
1114 template<
typename Invoker>
1116 mono::mono_object& obj,
1118 const Invoker& mutable_field,
1123 auto val = mutable_field.get_value(obj);
1124 mono::mono_array<T> array(val);
1126 for(
size_t i = 0; i < array.size(); ++i)
1132 entt::meta_any element;
1133 if(element_proxy.impl->getter(element))
1142 mono::mono_object& obj,
1144 mono::mono_field& field,
1147 auto invoker = mono::make_field_invoker<mono::mono_object>(field);
1153 return inspect_invoker(ctx, obj, obj_proxy, invoker, field_info);
1157 mono::mono_object& obj,
1159 mono::mono_property& field,
1162 auto invoker = mono::make_property_invoker<mono::mono_object>(field);
1168 return inspect_invoker(ctx, obj, obj_proxy, invoker, field_info);
1173 entt::meta_any& var,
1178 auto& data = var.cast<mono::mono_object&>();
1182 const auto&
type = data.get_type();
1190 auto get_field_inspector = [](
const std::string& type_name) ->
const mono_field_inspector&
1193 static std::map<std::string, mono_field_inspector> reg = {
1228 auto it = reg.find(type_name);
1233 static const mono_field_inspector empty;
1237 auto get_enum_field_inspector = [](
const std::string& type_name) ->
const mono_field_inspector&
1240 static std::map<std::string, mono_field_inspector> reg = {
1252 auto it = reg.find(type_name);
1257 static const mono_field_inspector empty;
1261 auto fields =
type.get_fields();
1262 for(
auto& field : fields)
1264 bool inspect_predicate = field.get_visibility() == mono::visibility::vis_public;
1270 inspect_predicate = !field.is_backing_field();
1272 if(inspect_predicate)
1274 const auto& field_type = field.get_type();
1276 auto field_inspector = get_field_inspector(field_type.get_name());
1279 override_ctx.
push_segment(field.get_name(), field.get_name());
1283 result |= field_inspector(ctx, data, var_proxy, field, info);
1285 else if(field_type.is_enum())
1287 auto enum_type = field_type.get_enum_base_type();
1288 auto enum_inspector = get_enum_field_inspector(enum_type.get_name());
1291 result |= enum_inspector(ctx, data, var_proxy, field, info);
1300 std::string unknown = field.get_type().get_name();
1301 entt::meta_any unknown_var = entt::forward_as_meta(unknown);
1303 auto unknown_var_proxy =
make_proxy(unknown_var);
1306 result |=
inspect_var(ctx, unknown_var, unknown_var_proxy, field_info);
1310 override_ctx.pop_segment();
1318 mono::mono_property&,
1321 auto get_property_inspector = [](
const std::string& type_name) ->
const mono_property_inspector&
1324 static std::map<std::string, mono_property_inspector> reg = {
1358 auto it = reg.find(type_name);
1363 static const mono_property_inspector empty;
1367 auto get_enum_property_inspector = [](
const std::string& type_name) ->
const mono_property_inspector&
1370 static std::map<std::string, mono_property_inspector> reg = {
1382 auto it = reg.find(type_name);
1387 static const mono_property_inspector empty;
1391 auto properties =
type.get_properties();
1392 for(
auto& prop : properties)
1394 bool inspect_predicate = prop.get_visibility() == mono::visibility::vis_public;
1399 inspect_predicate =
true;
1402 if(inspect_predicate)
1404 const auto& prop_type = prop.get_type();
1406 auto property_inspector = get_property_inspector(prop_type.get_name());
1409 override_ctx.
push_segment(prop.get_name(), prop.get_name());
1411 if(property_inspector)
1413 result |= property_inspector(ctx, data, var_proxy, prop, info);
1415 else if(prop_type.is_enum())
1417 auto enum_type = prop_type.get_enum_base_type();
1418 auto enum_inspector = get_enum_property_inspector(enum_type.get_name());
1421 result |= enum_inspector(ctx, data, var_proxy, prop, info);
1430 std::string unknown = prop.get_type().get_name();
1431 entt::meta_any unknown_var = entt::forward_as_meta(unknown);
1433 auto unknown_var_proxy =
make_proxy(unknown_var);
1437 result |=
inspect_var(ctx, unknown_var, unknown_var_proxy, field_info);
1441 override_ctx.pop_segment();
1450 entt::meta_any& var,
1456 obj_proxy.
impl->get_name = [parent_proxy = var_proxy]()
1458 return parent_proxy.impl->get_name();
1460 obj_proxy.
impl->getter = [parent_proxy = var_proxy](entt::meta_any& result)
1463 if(parent_proxy.impl->getter(var) && var)
1465 auto& data = var.cast<mono::mono_scoped_object&>();
1466 auto& mono_obj =
static_cast<mono::mono_object&
>(data.object);
1467 result = entt::forward_as_meta(mono_obj);
1472 obj_proxy.
impl->setter = [parent_proxy = var_proxy](
meta_any_proxy& proxy,
const entt::meta_any& value, uint64_t execution_count)
mutable
1475 if(proxy.impl->getter(var) && var)
1478 return parent_proxy.impl->setter(parent_proxy, var, execution_count);
1484 auto& data = var.cast<mono::mono_scoped_object&>();
1485 auto& mono_obj =
static_cast<mono::mono_object&
>(data.object);
1486 auto obj_var = entt::forward_as_meta(mono_obj);
Manages assets, including loading, unloading, and storage.
Manages ImGui layout for property inspection in the editor.
void PushReadonly(bool _enabled)
std::map< std::string, meta_any > attributes
auto make_custom(Args &&...args) -> entt::meta_custom
auto inspect_property(rtti::context &ctx, entt::meta_any &object, const meta_any_proxy &var_proxy, const entt::meta_data &prop) -> inspect_result
auto make_array_element_proxy(const meta_any_proxy &obj_proxy, const Invoker &mutable_field, size_t index) -> meta_any_proxy
Creates a specialized proxy for individual array elements in script objects.
auto find_attribute(const std::string &name, const std::vector< mono::mono_object > &attribs) -> mono::mono_object
void add_property_action(rtti::context &ctx, prefab_override_context &override_ctx, inspect_result &result, const meta_any_proxy &var_proxy, const entt::meta_any &old_var, const entt::meta_any &new_var, const entt::meta_custom &custom)
auto make_entity_handle_proxy(const meta_any_proxy &obj_proxy, const Invoker &mutable_field, rtti::context &ctx) -> meta_any_proxy
Creates a specialized proxy for entity handle fields in script objects.
auto make_asset_handle_proxy(const meta_any_proxy &obj_proxy, const Invoker &mutable_field, rtti::context &ctx) -> meta_any_proxy
Creates a specialized proxy for asset handle fields in script objects.
auto make_script_proxy(const meta_any_proxy &obj_proxy, const ProxyType &script_proxy) -> meta_any_proxy
Creates a meta_any_proxy that can access script fields through the proxy wrapper.
auto is_debug_view() -> bool
Checks if currently in debug view mode.
auto make_proxy(entt::meta_any &var, const std::string &name) -> meta_any_proxy
Creates a simple proxy for direct variable access.
auto inspect_var(rtti::context &ctx, entt::meta_any &var, const meta_any_proxy &var_proxy, const var_info &info, const entt::meta_custom &custom) -> inspect_result
Main entry point for inspecting any variable with automatic type resolution.
Represents a handle to an asset, providing access and management functions.
Manages the entity-component-system (ECS) operations for the ACE framework.
Result of an inspection operation indicating what changes occurred.
bool changed
Whether the value was modified during inspection.
bool edit_finished
Whether user finished editing (e.g., released mouse or pressed enter)
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
Proxy wrapper for mono field access that integrates with meta_any_proxy system.
auto get_name() const -> std::string
auto get_value(mono::mono_object &obj) const -> T
mono_field_proxy(mono::mono_field f)
auto get_attributes() const
void set_value(mono::mono_object &obj, const T &value) const
static auto inspect_field(rtti::context &ctx, mono::mono_object &obj, const meta_any_proxy &obj_proxy, mono::mono_field &field, const var_info &info) -> inspect_result
static auto inspect_invoker(rtti::context &ctx, mono::mono_object &obj, const meta_any_proxy &obj_proxy, const Invoker &mutable_field, const var_info &info) -> inspect_result
static auto inspect_property(rtti::context &ctx, mono::mono_object &obj, const meta_any_proxy &obj_proxy, mono::mono_property &field, const var_info &info) -> inspect_result
static auto inspect_invoker(rtti::context &ctx, mono::mono_object &obj, const meta_any_proxy &obj_proxy, const Invoker &mutable_field, const var_info &info) -> inspect_result
static auto inspect_field(rtti::context &ctx, mono::mono_object &obj, const meta_any_proxy &obj_proxy, mono::mono_field &field, const var_info &info) -> inspect_result
static auto inspect_property(rtti::context &ctx, mono::mono_object &obj, const meta_any_proxy &obj_proxy, mono::mono_property &field, const var_info &info) -> inspect_result
static auto inspect_property(rtti::context &ctx, mono::mono_object &obj, const meta_any_proxy &obj_proxy, mono::mono_property &field, const var_info &info) -> inspect_result
static auto inspect_invoker(rtti::context &ctx, mono::mono_object &obj, const meta_any_proxy &obj_proxy, const Invoker &mutable_field, const var_info &info) -> inspect_result
static auto inspect_field(rtti::context &ctx, mono::mono_object &obj, const meta_any_proxy &obj_proxy, mono::mono_field &field, const var_info &info) -> inspect_result
static auto inspect_field(rtti::context &ctx, mono::mono_object &obj, const meta_any_proxy &obj_proxy, mono::mono_field &field, const var_info &info) -> inspect_result
static auto name_to_value(const std::string &name, const std::vector< std::pair< T, std::string > > &mapping) -> T
static auto inspect_enum_property_with_proxy(rtti::context &ctx, mono::mono_object &obj, const meta_any_proxy &obj_proxy, mono::mono_property &property, const std::vector< std::pair< T, std::string > > &mapping, const var_info &info) -> inspect_result
static auto inspect_invoker(rtti::context &ctx, mono::mono_object &obj, const meta_any_proxy &obj_proxy, const Invoker &mutable_field, const std::vector< std::pair< T, std::string > > &mapping, const var_info &info) -> inspect_result
static auto inspect_property(rtti::context &ctx, mono::mono_object &obj, const meta_any_proxy &obj_proxy, mono::mono_property &property, const var_info &info) -> inspect_result
static auto inspect_enum_field_with_proxy(rtti::context &ctx, mono::mono_object &obj, const meta_any_proxy &obj_proxy, mono::mono_field &field, const std::vector< std::pair< T, std::string > > &mapping, const var_info &info) -> inspect_result
static auto value_to_name(T value, const std::vector< std::pair< T, std::string > > &mapping) -> const std::string &
static auto inspect_property(rtti::context &ctx, mono::mono_object &obj, const meta_any_proxy &obj_proxy, mono::mono_property &property, const var_info &info) -> inspect_result
static auto inspect_field(rtti::context &ctx, mono::mono_object &obj, const meta_any_proxy &obj_proxy, mono::mono_field &field, const var_info &info) -> inspect_result
static auto inspect_invoker_with_proxy(rtti::context &ctx, mono::mono_object &obj, const meta_any_proxy &obj_proxy, mono::mono_field &field, const var_info &info) -> inspect_result
static auto inspect_property_with_proxy(rtti::context &ctx, mono::mono_object &obj, const meta_any_proxy &obj_proxy, mono::mono_property &property, const var_info &info) -> inspect_result
Proxy wrapper for mono property access that integrates with meta_any_proxy system.
auto get_attributes() const
mono_property_proxy(mono::mono_property p)
std::string property_name
void set_value(mono::mono_object &obj, const T &value) const
auto get_name() const -> std::string
auto get_value(mono::mono_object &obj) const -> T
mono::mono_property property
Global context for tracking prefab override changes during inspection.
void push_segment(const std::string &segment, const std::string &pretty_segment)
Pushes a new path segment onto both contexts and applies override styling.
Represents a scene in the ACE framework, managing entities and their relationships.
auto create_handle(entt::entity e) -> entt::handle
Creates an entity in the scene.
Metadata about a variable being inspected.
bool is_property
Whether this is a property that can be overridden in prefabs.
bool read_only
Whether the variable should be displayed as read-only.