From 1843b79e54f37a6f0d453b1d8300c1da95998b72 Mon Sep 17 00:00:00 2001 From: harrand Date: Mon, 4 Mar 2024 21:49:19 +0000 Subject: [PATCH] [data_store] dbgui for datastore --- src/tz/core/data/data_store.dbgui.cpp | 101 +++++++++++++++++++++++++- 1 file changed, 100 insertions(+), 1 deletion(-) diff --git a/src/tz/core/data/data_store.dbgui.cpp b/src/tz/core/data/data_store.dbgui.cpp index 3df815d7da..1881bedf71 100644 --- a/src/tz/core/data/data_store.dbgui.cpp +++ b/src/tz/core/data/data_store.dbgui.cpp @@ -1,10 +1,109 @@ #include "tz/core/data/data_store.hpp" +#include "imgui.h" #include "tz/dbgui/dbgui.hpp" namespace tz { + void dbgui_data_store_value(data_store* ds, std::string key, data_store_value val) + { + std::visit([&ds, &key](auto&& arg) + { + using T = std::decay_t; + T v = arg; + auto set = [&ds, &key, &v]() + { + ds->set + ({ + .key = key, + .val = v + }); + }; + if constexpr(std::is_same_v) + { + if(ImGui::Checkbox("##bool", &v)) + { + set(); + } + } + else if constexpr(std::is_same_v) + { + if(ImGui::InputFloat("##float", &v, 0.0f, 0.0f, "%g", ImGuiInputTextFlags_EnterReturnsTrue)) + { + set(); + } + } + else if constexpr(std::is_same_v) + { + if(ImGui::InputDouble("##double", &v, 0.0, 0.0, "%g", ImGuiInputTextFlags_EnterReturnsTrue)) + { + set(); + } + } + else if constexpr(std::is_same_v) + { + if(ImGui::InputInt("##int", &v, 1, 100, ImGuiInputTextFlags_EnterReturnsTrue)) + { + set(); + } + } + else if constexpr(std::is_same_v) + { + if(ImGui::InputScalar("##uint", ImGuiDataType_U32, &v, 0, 0, 0, ImGuiInputTextFlags_EnterReturnsTrue)) + { + set(); + } + } + else if constexpr(std::is_same_v) + { + if(ImGui::InputText("##str", &v, ImGuiInputTextFlags_EnterReturnsTrue)) + { + set(); + } + } + }, val); + } + void data_store::dbgui() { - ImGui::Text("Coming Soon!"); + using store_t = decltype(this->store); + // retrieve a copy for minimal lock contention. + store_t store_cpy; + { + std::shared_lock slock(this->mtx); + store_cpy = this->store; + } + ImGui::Text("%zu entries", store_cpy.size()); + if(ImGui::Button("Clear")) + { + this->clear(); + } + ImGui::Separator(); + if(ImGui::BeginTable("datastore", 2)) + { + for(const auto& [key, val] : store_cpy) + { + int hash = std::hash{}(key); + ImGui::PushID(hash); + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + if(ImGui::Button("x")) + { + this->remove({.key = key}); + ImGui::PopID(); + break; + } + ImGui::SameLine(); + if(!std::holds_alternative(val) && ImGui::Button("o")) + { + this->set({.key = key, .val = nullptr}); + } + ImGui::SameLine(); + ImGui::Text("%s", key.c_str()); + ImGui::TableNextColumn(); + dbgui_data_store_value(this, key, val); + ImGui::PopID(); + } + ImGui::EndTable(); + } } } \ No newline at end of file