aboutsummaryrefslogtreecommitdiff
path: root/vendor/zgui/libs/imgui_test_engine/imgui_te_ui.cpp
diff options
context:
space:
mode:
authorNic Gaffney <gaffney_nic@protonmail.com>2025-10-13 01:19:27 -0500
committerNic Gaffney <gaffney_nic@protonmail.com>2025-10-13 01:19:27 -0500
commit1f9b827badb2de4c4eaae11c0d02242ec90af7f6 (patch)
tree27acb295833e6eee730dd71f98db280d54c6a4ad /vendor/zgui/libs/imgui_test_engine/imgui_te_ui.cpp
parentb5d0c1dcd751f4735d9f6b45c805300000c9d171 (diff)
downloadparticle-sim-1f9b827badb2de4c4eaae11c0d02242ec90af7f6.tar.gz
Updating to zig 0.15.1
Diffstat (limited to 'vendor/zgui/libs/imgui_test_engine/imgui_te_ui.cpp')
-rw-r--r--vendor/zgui/libs/imgui_test_engine/imgui_te_ui.cpp842
1 files changed, 0 insertions, 842 deletions
diff --git a/vendor/zgui/libs/imgui_test_engine/imgui_te_ui.cpp b/vendor/zgui/libs/imgui_test_engine/imgui_te_ui.cpp
deleted file mode 100644
index 2d42bde..0000000
--- a/vendor/zgui/libs/imgui_test_engine/imgui_te_ui.cpp
+++ /dev/null
@@ -1,842 +0,0 @@
-// dear imgui test engine
-// (ui)
-// If you run tests in an interactive or visible application, you may want to call ImGuiTestEngine_ShowTestEngineWindows()
-
-#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)
-#define _CRT_SECURE_NO_WARNINGS
-#endif
-
-#define IMGUI_DEFINE_MATH_OPERATORS
-#include "imgui_te_ui.h"
-#include "imgui.h"
-#include "imgui_internal.h"
-#include "imgui_te_engine.h"
-#include "imgui_te_context.h"
-#include "imgui_te_internal.h"
-#include "imgui_te_perftool.h"
-#include "thirdparty/Str/Str.h"
-
-//-------------------------------------------------------------------------
-// TEST ENGINE: USER INTERFACE
-//-------------------------------------------------------------------------
-// - DrawTestLog() [internal]
-// - GetVerboseLevelName() [internal]
-// - ShowTestGroup() [internal]
-// - ImGuiTestEngine_ShowTestWindows()
-//-------------------------------------------------------------------------
-
-// Look for " filename:number " in the string and add menu option to open source.
-static bool ParseLineAndDrawFileOpenItemForSourceFile(ImGuiTestEngine* e, ImGuiTest* test, const char* line_start, const char* line_end)
-{
- const char* separator = ImStrchrRange(line_start, line_end, ':');
- if (separator == NULL)
- return false;
-
- const char* path_end = separator;
- const char* path_begin = separator - 1;
- while (path_begin > line_start&& path_begin[-1] != ' ')
- path_begin--;
- if (path_begin == path_end)
- return false;
-
- int line_no = -1;
- sscanf(separator + 1, "%d ", &line_no);
- if (line_no == -1)
- return false;
-
- Str256f buf("Open '%.*s' at line %d", (int)(path_end - path_begin), path_begin, line_no);
- if (ImGui::MenuItem(buf.c_str()))
- {
- // FIXME-TESTS: Assume folder is same as folder of test->SourceFile!
- const char* src_path = test->SourceFile;
- const char* src_name = ImPathFindFilename(src_path);
- buf.setf("%.*s%.*s", (int)(src_name - src_path), src_path, (int)(path_end - path_begin), path_begin);
-
- ImGuiTestEngineIO& e_io = ImGuiTestEngine_GetIO(e);
- e_io.SrcFileOpenFunc(buf.c_str(), line_no, e_io.SrcFileOpenUserData);
- }
-
- return true;
-}
-
-// Look for "[ ,"]filename.png" in the string and add menu option to open image.
-static bool ParseLineAndDrawFileOpenItemForImageFile(ImGuiTestEngine* e, ImGuiTest* test, const char* line_start, const char* line_end, const char* file_ext)
-{
- IM_UNUSED(e);
- IM_UNUSED(test);
-
- const char* extension = ImStristr(line_start, line_end, file_ext, NULL);
- if (extension == NULL)
- return false;
-
- const char* path_end = extension + strlen(file_ext);
- const char* path_begin = extension - 1;
- while (path_begin > line_start && path_begin[-1] != ' ' && path_begin[-1] != '\'' && path_begin[-1] != '\"')
- path_begin--;
- if (path_begin == path_end)
- return false;
-
- Str256 buf;
-
- // Open file
- buf.setf("Open file: %.*s", (int)(path_end - path_begin), path_begin);
- if (ImGui::MenuItem(buf.c_str()))
- {
- buf.setf("%.*s", (int)(path_end - path_begin), path_begin);
- ImPathFixSeparatorsForCurrentOS(buf.c_str());
- ImOsOpenInShell(buf.c_str());
- }
-
- // Open folder
- const char* folder_begin = path_begin;
- const char* folder_end = ImPathFindFilename(path_begin, path_end);
- buf.setf("Open folder: %.*s", (int)(folder_end - folder_begin), path_begin);
- if (ImGui::MenuItem(buf.c_str()))
- {
- buf.setf("%.*s", (int)(folder_end - folder_begin), folder_begin);
- ImPathFixSeparatorsForCurrentOS(buf.c_str());
- ImOsOpenInShell(buf.c_str());
- }
-
- return true;
-}
-
-static bool ParseLineAndDrawFileOpenItem(ImGuiTestEngine* e, ImGuiTest* test, const char* line_start, const char* line_end)
-{
- if (ParseLineAndDrawFileOpenItemForSourceFile(e, test, line_start, line_end))
- return true;
- if (ParseLineAndDrawFileOpenItemForImageFile(e, test, line_start, line_end, ".png"))
- return true;
- if (ParseLineAndDrawFileOpenItemForImageFile(e, test, line_start, line_end, ".gif"))
- return true;
- if (ParseLineAndDrawFileOpenItemForImageFile(e, test, line_start, line_end, ".mp4"))
- return true;
- return false;
-}
-
-static float GetDpiScale()
-{
-#ifdef IMGUI_HAS_VIEWPORT
- return ImGui::GetWindowViewport()->DpiScale;
-#else
- return 1.0f;
-#endif
-}
-
-static void DrawTestLog(ImGuiTestEngine* e, ImGuiTest* test)
-{
- const ImU32 error_col = IM_COL32(255, 150, 150, 255);
- const ImU32 warning_col = IM_COL32(240, 240, 150, 255);
- const ImU32 unimportant_col = IM_COL32(190, 190, 190, 255);
- const float dpi_scale = GetDpiScale();
-
- ImGuiTestOutput* test_output = &test->Output;
-
- ImGuiTestLog* log = &test_output->Log;
- const char* text = log->Buffer.begin();
- const char* text_end = log->Buffer.end();
- ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(6.0f, 2.0f) * dpi_scale);
- ImGuiListClipper clipper;
- ImGuiTestVerboseLevel max_log_level = test_output->Status == ImGuiTestStatus_Error ? e->IO.ConfigVerboseLevelOnError : e->IO.ConfigVerboseLevel;
- int line_count = log->ExtractLinesForVerboseLevels(ImGuiTestVerboseLevel_Silent, max_log_level, NULL);
- int current_index_clipped = -1;
- int current_index_abs = 0;
- clipper.Begin(line_count);
- while (clipper.Step())
- {
- for (int line_no = clipper.DisplayStart; line_no < clipper.DisplayEnd; line_no++)
- {
- // Advance index_by_log_level to find log entry indicated by line_no.
- ImGuiTestLogLineInfo* line_info = NULL;
- while (current_index_clipped < line_no)
- {
- line_info = &log->LineInfo[current_index_abs];
- if (line_info->Level <= max_log_level)
- current_index_clipped++;
- current_index_abs++;
- }
-
- const char* line_start = text + line_info->LineOffset;
- const char* line_end = strchr(line_start, '\n');
- if (line_end == NULL)
- line_end = text_end;
-
- switch (line_info->Level)
- {
- case ImGuiTestVerboseLevel_Error:
- ImGui::PushStyleColor(ImGuiCol_Text, error_col);
- break;
- case ImGuiTestVerboseLevel_Warning:
- ImGui::PushStyleColor(ImGuiCol_Text, warning_col);
- break;
- case ImGuiTestVerboseLevel_Debug:
- case ImGuiTestVerboseLevel_Trace:
- ImGui::PushStyleColor(ImGuiCol_Text, unimportant_col);
- break;
- default:
- ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32_WHITE);
- break;
- }
- ImGui::TextUnformatted(line_start, line_end);
- ImGui::PopStyleColor();
-
- ImGui::PushID(line_no);
- if (ImGui::BeginPopupContextItem("Context", 1))
- {
- if (!ParseLineAndDrawFileOpenItem(e, test, line_start, line_end))
- ImGui::MenuItem("No options", NULL, false, false);
- ImGui::EndPopup();
- }
- ImGui::PopID();
- }
- }
- ImGui::PopStyleVar();
-}
-
-#if IMGUI_VERSION_NUM <= 18963
-namespace ImGui
-{
- void SetItemTooltip(const char* fmt, ...)
- {
- if (ImGui::IsItemHovered())
- {
- va_list args;
- va_start(args, fmt);
- ImGui::SetTooltipV(fmt, args);
- va_end(args);
- }
- }
-} // namespace ImGui
-#endif
-
-static bool ShowTestGroupFilterTest(ImGuiTestEngine* e, ImGuiTestGroup group, const char* filter, ImGuiTest* test)
-{
- if (test->Group != group)
- return false;
- if (!ImGuiTestEngine_PassFilter(test, *filter ? filter : "all"))
- return false;
- if ((e->UiFilterByStatusMask & (1 << test->Output.Status)) == 0)
- return false;
- return true;
-}
-
-static void GetFailingTestsAsString(ImGuiTestEngine* e, ImGuiTestGroup group, char separator, Str* out_string)
-{
- IM_ASSERT(out_string != NULL);
- bool first = true;
- for (int i = 0; i < e->TestsAll.Size; i++)
- {
- ImGuiTest* failing_test = e->TestsAll[i];
- Str* filter = (group == ImGuiTestGroup_Tests) ? e->UiFilterTests : e->UiFilterPerfs;
- if (failing_test->Group != group)
- continue;
- if (failing_test->Output.Status != ImGuiTestStatus_Error)
- continue;
- if (!ImGuiTestEngine_PassFilter(failing_test, filter->empty() ? "all" : filter->c_str()))
- continue;
- if (!first)
- out_string->append(separator);
- out_string->append(failing_test->Name);
- first = false;
- }
-}
-
-static void TestStatusButton(const char* id, const ImVec4& color, bool running, int display_counter)
-{
- ImGuiContext& g = *GImGui;
- ImGui::PushItemFlag(ImGuiItemFlags_NoTabStop, true);
- ImGui::ColorButton(id, color, ImGuiColorEditFlags_NoTooltip);
- ImGui::PopItemFlag();
- if (running)
- {
- //ImRect r = g.LastItemData.Rect;
- ImVec2 center = g.LastItemData.Rect.GetCenter();
- float radius = ImFloor(ImMin(g.LastItemData.Rect.GetWidth(), g.LastItemData.Rect.GetHeight()) * 0.40f);
- float t = (float)(ImGui::GetTime() * 20.0f);
- ImVec2 off(ImCos(t) * radius, ImSin(t) * radius);
- ImGui::GetWindowDrawList()->AddLine(center - off, center + off, ImGui::GetColorU32(ImGuiCol_Text), 1.5f);
- //ImGui::RenderText(r.Min + style.FramePadding + ImVec2(0, 0), &"|\0/\0-\0\\"[(((ImGui::GetFrameCount() / 5) & 3) << 1)], NULL);
- }
- else if (display_counter >= 0)
- {
- ImVec2 center = g.LastItemData.Rect.GetCenter();
- Str30f buf("%d", display_counter);
- ImGui::GetWindowDrawList()->AddText(center - ImGui::CalcTextSize(buf.c_str()) * 0.5f, ImGui::GetColorU32(ImGuiCol_Text), buf.c_str());
- }
-}
-
-static void ShowTestGroup(ImGuiTestEngine* e, ImGuiTestGroup group, Str* filter)
-{
- ImGuiStyle& style = ImGui::GetStyle();
- ImGuiIO& io = ImGui::GetIO();
- const float dpi_scale = GetDpiScale();
-
- // Colored Status button: will be displayed later below
- // - Save position of test run status button and make space for it.
- const ImVec2 status_button_pos = ImGui::GetCursorPos();
- ImGui::SetCursorPosX(ImGui::GetCursorPosX() + ImGui::GetFrameHeight() + style.ItemInnerSpacing.x);
-
- //ImGui::Text("TESTS (%d)", engine->TestsAll.Size);
-#if IMGUI_VERSION_NUM >= 18837
- bool run = ImGui::Button("Run") || ImGui::Shortcut(ImGuiMod_Ctrl | ImGuiKey_R);
-#else
- bool = ImGui::Button("Run");
-#endif
-#if IMGUI_VERSION_NUM > 18963
- ImGui::SetItemTooltip("Ctrl+R");
-#endif
- if (run)
- {
- for (int n = 0; n < e->TestsAll.Size; n++)
- {
- ImGuiTest* test = e->TestsAll[n];
- if (!ShowTestGroupFilterTest(e, group, filter->c_str(), test))
- continue;
- ImGuiTestEngine_QueueTest(e, test, ImGuiTestRunFlags_None);
- }
- }
- ImGui::SameLine();
-
- {
- ImGui::SetNextItemWidth(ImGui::GetFontSize() * 6.0f);
- const char* filter_by_status_desc = "";
- if (e->UiFilterByStatusMask == ~0u)
- filter_by_status_desc = "All";
- else if (e->UiFilterByStatusMask == ~(1u << ImGuiTestStatus_Success))
- filter_by_status_desc = "Not OK";
- else if (e->UiFilterByStatusMask == (1u << ImGuiTestStatus_Error))
- filter_by_status_desc = "Errors";
- if (ImGui::BeginCombo("##filterbystatus", filter_by_status_desc))
- {
- if (ImGui::Selectable("All", e->UiFilterByStatusMask == ~0u))
- e->UiFilterByStatusMask = (ImU32)~0u;
- if (ImGui::Selectable("Not OK", e->UiFilterByStatusMask == ~(1u << ImGuiTestStatus_Success)))
- e->UiFilterByStatusMask = (ImU32)~(1u << ImGuiTestStatus_Success);
- if (ImGui::Selectable("Errors", e->UiFilterByStatusMask == (1u << ImGuiTestStatus_Error)))
- e->UiFilterByStatusMask = (ImU32)(1u << ImGuiTestStatus_Error);
- ImGui::EndCombo();
- }
- }
-
- ImGui::SameLine();
- const char* perflog_label = "Perf Tool";
- float filter_width = ImGui::GetWindowContentRegionMax().x - ImGui::GetCursorPos().x;
- float perf_stress_factor_width = (30 * dpi_scale);
- if (group == ImGuiTestGroup_Perfs)
- {
- filter_width -= style.ItemSpacing.x + perf_stress_factor_width;
- filter_width -= style.ItemSpacing.x + style.FramePadding.x * 2 + ImGui::CalcTextSize(perflog_label).x;
- }
- filter_width -= ImGui::CalcTextSize("(?)").x + style.ItemSpacing.x;
- ImGui::SetNextItemWidth(ImMax(20.0f, filter_width));
- ImGui::InputText("##filter", filter);
- ImGui::SameLine();
- ImGui::TextDisabled("(?)");
- ImGui::SetItemTooltip("Query is composed of one or more comma-separated filter terms with optional modifiers.\n"
- "Available modifiers:\n"
- "- '-' prefix excludes tests matched by the term.\n"
- "- '^' prefix anchors term matching to the start of the string.\n"
- "- '$' suffix anchors term matching to the end of the string.");
- if (group == ImGuiTestGroup_Perfs)
- {
- ImGui::SameLine();
- ImGui::SetNextItemWidth(perf_stress_factor_width);
- ImGui::DragInt("##PerfStress", &e->IO.PerfStressAmount, 0.1f, 1, 20, "x%d");
- ImGui::SetItemTooltip("Increase workload of performance tests (higher means longer run)."); // FIXME: Move?
- ImGui::SameLine();
- if (ImGui::Button(perflog_label))
- {
- e->UiPerfToolOpen = true;
- ImGui::FocusWindow(ImGui::FindWindowByName("Dear ImGui Perf Tool"));
- }
- }
-
- int tests_completed = 0;
- int tests_succeeded = 0;
- int tests_failed = 0;
- if (ImGui::BeginTable("Tests", 3, ImGuiTableFlags_ScrollY | ImGuiTableFlags_Resizable | ImGuiTableFlags_NoBordersInBody | ImGuiTableFlags_SizingFixedFit))
- {
- ImGui::TableSetupScrollFreeze(0, 1);
- ImGui::TableSetupColumn("Status");
- ImGui::TableSetupColumn("Category");
- ImGui::TableSetupColumn("Test", ImGuiTableColumnFlags_WidthStretch);
- ImGui::TableHeadersRow();
-
- ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(6, 4) * dpi_scale);
- ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(4, 0) * dpi_scale);
- //ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, ImVec2(100, 10) * dpi_scale);
- for (int test_n = 0; test_n < e->TestsAll.Size; test_n++)
- {
- ImGuiTest* test = e->TestsAll[test_n];
- if (!ShowTestGroupFilterTest(e, group, filter->c_str(), test))
- continue;
-
- ImGuiTestOutput* test_output = &test->Output;
- ImGuiTestContext* test_context = (e->TestContext && e->TestContext->Test == test) ? e->TestContext : NULL; // Running context, if any
-
- ImGui::TableNextRow();
- ImGui::PushID(test_n);
-
- // Colors match general test status colors defined below.
- ImVec4 status_color;
- switch (test_output->Status)
- {
- case ImGuiTestStatus_Error:
- status_color = ImVec4(0.9f, 0.1f, 0.1f, 1.0f);
- tests_completed++;
- tests_failed++;
- break;
- case ImGuiTestStatus_Success:
- status_color = ImVec4(0.1f, 0.9f, 0.1f, 1.0f);
- tests_completed++;
- tests_succeeded++;
- break;
- case ImGuiTestStatus_Queued:
- case ImGuiTestStatus_Running:
- case ImGuiTestStatus_Suspended:
- if (test_context && (test_context->RunFlags & ImGuiTestRunFlags_GuiFuncOnly))
- status_color = ImVec4(0.8f, 0.0f, 0.8f, 1.0f);
- else
- status_color = ImVec4(0.8f, 0.4f, 0.1f, 1.0f);
- break;
- default:
- status_color = ImVec4(0.4f, 0.4f, 0.4f, 1.0f);
- break;
- }
-
- ImGui::TableNextColumn();
- TestStatusButton("status", status_color, test_output->Status == ImGuiTestStatus_Running || test_output->Status == ImGuiTestStatus_Suspended, -1);
- ImGui::SameLine();
-
- bool queue_test = false;
- bool queue_gui_func_toggle = false;
- bool select_test = false;
-
- if (test_output->Status == ImGuiTestStatus_Suspended)
- {
- // Resume IM_SUSPEND_TESTFUNC
- // FIXME: Terrible user experience to have this here.
- if (ImGui::Button("Con###Run"))
- test_output->Status = ImGuiTestStatus_Running;
- ImGui::SetItemTooltip("CTRL+Space to continue.");
- if (ImGui::IsKeyPressed(ImGuiKey_Space) && io.KeyCtrl)
- test_output->Status = ImGuiTestStatus_Running;
- }
- else
- {
- if (ImGui::Button("Run###Run"))
- queue_test = select_test = true;
- }
-
- ImGui::TableNextColumn();
- if (ImGui::Selectable(test->Category, test == e->UiSelectedTest, ImGuiSelectableFlags_SpanAllColumns | ImGuiSelectableFlags_SelectOnNav))
- select_test = true;
-
- // Double-click to run test, CTRL+Double-click to run GUI function
- const bool is_running_gui_func = (test_context && (test_context->RunFlags & ImGuiTestRunFlags_GuiFuncOnly));
- const bool has_gui_func = (test->GuiFunc != NULL);
- if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(0))
- {
- if (ImGui::GetIO().KeyCtrl)
- queue_gui_func_toggle = true;
- else
- queue_test = true;
- }
-
- /*if (ImGui::IsItemHovered() && test->TestLog.size() > 0)
- {
- ImGui::BeginTooltip();
- DrawTestLog(engine, test, false);
- ImGui::EndTooltip();
- }*/
-
- if (e->UiSelectAndScrollToTest == test)
- ImGui::SetScrollHereY();
-
- bool view_source = false;
- if (ImGui::BeginPopupContextItem())
- {
- select_test = true;
-
- if (ImGui::MenuItem("Run test"))
- queue_test = true;
- if (ImGui::MenuItem("Run GUI func", "Ctrl+DblClick", is_running_gui_func, has_gui_func))
- queue_gui_func_toggle = true;
-
- ImGui::Separator();
-
- const bool open_source_available = (test->SourceFile != NULL) && (e->IO.SrcFileOpenFunc != NULL);
-
- Str128 buf;
- if (test->SourceFile != NULL) // This is normally set by IM_REGISTER_TEST() but custom registration may omit it.
- buf.setf("Open source (%s:%d)", ImPathFindFilename(test->SourceFile), test->SourceLine);
- else
- buf.set("Open source");
- if (ImGui::MenuItem(buf.c_str(), NULL, false, open_source_available))
- e->IO.SrcFileOpenFunc(test->SourceFile, test->SourceLine, e->IO.SrcFileOpenUserData);
- if (ImGui::MenuItem("View source...", NULL, false, test->SourceFile != NULL))
- view_source = true;
-
- if (group == ImGuiTestGroup_Perfs && ImGui::MenuItem("View perflog"))
- {
- e->PerfTool->ViewOnly(test->Name);
- e->UiPerfToolOpen = true;
- }
-
- ImGui::Separator();
- if (ImGui::MenuItem("Copy name", NULL, false))
- ImGui::SetClipboardText(test->Name);
-
- if (test_output->Status == ImGuiTestStatus_Error)
- if (ImGui::MenuItem("Copy names of all failing tests"))
- {
- Str256 failing_tests;
- GetFailingTestsAsString(e, group, ',', &failing_tests);
- ImGui::SetClipboardText(failing_tests.c_str());
- }
-
- ImGuiTestLog* test_log = &test_output->Log;
- if (ImGui::BeginMenu("Copy log", !test_log->IsEmpty()))
- {
- for (int level_n = ImGuiTestVerboseLevel_Error; level_n < ImGuiTestVerboseLevel_COUNT; level_n++)
- {
- ImGuiTestVerboseLevel level = (ImGuiTestVerboseLevel)level_n;
- int count = test_log->ExtractLinesForVerboseLevels((ImGuiTestVerboseLevel)0, level, NULL);
- if (ImGui::MenuItem(Str64f("%s (%d lines)", ImGuiTestEngine_GetVerboseLevelName(level), count).c_str(), NULL, false, count > 0))
- {
- ImGuiTextBuffer buffer;
- test_log->ExtractLinesForVerboseLevels((ImGuiTestVerboseLevel)0, level, &buffer);
- ImGui::SetClipboardText(buffer.c_str());
- }
- }
- ImGui::EndMenu();
- }
-
- if (ImGui::MenuItem("Clear log", NULL, false, !test_log->IsEmpty()))
- test_log->Clear();
-
- ImGui::EndPopup();
- }
-
- // Process source popup
- static ImGuiTextBuffer source_blurb;
- static int goto_line = -1;
- if (view_source)
- {
- source_blurb.clear();
- size_t file_size = 0;
- char* file_data = (char*)ImFileLoadToMemory(test->SourceFile, "rb", &file_size);
- if (file_data)
- source_blurb.append(file_data, file_data + file_size);
- else
- source_blurb.append("<Error loading sources>");
- goto_line = (test->SourceLine + test->SourceLineEnd) / 2;
- ImGui::OpenPopup("Source");
- }
- if (ImGui::BeginPopup("Source"))
- {
- // FIXME: Local vs screen pos too messy :(
- const ImVec2 start_pos = ImGui::GetCursorStartPos();
- const float line_height = ImGui::GetTextLineHeight();
- if (goto_line != -1)
- ImGui::SetScrollFromPosY(start_pos.y + (goto_line - 1) * line_height, 0.5f);
- goto_line = -1;
-
- ImRect r(0.0f, test->SourceLine * line_height, ImGui::GetWindowWidth(), (test->SourceLine + 1) * line_height); // SourceLineEnd is too flaky
- ImGui::GetWindowDrawList()->AddRectFilled(ImGui::GetWindowPos() + start_pos + r.Min, ImGui::GetWindowPos() + start_pos + r.Max, IM_COL32(80, 80, 150, 150));
-
- ImGui::TextUnformatted(source_blurb.c_str(), source_blurb.end());
- ImGui::EndPopup();
- }
-
- ImGui::TableNextColumn();
- ImGui::TextUnformatted(test->Name);
-
- // Process selection
- if (select_test)
- e->UiSelectedTest = test;
-
- // Process queuing
- if (queue_gui_func_toggle && is_running_gui_func)
- ImGuiTestEngine_AbortCurrentTest(e);
- else if (queue_gui_func_toggle && !e->IO.IsRunningTests)
- ImGuiTestEngine_QueueTest(e, test, ImGuiTestRunFlags_RunFromGui | ImGuiTestRunFlags_GuiFuncOnly);
- if (queue_test && !e->IO.IsRunningTests)
- ImGuiTestEngine_QueueTest(e, test, ImGuiTestRunFlags_RunFromGui);
-
- ImGui::PopID();
- }
- ImGui::Spacing();
- ImGui::PopStyleVar(2);
- ImGui::EndTable();
- }
-
- // Display test status recap (colors match per-test run button colors defined above)
- {
- ImVec4 status_color;
- if (tests_failed > 0)
- status_color = ImVec4(0.9f, 0.1f, 0.1f, 1.0f); // Red
- else if (e->IO.IsRunningTests)
- status_color = ImVec4(0.8f, 0.4f, 0.1f, 1.0f);
- else if (tests_succeeded > 0 && tests_completed == tests_succeeded)
- status_color = ImVec4(0.1f, 0.9f, 0.1f, 1.0f);
- else
- status_color = ImVec4(0.4f, 0.4f, 0.4f, 1.0f);
- //ImVec2 cursor_pos_bkp = ImGui::GetCursorPos();
- ImGui::SetCursorPos(status_button_pos);
- TestStatusButton("status", status_color, false, tests_failed > 0 ? tests_failed : -1);// e->IO.IsRunningTests);
- ImGui::SetItemTooltip("Filtered: %d\n- OK: %d\n- Errors: %d", tests_completed, tests_succeeded, tests_failed);
- //ImGui::SetCursorPos(cursor_pos_bkp); // Restore cursor position for rendering further widgets
- }
-}
-
-static void ImGuiTestEngine_ShowLogAndTools(ImGuiTestEngine* engine)
-{
- ImGuiContext& g = *GImGui;
- const float dpi_scale = GetDpiScale();
-
- if (!ImGui::BeginTabBar("##tools"))
- return;
-
- if (ImGui::BeginTabItem("LOG"))
- {
- ImGuiTest* selected_test = engine->UiSelectedTest;
-
- if (selected_test != NULL)
- ImGui::Text("Log for '%s' '%s'", selected_test->Category, selected_test->Name);
- else
- ImGui::Text("N/A");
- if (ImGui::SmallButton("Clear"))
- if (selected_test)
- selected_test->Output.Log.Clear();
- ImGui::SameLine();
- if (ImGui::SmallButton("Copy to clipboard"))
- if (engine->UiSelectedTest)
- ImGui::SetClipboardText(selected_test->Output.Log.Buffer.c_str());
- ImGui::Separator();
-
- ImGui::BeginChild("Log");
- if (engine->UiSelectedTest)
- {
- DrawTestLog(engine, engine->UiSelectedTest);
- if (ImGui::GetScrollY() >= ImGui::GetScrollMaxY())
- ImGui::SetScrollHereY();
- }
- ImGui::EndChild();
- ImGui::EndTabItem();
- }
-
- // Options
- if (ImGui::BeginTabItem("OPTIONS"))
- {
- ImGuiIO& io = ImGui::GetIO();
- ImGui::Text("%.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate);
- ImGui::Text("TestEngine: HookItems: %d, HookPushId: %d, InfoTasks: %d", g.TestEngineHookItems, g.DebugHookIdInfo != 0, engine->InfoTasks.Size);
- ImGui::Separator();
-
- if (ImGui::Button("Reboot UI context"))
- engine->ToolDebugRebootUiContext = true;
-
- const ImGuiInputTextCallback filter_callback = [](ImGuiInputTextCallbackData* data) { return (data->EventChar == ',' || data->EventChar == ';') ? 1 : 0; };
- ImGui::InputText("Branch/Annotation", engine->IO.GitBranchName, IM_ARRAYSIZE(engine->IO.GitBranchName), ImGuiInputTextFlags_CallbackCharFilter, filter_callback, NULL);
- ImGui::SetItemTooltip("This will be stored in the CSV file for performance tools.");
-
- ImGui::Separator();
-
- if (ImGui::TreeNode("Screen/video capture"))
- {
- ImGui::Checkbox("Capture when requested by API", &engine->IO.ConfigCaptureEnabled);
- ImGui::SetItemTooltip("Enable or disable screen capture API completely.");
- ImGui::Checkbox("Capture screen on error", &engine->IO.ConfigCaptureOnError);
- ImGui::SetItemTooltip("Capture a screenshot on test failure.");
-
- // Fields modified by in this call will be synced to engine->CaptureContext.
- engine->CaptureTool._ShowEncoderConfigFields(&engine->CaptureContext);
-
- ImGui::TreePop();
- }
-
- if (ImGui::TreeNode("Performances"))
- {
- ImGui::Checkbox("Slow down whole app", &engine->ToolSlowDown);
- ImGui::SameLine(); ImGui::SetNextItemWidth(70 * dpi_scale);
- ImGui::SliderInt("##ms", &engine->ToolSlowDownMs, 0, 400, "%d ms");
-
- // FIXME-TESTS: Need to be visualizing the samples/spikes.
- double dt_1 = 1.0 / ImGui::GetIO().Framerate;
- double fps_now = 1.0 / dt_1;
- double dt_100 = engine->PerfDeltaTime100.GetAverage();
- double dt_500 = engine->PerfDeltaTime500.GetAverage();
-
- //if (engine->PerfRefDeltaTime <= 0.0 && engine->PerfRefDeltaTime.IsFull())
- // engine->PerfRefDeltaTime = dt_2000;
-
- ImGui::Checkbox("Unthrolled", &engine->IO.ConfigNoThrottle);
- ImGui::SameLine();
- if (ImGui::Button("Pick ref dt"))
- engine->PerfRefDeltaTime = dt_500;
-
- double dt_ref = engine->PerfRefDeltaTime;
- ImGui::Text("[ref dt] %6.3f ms", engine->PerfRefDeltaTime * 1000);
- ImGui::Text("[last 001] %6.3f ms (%.1f FPS) ++ %6.3f ms", dt_1 * 1000.0, 1.0 / dt_1, (dt_1 - dt_ref) * 1000);
- ImGui::Text("[last 100] %6.3f ms (%.1f FPS) ++ %6.3f ms ~ converging in %.1f secs", dt_100 * 1000.0, 1.0 / dt_100, (dt_1 - dt_ref) * 1000, 100.0 / fps_now);
- ImGui::Text("[last 500] %6.3f ms (%.1f FPS) ++ %6.3f ms ~ converging in %.1f secs", dt_500 * 1000.0, 1.0 / dt_500, (dt_1 - dt_ref) * 1000, 500.0 / fps_now);
-
- //ImGui::PlotLines("Last 100", &engine->PerfDeltaTime100.Samples.Data, engine->PerfDeltaTime100.Samples.Size, engine->PerfDeltaTime100.Idx, NULL, 0.0f, dt_1000 * 1.10f, ImVec2(0.0f, ImGui::GetFontSize()));
- ImVec2 plot_size(0.0f, ImGui::GetFrameHeight() * 3);
- ImMovingAverage<double>* ma = &engine->PerfDeltaTime500;
- ImGui::PlotLines("Last 500",
- [](void* data, int n) { ImMovingAverage<double>* ma = (ImMovingAverage<double>*)data; return (float)(ma->Samples[n] * 1000); },
- ma, ma->Samples.Size, 0 * ma->Idx, NULL, 0.0f, (float)(ImMax(dt_100, dt_500) * 1000.0 * 1.2f), plot_size);
-
- ImGui::TreePop();
- }
-
- if (ImGui::TreeNode("Dear ImGui Configuration Flags"))
- {
- ImGui::CheckboxFlags("io.ConfigFlags: NavEnableKeyboard", &io.ConfigFlags, ImGuiConfigFlags_NavEnableKeyboard);
- ImGui::CheckboxFlags("io.ConfigFlags: NavEnableGamepad", &io.ConfigFlags, ImGuiConfigFlags_NavEnableGamepad);
-#ifdef IMGUI_HAS_DOCK
- ImGui::Checkbox("io.ConfigDockingAlwaysTabBar", &io.ConfigDockingAlwaysTabBar);
-#endif
- ImGui::TreePop();
- }
-
- ImGui::EndTabItem();
- }
- ImGui::EndTabBar();
-}
-
-static void ImGuiTestEngine_ShowTestTool(ImGuiTestEngine* engine, bool* p_open)
-{
- const float dpi_scale = GetDpiScale();
-
- ImGui::SetNextWindowSize(ImVec2(ImGui::GetFontSize() * 50, ImGui::GetFontSize() * 40), ImGuiCond_FirstUseEver);
- if (!ImGui::Begin("Dear ImGui Test Engine", p_open, ImGuiWindowFlags_MenuBar))
- {
- ImGui::End();
- return;
- }
-
- if (ImGui::BeginMenuBar())
- {
- if (ImGui::BeginMenu("Tools"))
- {
- ImGuiContext& g = *GImGui;
- ImGui::MenuItem("Metrics/Debugger", "", &engine->UiMetricsOpen);
- ImGui::MenuItem("Debug Log", "", &engine->UiDebugLogOpen);
- ImGui::MenuItem("Stack Tool", "", &engine->UiStackToolOpen);
- ImGui::MenuItem("Item Picker", "", &g.DebugItemPickerActive);
- ImGui::Separator();
- ImGui::MenuItem("Capture Tool", "", &engine->UiCaptureToolOpen);
- ImGui::MenuItem("Perf Tool", "", &engine->UiPerfToolOpen);
- ImGui::EndMenu();
- }
- ImGui::EndMenuBar();
- }
-
- ImGui::SetNextItemWidth(90 * dpi_scale);
- if (ImGui::BeginCombo("##RunSpeed", ImGuiTestEngine_GetRunSpeedName(engine->IO.ConfigRunSpeed), ImGuiComboFlags_None))
- {
- for (ImGuiTestRunSpeed level = (ImGuiTestRunSpeed)0; level < ImGuiTestRunSpeed_COUNT; level = (ImGuiTestRunSpeed)(level + 1))
- if (ImGui::Selectable(ImGuiTestEngine_GetRunSpeedName(level), engine->IO.ConfigRunSpeed == level))
- engine->IO.ConfigRunSpeed = level;
- ImGui::EndCombo();
- }
- ImGui::SetItemTooltip(
- "Running speed\n"
- "- Fast: Run tests as fast as possible (no delay/vsync, teleport mouse, etc.).\n"
- "- Normal: Run tests at human watchable speed (for debugging).\n"
- "- Cinematic: Run tests with pauses between actions (for e.g. tutorials)."
- );
- ImGui::SameLine();
- //ImGui::Checkbox("Fast", &engine->IO.ConfigRunFast);
- //ImGui::SameLine();
- ImGui::Checkbox("Stop", &engine->IO.ConfigStopOnError);
- ImGui::SetItemTooltip("Stop running tests when hitting an error.");
- ImGui::SameLine();
- ImGui::Checkbox("DbgBrk", &engine->IO.ConfigBreakOnError);
- ImGui::SetItemTooltip("Break in debugger when hitting an error.");
- ImGui::SameLine();
- ImGui::Checkbox("KeepGUI", &engine->IO.ConfigKeepGuiFunc);
- ImGui::SetItemTooltip("Keep GUI function running after a test fails, or when a single queued test is finished.\nHold ESC to abort a running GUI function.");
- ImGui::SameLine();
- ImGui::Checkbox("Refocus", &engine->IO.ConfigRestoreFocusAfterTests);
- ImGui::SetItemTooltip("Restore focus back after running tests.");
- ImGui::SameLine();
- ImGui::SeparatorEx(ImGuiSeparatorFlags_Vertical);
- ImGui::SameLine();
- ImGui::SetNextItemWidth(70 * dpi_scale);
- if (ImGui::BeginCombo("##Verbose", ImGuiTestEngine_GetVerboseLevelName(engine->IO.ConfigVerboseLevel), ImGuiComboFlags_None))
- {
- for (ImGuiTestVerboseLevel level = (ImGuiTestVerboseLevel)0; level < ImGuiTestVerboseLevel_COUNT; level = (ImGuiTestVerboseLevel)(level + 1))
- if (ImGui::Selectable(ImGuiTestEngine_GetVerboseLevelName(level), engine->IO.ConfigVerboseLevel == level))
- engine->IO.ConfigVerboseLevel = engine->IO.ConfigVerboseLevelOnError = level;
- ImGui::EndCombo();
- }
- ImGui::SetItemTooltip("Verbose level.");
- //ImGui::PopStyleVar();
- ImGui::Separator();
-
- // SPLITTER
- // FIXME-OPT: A better splitter API supporting arbitrary number of splits would be useful.
- float list_height = 0.0f;
- float& log_height = engine->UiLogHeight;
- ImGui::Splitter("splitter", &list_height, &log_height, ImGuiAxis_Y, +1);
-
- // TESTS
- ImGui::BeginChild("List", ImVec2(0, list_height), false, ImGuiWindowFlags_NoScrollbar);
- if (ImGui::BeginTabBar("##Tests", ImGuiTabBarFlags_NoTooltip)) // Add _NoPushId flag in TabBar?
- {
- if (ImGui::BeginTabItem("TESTS", NULL, ImGuiTabItemFlags_NoPushId))
- {
- ShowTestGroup(engine, ImGuiTestGroup_Tests, engine->UiFilterTests);
- ImGui::EndTabItem();
- }
- if (ImGui::BeginTabItem("PERFS", NULL, ImGuiTabItemFlags_NoPushId))
- {
- ShowTestGroup(engine, ImGuiTestGroup_Perfs, engine->UiFilterPerfs);
- ImGui::EndTabItem();
- }
- ImGui::EndTabBar();
- }
- ImGui::EndChild();
- engine->UiSelectAndScrollToTest = NULL;
-
- // LOG & TOOLS
- ImGui::BeginChild("Log", ImVec2(0, log_height));
- ImGuiTestEngine_ShowLogAndTools(engine);
- ImGui::EndChild();
-
- ImGui::End();
-}
-
-void ImGuiTestEngine_ShowTestEngineWindows(ImGuiTestEngine* e, bool* p_open)
-{
- // Test Tool
- ImGuiTestEngine_ShowTestTool(e, p_open);
-
- // Stack Tool
-#if IMGUI_VERSION_NUM < 18993
- if (e->UiStackToolOpen)
- ImGui::ShowStackToolWindow(&e->UiStackToolOpen);
-#else
- if (e->UiStackToolOpen)
- ImGui::ShowIDStackToolWindow(&e->UiStackToolOpen);
-#endif
-
- // Capture Tool
- if (e->UiCaptureToolOpen)
- e->CaptureTool.ShowCaptureToolWindow(&e->CaptureContext, &e->UiCaptureToolOpen);
-
- // Performance tool
- if (e->UiPerfToolOpen)
- e->PerfTool->ShowPerfToolWindow(e, &e->UiPerfToolOpen);;
-
- // Show Dear ImGui windows
- // (we cannot show demo window here because it could lead to duplicate display, which demo windows isn't guarded for)
- if (e->UiMetricsOpen)
- ImGui::ShowMetricsWindow(&e->UiMetricsOpen);
- if (e->UiDebugLogOpen)
- ImGui::ShowDebugLogWindow(&e->UiDebugLogOpen);
-}