3#include "entt/core/any.hpp"
4#include "imgui/imgui.h"
7#include <dotnetpp/dotnetpp.h>
34 static std::stack<dotnet::type> stack;
57auto find_attribute(
const std::string&
name,
const std::vector<dotnet::object>& attribs) -> dotnet::object
59 auto it = std::find_if(std::begin(attribs),
61 [&](
const dotnet::object& obj)
63 return obj.get_type().get_name() ==
name;
66 if(it != std::end(attribs))
75auto get_header(
const dotnet::field& field) -> std::string
77 auto attribs = field.get_attributes();
79 if(header_attrib.valid())
81 auto invoker = dotnet::make_field_invoker<std::string>(header_attrib.get_type(),
"header");
82 return invoker.get_value(header_attrib);
86auto get_header(
const dotnet::property& property) -> std::string
88 auto attribs =
property.get_attributes();
90 if(header_attrib.valid())
92 auto invoker = dotnet::make_property_invoker<std::string>(header_attrib.get_type(),
"header");
93 return invoker.get_value(header_attrib);
105template<
typename Invoker>
109 nested_proxy.
impl->parent = obj_proxy.impl;
110 auto field_name = mutable_field.get_name();
111 nested_proxy.
impl->type_name = mutable_field.get_type().get_fullname();
112 nested_proxy.
impl->name = [&]()
114 const auto& parent_name = obj_proxy.impl->name;
115 if(parent_name.empty())
119 return fmt::format(
"{}/{}", parent_name, field_name);
122 nested_proxy.
impl->getter = [obj_proxy, field_name](entt::meta_any& result)
mutable
124 entt::meta_any obj_var;
125 if(obj_proxy.impl->getter(obj_var) && obj_var)
127 auto pinned_ptr = obj_var.cast<dotnet::object_pinned_ptr>();
132 const auto& mono_obj = pinned_ptr->get_object();
135 auto obj_type = mono_obj.get_type();
136 auto field = obj_type.get_field(field_name);
137 auto invoker = dotnet::make_field_invoker<dotnet::object>(field);
139 auto nested_obj = invoker.get_value(mono_obj);
140 if(nested_obj.valid())
143 auto nested_pinned = dotnet::make_object_pinned(nested_obj);
144 result = entt::meta_any{std::in_place_type<dotnet::object_pinned_ptr>, nested_pinned};
151 nested_proxy.
impl->setter = [obj_proxy, field_name](
meta_any_proxy& proxy,
const entt::meta_any& value, uint64_t execution_count)
mutable
153 entt::meta_any obj_var;
154 if(obj_proxy.impl->getter(obj_var) && obj_var)
156 auto pinned_ptr = obj_var.cast<dotnet::object_pinned_ptr>();
161 if(
auto nested_pinned_ptr = value.try_cast<dotnet::object_pinned_ptr>())
164 auto mono_obj = pinned_ptr->get_object();
165 auto obj_type = mono_obj.get_type();
166 auto field = obj_type.get_field(field_name);
167 auto invoker = dotnet::make_field_invoker<dotnet::object>(field);
169 auto nested_obj = (*nested_pinned_ptr)->get_object();
170 invoker.set_value(mono_obj, nested_obj);
171 return obj_proxy.impl->setter(proxy, obj_var, execution_count);
186template<
typename Invoker>
190 nested_proxy.
impl->parent = obj_proxy.impl;
191 auto prop_name = mutable_property.get_name();
192 nested_proxy.
impl->type_name = mutable_property.get_type().get_fullname();
193 nested_proxy.
impl->name = [&]()
195 const auto& parent_name = obj_proxy.impl->name;
196 if(parent_name.empty())
200 return fmt::format(
"{}/{}", parent_name, prop_name);
203 nested_proxy.
impl->getter = [obj_proxy, prop_name](entt::meta_any& result)
mutable
205 entt::meta_any obj_var;
206 if(obj_proxy.impl->getter(obj_var) && obj_var)
208 auto pinned_ptr = obj_var.cast<dotnet::object_pinned_ptr>();
213 const auto& mono_obj = pinned_ptr->get_object();
216 auto obj_type = mono_obj.get_type();
217 auto property = obj_type.get_property(prop_name);
218 auto invoker = dotnet::make_property_invoker<dotnet::object>(property);
220 auto nested_obj = invoker.get_value(mono_obj);
221 if(nested_obj.valid())
224 auto nested_pinned = dotnet::make_object_pinned(nested_obj);
225 result = entt::meta_any{std::in_place_type<dotnet::object_pinned_ptr>, nested_pinned};
232 nested_proxy.
impl->setter = [obj_proxy, prop_name](
meta_any_proxy& proxy,
const entt::meta_any& value, uint64_t execution_count)
mutable
234 entt::meta_any obj_var;
235 if(obj_proxy.impl->getter(obj_var) && obj_var)
237 auto pinned_ptr = obj_var.cast<dotnet::object_pinned_ptr>();
242 if(
auto nested_pinned_ptr = value.try_cast<dotnet::object_pinned_ptr>())
245 auto mono_obj = pinned_ptr->get_object();
246 auto obj_type = mono_obj.get_type();
247 auto property = obj_type.get_property(prop_name);
248 auto invoker = dotnet::make_property_invoker<dotnet::object>(property);
250 const auto& nested_obj = (*nested_pinned_ptr)->get_object();
251 invoker.set_value(mono_obj, nested_obj);
252 return obj_proxy.impl->setter(proxy, obj_var, execution_count);
263 dotnet::object_pinned_ptr pinned_ptr,
264 const meta_any_proxy& obj_proxy,
265 const std::string&
name,
266 const var_info& info) -> inspect_result;
286 auto invoker = dotnet::make_field_invoker<T>(
field);
287 return invoker.get_value(obj);
290 void set_value(dotnet::object& obj,
const T& value)
const
292 auto invoker = dotnet::make_field_invoker<T>(
field);
293 invoker.set_value(obj, value);
298 return field.get_attributes();
303 return field.get_type();
328 auto invoker = dotnet::make_property_invoker<T>(
property);
329 return invoker.get_value(obj);
332 void set_value(dotnet::object& obj,
const T& value)
const
334 auto invoker = dotnet::make_property_invoker<T>(
property);
335 invoker.set_value(obj, value);
340 return property.get_attributes();
345 return property.get_type();
357template<
typename T,
typename ProxyType>
361 field_proxy.
impl->parent = obj_proxy.impl;
362 field_proxy.
impl->type_name = script_proxy.get_type().get_fullname();
364 field_proxy.
impl->name = [&]()
366 const auto& parent_name = obj_proxy.impl->name;
367 if(parent_name.empty())
369 return script_proxy.get_name();
371 return fmt::format(
"{}/{}", parent_name, script_proxy.get_name());
374 field_proxy.
impl->getter = [obj_proxy, script_proxy](entt::meta_any& result)
mutable
376 entt::meta_any obj_var;
377 if(obj_proxy.impl->getter(obj_var) && obj_var)
379 auto pinned_ptr = obj_var.cast<dotnet::object_pinned_ptr>();
384 const auto& mono_obj_const = pinned_ptr->get_object();
385 if(!mono_obj_const.valid())
390 auto& mono_obj =
const_cast<dotnet::object&
>(mono_obj_const);
391 auto field_value = script_proxy.get_value(mono_obj);
393 result = entt::meta_any{std::in_place_type<T>, field_value};
399 field_proxy.
impl->setter = [obj_proxy, script_proxy](
meta_any_proxy& proxy,
const entt::meta_any& value, uint64_t execution_count)
mutable
401 entt::meta_any obj_var;
402 if(obj_proxy.impl->getter(obj_var) && obj_var)
404 auto pinned_ptr = obj_var.cast<dotnet::object_pinned_ptr>();
409 if(value.try_cast<T>())
411 auto mono_obj = pinned_ptr->get_object();
412 script_proxy.set_value(mono_obj, value.cast<T>());
413 return obj_proxy.impl->setter(proxy, obj_var, execution_count);
428template<
typename Invoker>
432 handle_proxy.
impl->parent = obj_proxy.impl;
433 auto field_name = mutable_field.get_name();
434 constexpr bool is_property = std::is_base_of<dotnet::property, Invoker>::value;
436 handle_proxy.
impl->type_name = mutable_field.get_type().get_fullname();
437 handle_proxy.
impl->name = [&]()
439 const auto& parent_name = obj_proxy.impl->name;
440 if(parent_name.empty())
444 return fmt::format(
"{}/{}", parent_name, field_name);
447 handle_proxy.
impl->getter = [obj_proxy, field_name, &ctx](entt::meta_any& result)
mutable
449 entt::meta_any obj_var;
450 if(obj_proxy.impl->getter(obj_var) && obj_var)
452 auto pinned_ptr = obj_var.cast<dotnet::object_pinned_ptr>();
457 const auto& mono_obj = pinned_ptr->get_object();
460 auto obj_type = mono_obj.get_type();
461 entt::entity
entity = entt::null;
462 if constexpr(is_property)
464 auto property = obj_type.get_property(field_name);
465 auto invoker = dotnet::make_property_invoker<entt::entity>(property);
466 entity = invoker.get_value(mono_obj);
470 auto field = obj_type.get_field(field_name);
471 auto invoker = dotnet::make_field_invoker<entt::entity>(field);
472 entity = invoker.get_value(mono_obj);
479 result = entt::meta_any{std::in_place_type<entt::handle>,
handle};
485 handle_proxy.
impl->setter = [obj_proxy, field_name](
meta_any_proxy& proxy,
const entt::meta_any& value, uint64_t execution_count)
mutable
487 entt::meta_any obj_var;
488 if(obj_proxy.impl->getter(obj_var) && obj_var)
490 auto pinned_ptr = obj_var.cast<dotnet::object_pinned_ptr>();
495 if(value.try_cast<entt::handle>())
498 auto mono_obj = pinned_ptr->get_object();
499 auto obj_type = mono_obj.get_type();
500 if constexpr(is_property)
502 auto property = obj_type.get_property(field_name);
503 auto invoker = dotnet::make_property_invoker<entt::entity>(property);
504 auto handle = value.cast<entt::handle>();
505 invoker.set_value(mono_obj,
handle.entity());
509 auto field = obj_type.get_field(field_name);
510 auto invoker = dotnet::make_field_invoker<entt::entity>(field);
511 auto handle = value.cast<entt::handle>();
512 invoker.set_value(mono_obj,
handle.entity());
514 return obj_proxy.impl->setter(proxy, obj_var, execution_count);
529template<
typename T,
typename Invoker>
533 asset_proxy.
impl->parent = obj_proxy.impl;
534 auto field_name = mutable_field.get_name();
536 asset_proxy.
impl->type_name = mutable_field.get_type().get_fullname();
537 asset_proxy.
impl->name = [&]()
539 const auto& parent_name = obj_proxy.impl->name;
540 if(parent_name.empty())
544 return fmt::format(
"{}/{}", parent_name, field_name);
546 asset_proxy.
impl->getter = [obj_proxy, field_name, &ctx](entt::meta_any& result)
mutable
548 entt::meta_any obj_var;
549 if(obj_proxy.impl->getter(obj_var) && obj_var)
551 auto pinned_ptr = obj_var.cast<dotnet::object_pinned_ptr>();
556 const auto& mono_obj = pinned_ptr->get_object();
559 auto obj_type = mono_obj.get_type();
560 auto field = obj_type.get_field(field_name);
561 auto invoker = dotnet::make_field_invoker<dotnet::object>(field);
563 auto val = invoker.get_value(mono_obj);
569 const auto& field_type = invoker.get_type();
570 auto prop = field_type.get_property(
"uid");
571 auto mutable_prop = dotnet::make_property_invoker<hpp::uuid>(prop);
572 auto uid = mutable_prop.get_value(val);
575 asset = am.get_asset<T>(uid);
579 result = entt::meta_any{std::in_place_type<asset_handle<T>>, asset};
585 asset_proxy.
impl->setter = [obj_proxy, field_name](
meta_any_proxy& proxy,
const entt::meta_any& value, uint64_t execution_count)
mutable
587 entt::meta_any obj_var;
588 if(obj_proxy.impl->getter(obj_var) && obj_var)
590 auto pinned_ptr = obj_var.cast<dotnet::object_pinned_ptr>();
598 auto mono_obj = pinned_ptr->get_object();
599 const auto& obj_type = mono_obj.get_type();
600 auto field = obj_type.get_field(field_name);
601 auto invoker = dotnet::make_field_invoker<dotnet::object>(field);
604 const auto& field_type = invoker.get_type();
606 auto val = invoker.get_value(mono_obj);
609 val = field_type.new_instance();
610 invoker.set_value(mono_obj, val);
615 auto prop = field_type.get_property(
"uid");
616 auto mutable_prop = dotnet::make_property_invoker<hpp::uuid>(prop);
617 mutable_prop.set_value(val, asset.uid());
620 return obj_proxy.impl->setter(proxy, obj_var, execution_count);
651 auto type = obj.get_type();
660 value_proxy.
impl->parent = obj_proxy.impl;
661 value_proxy.
impl->type_name =
type.get_fullname();
662 value_proxy.
impl->name = obj_proxy.impl->name;
664 value_proxy.
impl->getter = [parent_proxy = obj_proxy](entt::meta_any& result)
mutable ->
bool
666 entt::meta_any obj_var;
667 if(parent_proxy.impl->getter(obj_var) && obj_var)
669 auto pinned_ptr = obj_var.cast<dotnet::object_pinned_ptr>();
674 const auto& mono_obj = pinned_ptr->get_object();
675 T value = dotnet_converter<T>::from_managed(dotnet::get_managed_ptr(mono_obj));
676 result = entt::meta_any{std::in_place_type<T>, value};
682 value_proxy.
impl->setter = [parent_proxy = obj_proxy, obj_type =
type](
meta_any_proxy& proxy,
const entt::meta_any& value, uint64_t execution_count)
mutable
684 entt::meta_any obj_var;
685 if(parent_proxy.impl->getter(obj_var) && obj_var)
687 auto pinned_ptr = obj_var.cast<dotnet::object_pinned_ptr>();
692 if(value.try_cast<T>() )
694 auto mono_obj = pinned_ptr->get_object();
695 auto type = mono_obj.get_type();
702 if(std::is_same<T, std::string>::value)
704 auto str = value.cast<std::string>();
705 auto new_mono_obj = dotnet::object(dotnet_converter<std::string>::to_managed(str));
706 auto new_pinned = dotnet::make_object_pinned(new_mono_obj);
707 obj_var = entt::meta_any{std::in_place_type<dotnet::object_pinned_ptr>, new_pinned};
709 return parent_proxy.impl->setter(parent_proxy, obj_var, execution_count);
715 auto mono_value = dotnet_converter<T>::to_managed(value.cast<T>());
716 mono_obj.box_value(mono_value,
type);
717 obj_var = entt::meta_any{std::in_place_type<dotnet::object_pinned_ptr>, pinned_ptr};
718 return parent_proxy.impl->setter(parent_proxy, obj_var, execution_count);
728 if(!value_proxy.
impl->getter(var))
734 result |=
inspect_var(ctx, var, value_proxy, info);
742 dotnet::field& field,
745 auto invoker = dotnet::make_field_invoker<T>(field);
759 dotnet::field& field,
770 if(!field_proxy.impl->getter(var))
783 auto tooltip_attrib =
find_attribute(
"TooltipAttribute", attribs);
786 if(tooltip_attrib.valid())
788 auto invoker = dotnet::make_field_invoker<std::string>(tooltip_attrib.get_type(),
"tooltip");
789 tooltip = invoker.get_value(tooltip_attrib);
794 if(min_attrib.valid())
796 auto invoker = dotnet::make_field_invoker<float>(min_attrib.get_type(),
"min");
797 float min_value = invoker.get_value(min_attrib);
798 meta_attribs[
"min"] = min_value;
801 if(range_attrib.valid())
803 auto invoker = dotnet::make_field_invoker<float>(range_attrib.get_type(),
"min");
804 float min_value = invoker.get_value(range_attrib);
805 meta_attribs[
"min"] = min_value;
807 auto max_invoker = dotnet::make_field_invoker<float>(range_attrib.get_type(),
"max");
808 float max_value = max_invoker.get_value(range_attrib);
809 meta_attribs[
"max"] = max_value;
812 if(max_attrib.valid())
814 auto invoker = dotnet::make_field_invoker<float>(max_attrib.get_type(),
"max");
815 float max_value = invoker.get_value(max_attrib);
816 meta_attribs[
"max"] = max_value;
819 if(step_attrib.valid())
821 auto invoker = dotnet::make_field_invoker<float>(step_attrib.get_type(),
"step");
822 float step_value = invoker.get_value(step_attrib);
823 meta_attribs[
"step"] = step_value;
830 result |=
inspect_var(ctx, var, field_proxy, info, custom);
839 dotnet::property& property,
842 auto invoker = dotnet::make_property_invoker<T>(property);
856 dotnet::property& property,
867 if(!prop_proxy.impl->getter(var))
880 auto tooltip_attrib =
find_attribute(
"TooltipAttribute", attribs);
883 if(tooltip_attrib.valid())
885 auto invoker = dotnet::make_field_invoker<std::string>(tooltip_attrib.get_type(),
"tooltip");
886 tooltip = invoker.get_value(tooltip_attrib);
891 if(min_attrib.valid())
893 auto invoker = dotnet::make_field_invoker<float>(min_attrib.get_type(),
"min");
894 float min_value = invoker.get_value(min_attrib);
895 meta_attribs[
"min"] = min_value;
898 if(range_attrib.valid())
900 auto invoker = dotnet::make_field_invoker<float>(range_attrib.get_type(),
"min");
901 float min_value = invoker.get_value(range_attrib);
902 meta_attribs[
"min"] = min_value;
904 auto max_invoker = dotnet::make_field_invoker<float>(range_attrib.get_type(),
"max");
905 float max_value = max_invoker.get_value(range_attrib);
906 meta_attribs[
"max"] = max_value;
909 if(max_attrib.valid())
911 auto invoker = dotnet::make_field_invoker<float>(max_attrib.get_type(),
"max");
912 float max_value = invoker.get_value(max_attrib);
913 meta_attribs[
"max"] = max_value;
916 if(step_attrib.valid())
918 auto invoker = dotnet::make_field_invoker<float>(step_attrib.get_type(),
"step");
919 float step_value = invoker.get_value(step_attrib);
920 meta_attribs[
"step"] = step_value;
927 result |=
inspect_var(ctx, var, prop_proxy, info, custom);
937 static auto value_to_name(T value,
const std::vector<std::pair<T, std::string>>& mapping) ->
const std::string&
939 for(
const auto& kvp : mapping)
941 if(kvp.first == value)
947 static const std::string empty;
951 static auto name_to_value(
const std::string&
name,
const std::vector<std::pair<T, std::string>>& mapping) -> T
953 for(
const auto& kvp : mapping)
955 if(kvp.second ==
name)
961 return std::numeric_limits<T>::max();
964 template<
typename Invoker>
968 const Invoker& mutable_field,
969 const std::vector<std::pair<T, std::string>>& mapping,
972 auto val = mutable_field.get_value(obj);
976 auto attribs = mutable_field.get_attributes();
977 auto tooltip_attrib =
find_attribute(
"TooltipAttribute", attribs);
980 if(tooltip_attrib.valid())
982 auto invoker = dotnet::make_field_invoker<std::string>(tooltip_attrib.get_type(),
"tooltip");
983 tooltip = invoker.get_value(tooltip_attrib);
988 std::vector<const char*> cstrings{};
989 cstrings.reserve(mapping.size());
993 for(
const auto& pair : mapping)
995 cstrings.push_back(pair.second.c_str());
997 if(current_name == pair.second)
1008 ImGui::LabelText(
"##enum",
"%s", cstrings[current_idx]);
1012 int listbox_item_size =
static_cast<int>(cstrings.size());
1014 ImGuiComboFlags flags = 0;
1016 if(ImGui::BeginCombo(
"##enum", cstrings[current_idx], flags))
1018 for(
int n = 0; n < listbox_item_size; n++)
1020 const bool is_selected = (current_idx == n);
1022 if(ImGui::Selectable(cstrings[n], is_selected))
1030 ImGui::DrawItemActivityOutline();
1034 ImGui::SetItemDefaultFocus();
1040 ImGui::DrawItemActivityOutline();
1045 mutable_field.set_value(obj, val);
1052 dotnet::object& obj,
1054 dotnet::field& field,
1061 const auto& field_type = field.get_type();
1063 auto mapping = field_type.get_enum_values<T>();
1071 dotnet::object& obj,
1073 dotnet::field& field,
1074 const std::vector<std::pair<T, std::string>>& mapping,
1089 auto tooltip_attrib =
find_attribute(
"TooltipAttribute", attribs);
1092 if(tooltip_attrib.valid())
1094 auto invoker = dotnet::make_field_invoker<std::string>(tooltip_attrib.get_type(),
"tooltip");
1095 tooltip = invoker.get_value(tooltip_attrib);
1100 std::vector<const char*> cstrings{};
1101 cstrings.reserve(mapping.size());
1103 int current_idx = 0;
1105 for(
const auto& pair : mapping)
1107 cstrings.push_back(pair.second.c_str());
1109 if(current_name == pair.second)
1120 ImGui::LabelText(
"##enum",
"%s", cstrings[current_idx]);
1124 int listbox_item_size =
static_cast<int>(cstrings.size());
1126 ImGuiComboFlags flags = 0;
1128 if(ImGui::BeginCombo(
"##enum", cstrings[current_idx], flags))
1130 for(
int n = 0; n < listbox_item_size; n++)
1132 const bool is_selected = (current_idx == n);
1134 if(ImGui::Selectable(cstrings[n], is_selected))
1142 entt::meta_any new_value = entt::forward_as_meta(val);
1143 entt::meta_any old_value;
1144 field_proxy.impl->getter(old_value);
1150 ImGui::DrawItemActivityOutline();
1154 ImGui::SetItemDefaultFocus();
1160 ImGui::DrawItemActivityOutline();
1167 dotnet::object& obj,
1169 dotnet::property& property,
1176 const auto& field_type =
property.get_type();
1178 auto mapping = field_type.get_enum_values<T>();
1186 dotnet::object& obj,
1188 dotnet::property& property,
1189 const std::vector<std::pair<T, std::string>>& mapping,
1204 auto tooltip_attrib =
find_attribute(
"TooltipAttribute", attribs);
1207 if(tooltip_attrib.valid())
1209 auto invoker = dotnet::make_field_invoker<std::string>(tooltip_attrib.get_type(),
"tooltip");
1210 tooltip = invoker.get_value(tooltip_attrib);
1215 std::vector<const char*> cstrings{};
1216 cstrings.reserve(mapping.size());
1218 int current_idx = 0;
1220 for(
const auto& pair : mapping)
1222 cstrings.push_back(pair.second.c_str());
1224 if(current_name == pair.second)
1235 ImGui::LabelText(
"##enum",
"%s", cstrings[current_idx]);
1239 int listbox_item_size =
static_cast<int>(cstrings.size());
1241 ImGuiComboFlags flags = 0;
1243 if(ImGui::BeginCombo(
"##enum", cstrings[current_idx], flags))
1245 for(
int n = 0; n < listbox_item_size; n++)
1247 const bool is_selected = (current_idx == n);
1249 if(ImGui::Selectable(cstrings[n], is_selected))
1257 entt::meta_any new_value = entt::forward_as_meta(val);
1258 entt::meta_any old_value;
1259 prop_proxy.impl->getter(old_value);
1265 ImGui::DrawItemActivityOutline();
1269 ImGui::SetItemDefaultFocus();
1275 ImGui::DrawItemActivityOutline();
1286 dotnet::object& obj,
1294 handle_proxy.
impl->parent = obj_proxy.impl;
1295 handle_proxy.
impl->type_name = obj.get_type().get_fullname();
1296 handle_proxy.
impl->name = obj_proxy.impl->name;
1297 handle_proxy.
impl->getter = [obj_proxy, &ctx](entt::meta_any& result)
mutable ->
bool
1299 entt::meta_any obj_var;
1300 if(obj_proxy.impl->getter(obj_var) && obj_var)
1302 auto pinned_ptr = obj_var.cast<dotnet::object_pinned_ptr>();
1307 const auto& mono_obj = pinned_ptr->get_object();
1311 auto obj_type = mono_obj.get_type();
1312 if(!obj_type.is_valuetype())
1316 auto entity = dotnet_converter<entt::entity>::from_managed(dotnet::get_managed_ptr(mono_obj));
1322 result = entt::meta_any{std::in_place_type<entt::handle>,
handle};
1328 handle_proxy.
impl->setter = [parent_proxy = obj_proxy, &ctx](
meta_any_proxy& proxy,
const entt::meta_any& value, uint64_t execution_count)
mutable
1330 entt::meta_any obj_var;
1331 if(parent_proxy.impl->getter(obj_var) && obj_var)
1333 auto pinned_ptr = obj_var.cast<dotnet::object_pinned_ptr>();
1338 if(value.try_cast<entt::handle>())
1340 auto handle = value.cast<entt::handle>();
1344 auto mono_obj = pinned_ptr->get_object();
1345 auto obj_type = mono_obj.get_type();
1346 if(obj_type.is_valuetype())
1348 auto mono_entity = dotnet_converter<entt::entity>::to_managed(
entity);
1349 mono_obj.box_value(mono_entity, obj_type);
1350 obj_var = entt::meta_any{std::in_place_type<dotnet::object_pinned_ptr>, pinned_ptr};
1351 return parent_proxy.impl->setter(parent_proxy, obj_var, execution_count);
1360 if(!handle_proxy.
impl->getter(var))
1366 result |=
inspect_var(ctx, var, handle_proxy, info);
1371 template<
typename Invoker>
1373 dotnet::object& obj,
1375 const Invoker& mutable_field,
1380 auto attribs = mutable_field.get_attributes();
1381 auto tooltip_attrib =
find_attribute(
"TooltipAttribute", attribs);
1384 if(tooltip_attrib.valid())
1386 auto invoker = dotnet::make_field_invoker<std::string>(tooltip_attrib.get_type(),
"tooltip");
1387 tooltip = invoker.get_value(tooltip_attrib);
1395 if(!handle_proxy.impl->getter(var))
1402 result |=
inspect_var(ctx, var, handle_proxy, info);
1409 dotnet::object& obj,
1411 dotnet::field& field,
1414 auto invoker = dotnet::make_field_invoker<entt::entity>(field);
1420 return inspect_invoker(ctx, obj, obj_proxy, invoker, field_info);
1424 dotnet::object& obj,
1426 dotnet::property& field,
1429 auto invoker = dotnet::make_property_invoker<entt::entity>(field);
1435 return inspect_invoker(ctx, obj, obj_proxy, invoker, field_info);
1443 dotnet::object& obj,
1451 asset_proxy.
impl->parent = obj_proxy.impl;
1452 asset_proxy.
impl->type_name = obj.get_type().get_fullname();
1453 asset_proxy.
impl->name = obj_proxy.impl->name;
1454 asset_proxy.
impl->getter = [obj_proxy, &ctx](entt::meta_any& result)
mutable ->
bool
1456 entt::meta_any obj_var;
1457 if(obj_proxy.impl->getter(obj_var) && obj_var)
1459 auto pinned_ptr = obj_var.cast<dotnet::object_pinned_ptr>();
1464 const auto& mono_obj = pinned_ptr->get_object();
1469 if(mono_obj.valid())
1471 auto obj_type = mono_obj.get_type();
1472 auto prop = obj_type.get_property(
"uid");
1475 auto uid_prop = dotnet::make_property_invoker<hpp::uuid>(prop);
1476 auto uid = uid_prop.get_value(mono_obj);
1479 asset = am.get_asset<T>(uid);
1483 result = entt::meta_any{std::in_place_type<asset_handle<T>>, asset};
1489 asset_proxy.
impl->setter = [parent_proxy = obj_proxy](
meta_any_proxy& proxy,
const entt::meta_any& value, uint64_t execution_count)
mutable
1491 entt::meta_any obj_var;
1492 if(parent_proxy.impl->getter(obj_var) && obj_var)
1494 auto pinned_ptr = obj_var.cast<dotnet::object_pinned_ptr>();
1502 auto mono_obj = pinned_ptr->get_object();
1503 const auto& obj_type = mono_obj.get_type();
1506 if(!mono_obj.valid() && obj_type.valid())
1508 auto new_obj = obj_type.new_instance();
1512 if(mono_obj.valid())
1514 auto prop = obj_type.get_property(
"uid");
1517 auto uid_prop = dotnet::make_property_invoker<hpp::uuid>(prop);
1518 uid_prop.set_value(mono_obj, asset ? asset.
uid() : hpp::uuid{});
1519 obj_var = entt::meta_any{std::in_place_type<dotnet::object_pinned_ptr>, pinned_ptr};
1520 return parent_proxy.impl->setter(parent_proxy, obj_var, execution_count);
1530 if(!asset_proxy.
impl->getter(var))
1536 result |=
inspect_var(ctx, var, asset_proxy, info);
1541 template<
typename Invoker>
1543 dotnet::object& obj,
1545 const Invoker& mutable_field,
1550 auto attribs = mutable_field.get_attributes();
1551 auto tooltip_attrib =
find_attribute(
"TooltipAttribute", attribs);
1554 if(tooltip_attrib.valid())
1556 auto invoker = dotnet::make_field_invoker<std::string>(tooltip_attrib.get_type(),
"tooltip");
1557 tooltip = invoker.get_value(tooltip_attrib);
1565 if(!asset_proxy.impl->getter(var))
1572 result |=
inspect_var(ctx, var, asset_proxy, info);
1579 dotnet::object& obj,
1581 dotnet::field& field,
1584 auto invoker = dotnet::make_field_invoker<dotnet::object>(field);
1590 return inspect_invoker(ctx, obj, obj_proxy, invoker, field_info);
1594 dotnet::object& obj,
1596 dotnet::property& field,
1599 auto invoker = dotnet::make_property_invoker<dotnet::object>(field);
1605 return inspect_invoker(ctx, obj, obj_proxy, invoker, field_info);
1614 template<
typename Invoker>
1616 dotnet::object& obj,
1618 const Invoker& mutable_field,
1619 const dotnet::type& collection_type,
1624 auto val = mutable_field.get_value(obj);
1630 bool is_array = collection_type.is_array();
1631 bool is_list = collection_type.is_list();
1633 if (!is_array && !is_list)
1640 collection_proxy.
impl->parent = obj_proxy.impl;
1641 collection_proxy.
impl->type_name = collection_type.get_fullname();
1642 collection_proxy.
impl->name = [&]()
1644 const auto& parent_name = obj_proxy.impl->name;
1645 auto field_name = mutable_field.get_name();
1646 if(parent_name.empty())
1650 return fmt::format(
"{}/{}", parent_name, field_name);
1652 collection_proxy.
impl->getter = [obj_proxy, mutable_field, is_array, is_list](entt::meta_any& result)
mutable
1654 entt::meta_any obj_var;
1655 if(obj_proxy.impl->getter(obj_var) && obj_var)
1657 auto pinned_ptr = obj_var.cast<dotnet::object_pinned_ptr>();
1662 const auto& mono_obj = pinned_ptr->get_object();
1663 auto collection_obj = mutable_field.get_value(mono_obj);
1668 auto array = dotnet::array<dotnet::object>(collection_obj);
1669 auto array_vec = array.to_vector();
1670 auto pinned_vec = dotnet::pin_vector_elements(array_vec);
1671 result = pinned_vec;
1676 auto list = dotnet::list<dotnet::object>(collection_obj);
1677 auto list_vec = list.to_vector();
1678 auto pinned_vec = dotnet::pin_vector_elements(list_vec);
1679 result = pinned_vec;
1686 collection_proxy.
impl->setter = [parent_proxy = obj_proxy, mutable_field, is_array, is_list](
meta_any_proxy& proxy,
const entt::meta_any& value, uint64_t execution_count)
mutable
1688 entt::meta_any obj_var;
1689 if(parent_proxy.impl->getter(obj_var) && obj_var)
1691 auto pinned_ptr = obj_var.cast<dotnet::object_pinned_ptr>();
1696 if(
auto pinned_vec = value.try_cast<std::vector<dotnet::object_pinned_ptr>>())
1699 std::vector<dotnet::object> vec;
1700 vec.reserve(pinned_vec->size());
1701 for(
const auto& pinned_elem : *pinned_vec)
1705 vec.emplace_back(pinned_elem->get_object());
1709 vec.emplace_back(dotnet::object());
1713 auto mono_obj = pinned_ptr->get_object();
1717 auto element_type = mutable_field.get_type().get_element_type();
1719 auto collection_obj = mutable_field.get_value(mono_obj);
1721 auto collection = dotnet::array<dotnet::object>(collection_obj);
1723 if(!collection_obj.valid())
1725 collection = dotnet::array<dotnet::object>(vec, element_type);
1729 collection.set(vec, element_type,
true);
1732 mutable_field.set_value(mono_obj, collection);
1736 auto element_type = mutable_field.get_type().get_element_type();
1738 auto collection_obj = mutable_field.get_value(mono_obj);
1739 auto collection = dotnet::list<dotnet::object>(collection_obj);
1741 if(!collection_obj.valid())
1743 collection = dotnet::list<dotnet::object>(vec, element_type);
1747 collection.set(vec, element_type,
true);
1750 mutable_field.set_value(mono_obj, collection);
1752 return parent_proxy.impl->setter(parent_proxy, obj_var, execution_count);
1759 auto attribs = mutable_field.get_attributes();
1760 auto tooltip_attrib =
find_attribute(
"TooltipAttribute", attribs);
1763 meta_attribs[
"name"] = mutable_field.get_name();
1764 meta_attribs[
"pretty_name"] = mutable_field.get_name();
1765 meta_attribs[
"is_fixed_size_array"] = is_array;
1767 if(tooltip_attrib.valid())
1769 auto invoker = dotnet::make_field_invoker<std::string>(tooltip_attrib.get_type(),
"tooltip");
1770 tooltip = invoker.get_value(tooltip_attrib);
1771 meta_attribs[
"tooltip"] =
tooltip;
1775 ImGui::PushID(mutable_field.get_name().c_str());
1779 dotnet::array<dotnet::object> array(val);
1781 auto array_vec = array.to_vector();
1782 auto pinned_vec = dotnet::pin_vector_elements(array_vec);
1783 entt::meta_any vec_var = entt::forward_as_meta(pinned_vec);
1789 dotnet::list<dotnet::object> list(val);
1791 auto list_vec = list.to_vector();
1792 auto pinned_vec = dotnet::pin_vector_elements(list_vec);
1793 entt::meta_any vec_var = entt::forward_as_meta(pinned_vec);
1806 dotnet::object& obj,
1808 dotnet::field& field,
1811 auto invoker = dotnet::make_field_invoker<dotnet::object>(field);
1812 auto field_type = field.get_type();
1822 dotnet::object& obj,
1824 dotnet::property& property,
1827 auto invoker = dotnet::make_property_invoker<dotnet::object>(property);
1828 auto prop_type =
property.get_type();
1839 entt::meta_any& var,
1847 obj_proxy.
impl->parent = var_proxy.impl;
1849 obj_proxy.
impl->name = var_proxy.impl->name;
1850 obj_proxy.
impl->getter = [parent_proxy = var_proxy](entt::meta_any& result) ->
bool
1853 if(parent_proxy.impl->getter(var) && var)
1855 auto pinned_ptr = var.cast<dotnet::object_pinned_ptr>();
1860 result = entt::meta_any{std::in_place_type<dotnet::object_pinned_ptr>, pinned_ptr};
1865 obj_proxy.
impl->setter = [parent_proxy = var_proxy](
meta_any_proxy& proxy,
const entt::meta_any& value, uint64_t execution_count)
mutable
1868 if(proxy.impl->getter(var) && var)
1871 return parent_proxy.impl->setter(parent_proxy, var, execution_count);
1877 auto pinned_ptr = var.cast<dotnet::object_pinned_ptr>();
1882 const auto& data = pinned_ptr->get_object();
1885 auto type = data.get_type();
1892 if(!data.valid() && !
type.valid())
1898 std::string unknown_text;
1899 unknown_text =
"null(object)";
1900 entt::meta_any unknown_var = entt::forward_as_meta(unknown_text);
1901 auto unknown_var_proxy =
make_proxy(unknown_var);
1904 result |=
inspect_var(ctx, unknown_var, unknown_var_proxy, field_info);
1911 dotnet::object& obj,
1915 auto get_object_inspector = [](
const std::string& type_name) ->
const mono_object_inspector&
1918 static std::map<std::string, mono_object_inspector> reg = {
1951 auto it = reg.find(type_name);
1956 static const mono_object_inspector empty;
1968 auto get_field_inspector = [](
const std::string& type_name) ->
const mono_field_inspector&
1971 static std::map<std::string, mono_field_inspector> reg = {
2005 auto it = reg.find(type_name);
2010 static const mono_field_inspector empty;
2014 auto get_enum_field_inspector = [](
const std::string& type_name) ->
const mono_field_inspector&
2017 static std::map<std::string, mono_field_inspector> reg = {
2029 auto it = reg.find(type_name);
2034 static const mono_field_inspector empty;
2040 bool should_inspect = (
type.is_serializable() ||
type.is_derived_from(script_sys.get_scriptable_component_base_type()));
2042 auto object_inspector = get_object_inspector(
type.get_name());
2043 if(object_inspector)
2048 auto mono_obj = pinned_ptr->get_object();
2049 result |= object_inspector(ctx, mono_obj, obj_proxy, info);
2051 else if(should_inspect)
2070 std::string null_text =
"null (" +
type.get_name() +
")";
2071 entt::meta_any null_var = entt::forward_as_meta(null_text);
2075 result |=
inspect_var(ctx, null_var, null_var_proxy, field_info);
2093 bool include_base =
true;
2094 auto fields =
type.get_fields( include_base);
2096 for(
auto& field : fields)
2098 bool inspect_predicate = field.get_visibility() == dotnet::visibility::vis_public;
2104 inspect_predicate = !field.is_backing_field();
2107 if(field.is_static() || field.has_attribute(
"HideAttribute"))
2109 inspect_predicate =
false;
2113 if(inspect_predicate)
2124 ImGui::SeparatorText( header.c_str());
2131 const auto& field_type = field.get_type();
2133 auto field_inspector = get_field_inspector(field_type.get_name());
2136 override_ctx.
push_segment(field.get_name(), field.get_name());
2140 auto mono_obj = pinned_ptr->get_object();
2141 result |= field_inspector(ctx, mono_obj, obj_proxy, field, info);
2143 else if(field_type.is_enum())
2145 auto enum_type = field_type.get_enum_base_type();
2146 auto enum_inspector = get_enum_field_inspector(enum_type.get_name());
2149 auto mono_obj = pinned_ptr->get_object();
2150 result |= enum_inspector(ctx, mono_obj, obj_proxy, field, info);
2153 else if(field_type.is_array() || field_type.is_list())
2156 auto mono_obj = pinned_ptr->get_object();
2159 else if(field_type.is_serializable())
2162 auto mono_obj = pinned_ptr->get_object();
2163 auto invoker = dotnet::make_field_invoker<dotnet::object>(field);
2164 auto nested_obj = invoker.get_value(mono_obj);
2166 if(nested_obj.valid())
2168 auto nested_pinned = dotnet::make_object_pinned(nested_obj);
2179 std::string null_text =
"null (" + field_type.get_name() +
")";
2180 entt::meta_any null_var = entt::forward_as_meta(null_text);
2185 result |=
inspect_var(ctx, null_var, null_var_proxy, field_info);
2226 override_ctx.pop_segment();
2239 auto get_property_inspector = [](
const std::string& type_name) ->
const mono_property_inspector&
2242 static std::map<std::string, mono_property_inspector> reg = {
2276 auto it = reg.find(type_name);
2281 static const mono_property_inspector empty;
2285 auto get_enum_property_inspector = [](
const std::string& type_name) ->
const mono_property_inspector&
2288 static std::map<std::string, mono_property_inspector> reg = {
2300 auto it = reg.find(type_name);
2305 static const mono_property_inspector empty;
2309 auto properties =
type.get_properties(include_base);
2310 for(
auto& prop : properties)
2312 bool inspect_predicate = prop.get_visibility() == dotnet::visibility::vis_public;
2317 inspect_predicate =
true;
2320 if(prop.is_static() || prop.has_attribute(
"HideAttribute"))
2322 inspect_predicate =
false;
2325 if(inspect_predicate)
2336 ImGui::SeparatorText(header.c_str());
2341 const auto& prop_type = prop.get_type();
2343 auto property_inspector = get_property_inspector(prop_type.get_name());
2346 override_ctx.
push_segment(prop.get_name(), prop.get_name());
2348 if(property_inspector)
2350 auto mono_obj = pinned_ptr->get_object();
2351 result |= property_inspector(ctx, mono_obj, obj_proxy, prop, info);
2353 else if(prop_type.is_enum())
2355 auto enum_type = prop_type.get_enum_base_type();
2356 auto enum_inspector = get_enum_property_inspector(enum_type.get_name());
2359 auto mono_obj = pinned_ptr->get_object();
2360 result |= enum_inspector(ctx, mono_obj, obj_proxy, prop, info);
2363 else if(prop_type.is_array() || prop_type.is_list())
2366 auto mono_obj = pinned_ptr->get_object();
2369 else if(prop_type.is_serializable())
2372 auto mono_obj = pinned_ptr->get_object();
2373 auto invoker = dotnet::make_property_invoker<dotnet::object>(prop);
2374 auto nested_obj = invoker.get_value(mono_obj);
2376 if(nested_obj.valid())
2378 auto nested_pinned = dotnet::make_object_pinned(nested_obj);
2389 std::string null_text =
"null (" + prop_type.get_name() +
")";
2390 entt::meta_any null_var = entt::forward_as_meta(null_text);
2395 result |=
inspect_var(ctx, null_var, null_var_proxy, field_info);
2436 override_ctx.pop_segment();
2449 std::string null_text =
"Unknown (" +
type.get_name() +
")";
2450 entt::meta_any null_var = entt::forward_as_meta(null_text);
2454 result |=
inspect_var(ctx, null_var, null_var_proxy, field_info);
2462 entt::meta_any& var,
2468 obj_proxy.
impl->parent = var_proxy.impl;
2470 obj_proxy.
impl->name = var_proxy.impl->name;
2471 obj_proxy.
impl->getter = [parent_proxy = var_proxy](entt::meta_any& result) ->
bool
2474 if(parent_proxy.impl->getter(var) && var)
2476 auto pinned_ptr = var.cast<dotnet::object_pinned_ptr>();
2481 result = entt::meta_any{std::in_place_type<dotnet::object_pinned_ptr>, pinned_ptr};
2486 obj_proxy.
impl->setter = [parent_proxy = var_proxy](
meta_any_proxy& proxy,
const entt::meta_any& value, uint64_t execution_count)
mutable
2489 if(proxy.impl->getter(var) && var)
2492 return parent_proxy.impl->setter(parent_proxy, var, execution_count);
2498 auto pinned_ptr = var.cast<dotnet::object_pinned_ptr>();
2503 auto obj_var = entt::meta_any{std::in_place_type<dotnet::object_pinned_ptr>, pinned_ptr};
2515 dotnet::object_pinned_ptr pinned_ptr,
2517 const std::string&
name,
2523 bool tree_open = ImGui::TreeNodeEx(
name.c_str(), ImGuiTreeNodeFlags_DefaultOpen);
2527 ImGui::PushStyleVar(ImGuiStyleVar_IndentSpacing, 8.0f);
2530 auto obj_var = entt::meta_any{std::in_place_type<dotnet::object_pinned_ptr>, pinned_ptr};
2532 result |=
inspector.inspect(ctx, obj_var, obj_proxy, info, {});
2534 ImGui::PopStyleVar();
Manages assets, including loading, unloading, and storage.
Manages ImGui layout for property inspection in the editor.
void PushFont(Font::Enum _font)
void PushReadonly(bool _enabled)
auto get_pretty_name(const meta_type &t) -> std::string
std::map< std::string, meta_any > attributes
auto make_custom(Args &&...args) -> entt::meta_custom
Provides utilities for inspecting and converting sequence-related types to strings.
Hash specialization for batch_key to enable use in std::unordered_map.
auto inspect_property(rtti::context &ctx, entt::meta_any &object, const meta_any_proxy &var_proxy, const entt::meta_data &prop) -> inspect_result
auto inspect_serializable_object(rtti::context &ctx, dotnet::object_pinned_ptr pinned_ptr, const meta_any_proxy &obj_proxy, const std::string &name, const var_info &info) -> inspect_result
Recursively inspects a serializable object using the main inspector.
auto get_header(const dotnet::field &field) -> std::string
void push_mono_type(const dotnet::type &type)
auto add_property_action(rtti::context &ctx, prefab_override_context &override_ctx, inspect_result &result, meta_any_proxy &var_proxy, const entt::meta_any &old_var, const entt::meta_any &new_var, const entt::meta_custom &custom) -> bool
auto get_mono_type_stack() -> std::stack< dotnet::type > &
auto get_current_mono_type() -> dotnet::type
auto make_nested_property_proxy(const meta_any_proxy &obj_proxy, const Invoker &mutable_property) -> meta_any_proxy
Creates a proxy for a nested serializable object property.
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/properties 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 make_nested_object_proxy(const meta_any_proxy &obj_proxy, const Invoker &mutable_field) -> meta_any_proxy
Creates a proxy for a nested serializable object field.
auto is_debug_view() -> bool
Checks if currently in debug view mode.
auto find_attribute(const std::string &name, const std::vector< dotnet::object > &attribs) -> dotnet::object
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.
Thread-safe handle to an asset.
auto uid() const -> hpp::uuid
Gets the unique identifier of the asset.
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)
entt::registry * inspected_registry
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
mono_field_proxy(dotnet::field f)
auto get_value(dotnet::object &obj) const -> T
void set_value(dotnet::object &obj, const T &value) const
auto get_attributes() const
static auto inspect_invoker(rtti::context &ctx, dotnet::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, dotnet::object &obj, const meta_any_proxy &obj_proxy, dotnet::property &field, const var_info &info) -> inspect_result
static auto inspect_field(rtti::context &ctx, dotnet::object &obj, const meta_any_proxy &obj_proxy, dotnet::field &field, const var_info &info) -> inspect_result
static auto inspect_object(rtti::context &ctx, dotnet::object &obj, const meta_any_proxy &obj_proxy, const var_info &info) -> inspect_result
static auto inspect_invoker(rtti::context &ctx, dotnet::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, dotnet::object &obj, const meta_any_proxy &obj_proxy, dotnet::property &field, const var_info &info) -> inspect_result
static auto inspect_object(rtti::context &ctx, dotnet::object &obj, const meta_any_proxy &obj_proxy, const var_info &info) -> inspect_result
static auto inspect_field(rtti::context &ctx, dotnet::object &obj, const meta_any_proxy &obj_proxy, dotnet::field &field, const var_info &info) -> inspect_result
Inspector for collections (arrays and List<T>) with add/remove support.
static auto inspect_field(rtti::context &ctx, dotnet::object &obj, const meta_any_proxy &obj_proxy, dotnet::field &field, const var_info &info) -> inspect_result
static auto inspect_property(rtti::context &ctx, dotnet::object &obj, const meta_any_proxy &obj_proxy, dotnet::property &property, const var_info &info) -> inspect_result
static auto inspect_collection(rtti::context &ctx, dotnet::object &obj, const meta_any_proxy &obj_proxy, const Invoker &mutable_field, const dotnet::type &collection_type, const var_info &info) -> inspect_result
static auto inspect_enum_property_with_proxy(rtti::context &ctx, dotnet::object &obj, const meta_any_proxy &obj_proxy, dotnet::property &property, const std::vector< std::pair< T, std::string > > &mapping, 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_property(rtti::context &ctx, dotnet::object &obj, const meta_any_proxy &obj_proxy, dotnet::property &property, const var_info &info) -> inspect_result
static auto inspect_invoker(rtti::context &ctx, dotnet::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_enum_field_with_proxy(rtti::context &ctx, dotnet::object &obj, const meta_any_proxy &obj_proxy, dotnet::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_field(rtti::context &ctx, dotnet::object &obj, const meta_any_proxy &obj_proxy, dotnet::field &field, const var_info &info) -> inspect_result
static auto inspect_property_with_proxy(rtti::context &ctx, dotnet::object &obj, const meta_any_proxy &obj_proxy, dotnet::property &property, const var_info &info) -> inspect_result
static auto inspect_field(rtti::context &ctx, dotnet::object &obj, const meta_any_proxy &obj_proxy, dotnet::field &field, const var_info &info) -> inspect_result
static auto inspect_object(rtti::context &ctx, dotnet::object &obj, const meta_any_proxy &obj_proxy, const var_info &info) -> inspect_result
Inspects a mono_object that directly represents a value of type T.
static auto inspect_property(rtti::context &ctx, dotnet::object &obj, const meta_any_proxy &obj_proxy, dotnet::property &property, const var_info &info) -> inspect_result
static auto inspect_invoker_with_proxy(rtti::context &ctx, dotnet::object &obj, const meta_any_proxy &obj_proxy, dotnet::field &field, const var_info &info) -> inspect_result
Proxy wrapper for mono property access that integrates with meta_any_proxy system.
auto get_attributes() const
auto get_value(dotnet::object &obj) const -> T
std::string property_name
void set_value(dotnet::object &obj, const T &value) const
auto get_name() const -> std::string
mono_property_proxy(dotnet::property p)
dotnet::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.
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.