summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2023-02-24 08:33:56 +0100
committerStanislaw Halik <sthalik@misaki.pl>2023-02-24 08:33:56 +0100
commita68822c7e24d818b984ef6889c36d3b39202c887 (patch)
tree8debaad89d467a9a876c1d1da33bb0d11bd54243
parent9c5216232527665850fc5ef0be9ff53b27a763b8 (diff)
editor/inspect: don't cons field names all the time
-rw-r--r--editor/inspect.cpp24
1 files changed, 13 insertions, 11 deletions
diff --git a/editor/inspect.cpp b/editor/inspect.cpp
index ce06d790..cd2904fc 100644
--- a/editor/inspect.cpp
+++ b/editor/inspect.cpp
@@ -18,14 +18,15 @@ namespace {
using erased_constraints::is_magnum_vector;
-String label_left(StringView label)
+const char* label_left(StringView label, char* buf, std::size_t len)
{
+ std::snprintf(buf, len, "##%s", label.data());
float width = ImGui::CalcItemWidth(), x = ImGui::GetCursorPosX();
ImGui::Text("%s", label.data());
ImGui::SameLine();
ImGui::SetCursorPosX(x + width*.5f + ImGui::GetStyle().ItemInnerSpacing.x);
ImGui::SetNextItemWidth(-1);
- return ""_s.join(StringIterable({ "##"_s, label }));
+ return buf;
}
template<typename T> struct IGDT_;
@@ -71,6 +72,7 @@ void do_inspect_field(void* datum, const erased_accessor& accessor, field_repr r
fm_assert(!list.isEmpty() == (repr == field_repr::cbx));
bool should_disable;
+ char buf[128];
switch (accessor.is_enabled(datum))
{
@@ -82,19 +84,19 @@ void do_inspect_field(void* datum, const erased_accessor& accessor, field_repr r
should_disable = should_disable || !accessor.can_write();
[[maybe_unused]] auto disabler = begin_disabled(should_disable);
bool ret = false;
- const auto label = label_left(accessor.field_name);
+ const char* const label = label_left(accessor.field_name, buf, sizeof buf);
T value{};
accessor.read_fun(datum, accessor.reader, &value);
auto orig = value;
if constexpr(std::is_same_v<T, String>)
{
- ret = ImGui::InputText(label.data(), value.begin(), value.size(), ImGuiInputTextFlags_CallbackResize, corrade_string_resize_callback, &value);
+ ret = ImGui::InputText(label, value.begin(), value.size(), ImGuiInputTextFlags_CallbackResize, corrade_string_resize_callback, &value);
if (auto max_len = accessor.get_max_length(datum); value.size() > max_len)
value = value.prefix(max_len);
}
else if constexpr(std::is_same_v<T, bool>)
- ret = ImGui::Checkbox(label.data(), &value);
+ ret = ImGui::Checkbox(label, &value);
else if constexpr (!is_magnum_vector<T>)
{
auto [min, max] = accessor.get_range(datum).convert<T>();
@@ -103,9 +105,9 @@ void do_inspect_field(void* datum, const erased_accessor& accessor, field_repr r
switch (repr)
{
default: fm_warn_once("invalid repr enum value '%zu'", (std::size_t)repr); break;
- case field_repr::input: ret = ImGui::InputScalar(label.data(), igdt, &value, step_); break;
- case field_repr::slider: ret = ImGui::SliderScalar(label.data(), igdt, &value, &min, &max); break;
- case field_repr::drag: ret = ImGui::DragScalar(label.data(), igdt, &value, 1, &min, &max); break;
+ case field_repr::input: ret = ImGui::InputScalar(label, igdt, &value, step_); break;
+ case field_repr::slider: ret = ImGui::SliderScalar(label, igdt, &value, &min, &max); break;
+ case field_repr::drag: ret = ImGui::DragScalar(label, igdt, &value, 1, &min, &max); break;
case field_repr::cbx: {
if constexpr(std::is_integral_v<T>)
{
@@ -117,7 +119,7 @@ void do_inspect_field(void* datum, const erased_accessor& accessor, field_repr r
preview = str.data();
break;
}
- if (auto b = begin_combo(label.data(), preview))
+ if (auto b = begin_combo(label, preview))
for (const auto& [str, x] : list)
{
const bool is_selected = x == (std::size_t)old_value;
@@ -144,13 +146,13 @@ void do_inspect_field(void* datum, const erased_accessor& accessor, field_repr r
fm_warn_once("invalid repr enum value '%zu'", (std::size_t)repr);
break;
case field_repr::input:
- ret = ImGui::InputScalarN(label.data(), igdt, &value, T::Size, step_);
+ ret = ImGui::InputScalarN(label, igdt, &value, T::Size, step_);
break;
case field_repr::drag:
fm_warn_once("can't use imgui input drag mode for vector type");
[[fallthrough]];
case field_repr::slider:
- ret = ImGui::SliderScalarN(label.data(), igdt, &value, T::Size, &min, &max);
+ ret = ImGui::SliderScalarN(label, igdt, &value, T::Size, &min, &max);
break;
}
for (std::size_t i = 0; i < T::Size; i++)