diff --git a/private/raid_test/SModule b/private/raid_test/SModule index 37ec313..a62ff14 100644 --- a/private/raid_test/SModule +++ b/private/raid_test/SModule @@ -5,6 +5,7 @@ src_files = Split(""" main.cpp application.cpp + frames/data_table.cpp """) prog_app = env.UnityProgram( diff --git a/private/raid_test/application.cpp b/private/raid_test/application.cpp index 6ed0150..9bff3d7 100644 --- a/private/raid_test/application.cpp +++ b/private/raid_test/application.cpp @@ -13,6 +13,7 @@ bool Application::init() setMainWindowFlags(raid::DEFAULT_MAIN_WINDOW_FLAGS | ImGuiWindowFlags_MenuBar | ImGuiWindowFlags_NoDocking); setMainWindowStyle(ImGuiStyleVar_WindowPadding, ImVec2()); setMainWindowStyle(ImGuiStyleVar_WindowBorderSize, 0.f); + std::ranges::fill(mFrameOpen, true); return true; } @@ -35,14 +36,35 @@ void Application::render() } ImGui::EndMenu(); } + if (ImGui::BeginMenu("Frames")) + { + for (std::size_t idx = 0; idx < NUM_FRAMES; ++idx) { + ImGui::MenuItem(FRAMES[idx].title, nullptr, &mFrameOpen[idx]); + } + ImGui::EndMenu(); + } + if (ImGui::BeginMenu("Debug")) + { + ImGui::MenuItem("ImGui Metrics", nullptr, &mShowMetrics); + ImGui::EndMenu(); + } ImGui::EndMenuBar(); } - ImGui::Text("hi"); - ImGui::ShowMetricsWindow(); - ImGui::Begin("Test"); - ImGui::Text("Test Content"); - ImGui::End(); + const ImGuiID dockID = ImGui::GetID(this); + ImGui::DockSpace(dockID); + + if (mShowMetrics) { + ImGui::ShowMetricsWindow(&mShowMetrics); + } + + for (std::size_t idx = 0; idx < NUM_FRAMES; ++idx) + { + ImGui::SetNextWindowDockID(dockID, ImGuiCond_FirstUseEver); + if (mFrameOpen[idx]) { + FRAMES[idx].render(mFrameOpen[idx]); + } + } } std::string Application::getFolderName() diff --git a/private/raid_test/application.hpp b/private/raid_test/application.hpp index c7feb13..f119334 100644 --- a/private/raid_test/application.hpp +++ b/private/raid_test/application.hpp @@ -4,12 +4,28 @@ #if !defined(RAID_TEST_APPLICATION_HPP_INCLUDED) #define RAID_TEST_APPLICATION_HPP_INCLUDED 1 +#include #include "raid/raid.hpp" +#include "./frames/data_table.hpp" namespace raid_test { class Application : public raid::Application { +private: + struct Frame + { + using render_fn_t = void (*)(bool& open); + const char* title; + render_fn_t render; + }; + static constexpr Frame FRAMES[] = { + {.title = DATA_TABLE_TITLE, .render = &renderDataTable} + }; + static constexpr std::size_t NUM_FRAMES = sizeof(FRAMES) / sizeof(FRAMES[0]); + + bool mShowMetrics = false; + std::array mFrameOpen{}; protected: bool init() override; void configureImgui() override; diff --git a/private/raid_test/frames/data_table.cpp b/private/raid_test/frames/data_table.cpp new file mode 100644 index 0000000..c8c4f6d --- /dev/null +++ b/private/raid_test/frames/data_table.cpp @@ -0,0 +1,89 @@ + +#include "raid_test/frames/data_table.hpp" + +#include +#include +#include +#include "raid/imraid.hpp" + +namespace raid_test +{ +namespace +{ +const std::array FIRST_NAMES = { + "Emma", "Hannah", "Mia", "Leonie", "Lina", "Marie", "Sophia", "Charlotte", "Paula", "Greta", "Frieda", "Ella", "Freia", + "Leon", "Paul", "Maximilian", "Ben", "Lukas", "Finn", "Fiete", "Felix", "Moritz", "Jakob", "Tim", "Emil", "Theo", + "James", "Mary", "Michael", "Patricia", "John", "Jennifer", "Robert", "Linda", "David", "Elizabeth", "William", + "Barbara", "Richard", "Susan", "Joseph", "Jessica", "Thomas", "Karen", "Christopher", "Sarah" +}; +const std::array LAST_NAMES = { + "Müller", "Schmidt", "Schneider", "Fischer", "Meyer", "Weber", "Hofmann", "Wagner", "Becker", "Schulz", "Schäfer", + "Koch", "Bauer", "Richter", "Klein", "Schröder", "Wolf", "Neumann", "Schwarz", "Schmitz", "Smith", "Johnson", + "Williams", "Brown", "Jones", "Garcia", "Miller", "Davis", "Rodríguez", "Martínez", "Hernández", "López", "Gonzalez", + "Wilson", "Anderson", "Thomas", "Taylor", "Moore", "Jackson", "Martin" +}; + +constexpr int MIN_AGE = 18; +constexpr int MAX_AGE = 120; +constexpr double HEIGHT_MEAN = 1.75; +constexpr double HEIGHT_STDDEV = 0.1; +constexpr std::size_t NUM_PEOPLE = 5000; + +struct Person +{ + const char* firstName; + const char* lastName; + int age; + double height; +}; + +using rand_int_t = std::mt19937::result_type; + +std::mt19937 gRandom(std::random_device{}()); +std::uniform_int_distribution gFirstNameDistribution(0, static_cast(FIRST_NAMES.size()-1)); +std::uniform_int_distribution gLastNameDistribution(0, static_cast(LAST_NAMES.size()-1)); +std::uniform_int_distribution gAgeDistribution(static_cast(MIN_AGE), static_cast(MAX_AGE)); +std::normal_distribution gHeightDistribution(HEIGHT_MEAN, HEIGHT_STDDEV); + +[[nodiscard]] +Person randomPerson() +{ + return { + .firstName = FIRST_NAMES[gFirstNameDistribution(gRandom)], + .lastName = LAST_NAMES[gLastNameDistribution(gRandom)], + .age = static_cast(gAgeDistribution(gRandom)), + .height = gHeightDistribution(gRandom) + }; +} + +const std::array PEOPLE = []() +{ + std::array result; + std::ranges::generate(result, randomPerson); + return result; +}(); + +const std::array DATA_TABLE_COLUMNS = { + ImRaid::MakeStringColumn("First Name", &Person::firstName), + ImRaid::MakeStringColumn("Last Name", &Person::lastName), + ImRaid::MakeColumn("Age", "%d years", &Person::age), + ImRaid::MakeColumn("Height", "%.2f m", &Person::height) +}; +const ImRaid::DataTableOptions DATA_TABLE_OPTIONS = { + .columns = DATA_TABLE_COLUMNS +}; +ImRaid::DataTableState gDataTableState; +} +void renderDataTable(bool& open) +{ + if (!ImGui::Begin(DATA_TABLE_TITLE, &open)) + { + ImGui::End(); + return; + } + + ImRaid::DataTable("people", DATA_TABLE_OPTIONS, PEOPLE, gDataTableState); + + ImGui::End(); +} +} // namespace raid_test diff --git a/private/raid_test/frames/data_table.hpp b/private/raid_test/frames/data_table.hpp new file mode 100644 index 0000000..e67c783 --- /dev/null +++ b/private/raid_test/frames/data_table.hpp @@ -0,0 +1,14 @@ + +#pragma once + +#if !defined(RAID_TEST_FRAMES_DATA_TABLE_HPP_INCLUDED) +#define RAID_TEST_FRAMES_DATA_TABLE_HPP_INCLUDED 1 + +namespace raid_test +{ +inline constexpr const char* DATA_TABLE_TITLE = "Data Table"; + +void renderDataTable(bool& open); +} // namespace raid_test + +#endif // !defined(RAID_TEST_FRAMES_DATA_TABLE_HPP_INCLUDED)