mirror of
https://github.com/Drezil/imgui.git
synced 2024-11-15 01:17:00 +00:00
Stack Tool: Added option to copy item path to clipboard. (#4631)
This commit is contained in:
parent
88de982071
commit
aa79d0cd2f
@ -39,6 +39,8 @@ Breaking changes:
|
|||||||
|
|
||||||
Other Changes:
|
Other Changes:
|
||||||
|
|
||||||
|
- Stack Tool: Added option to copy item path to clipboard. (#4631)
|
||||||
|
|
||||||
|
|
||||||
-----------------------------------------------------------------------
|
-----------------------------------------------------------------------
|
||||||
VERSION 1.87 (Released 2022-02-07)
|
VERSION 1.87 (Released 2022-02-07)
|
||||||
|
71
imgui.cpp
71
imgui.cpp
@ -13026,27 +13026,44 @@ void ImGui::DebugHookIdInfo(ImGuiID id, ImGuiDataType data_type, const void* dat
|
|||||||
ImGuiStackLevelInfo* info = &tool->Results[tool->StackLevel];
|
ImGuiStackLevelInfo* info = &tool->Results[tool->StackLevel];
|
||||||
IM_ASSERT(info->ID == id && info->QueryFrameCount > 0);
|
IM_ASSERT(info->ID == id && info->QueryFrameCount > 0);
|
||||||
|
|
||||||
int data_len;
|
|
||||||
switch (data_type)
|
switch (data_type)
|
||||||
{
|
{
|
||||||
case ImGuiDataType_S32:
|
case ImGuiDataType_S32:
|
||||||
ImFormatString(info->Desc, IM_ARRAYSIZE(info->Desc), "%d", (int)(intptr_t)data_id);
|
ImFormatString(info->Desc, IM_ARRAYSIZE(info->Desc), "%d", (int)(intptr_t)data_id);
|
||||||
break;
|
break;
|
||||||
case ImGuiDataType_String:
|
case ImGuiDataType_String:
|
||||||
data_len = data_id_end ? (int)((const char*)data_id_end - (const char*)data_id) : (int)strlen((const char*)data_id);
|
ImFormatString(info->Desc, IM_ARRAYSIZE(info->Desc), "%.*s", data_id_end ? (int)((const char*)data_id_end - (const char*)data_id) : (int)strlen((const char*)data_id), (const char*)data_id);
|
||||||
ImFormatString(info->Desc, IM_ARRAYSIZE(info->Desc), "\"%.*s\"", data_len, (const char*)data_id);
|
|
||||||
break;
|
break;
|
||||||
case ImGuiDataType_Pointer:
|
case ImGuiDataType_Pointer:
|
||||||
ImFormatString(info->Desc, IM_ARRAYSIZE(info->Desc), "(void*)0x%p", data_id);
|
ImFormatString(info->Desc, IM_ARRAYSIZE(info->Desc), "(void*)0x%p", data_id);
|
||||||
break;
|
break;
|
||||||
case ImGuiDataType_ID:
|
case ImGuiDataType_ID:
|
||||||
if (info->Desc[0] == 0) // PushOverrideID() is often used to avoid hashing twice, which would lead to 2 calls to DebugHookIdInfo(). We prioritize the first one.
|
if (info->Desc[0] != 0) // PushOverrideID() is often used to avoid hashing twice, which would lead to 2 calls to DebugHookIdInfo(). We prioritize the first one.
|
||||||
|
return;
|
||||||
ImFormatString(info->Desc, IM_ARRAYSIZE(info->Desc), "0x%08X [override]", id);
|
ImFormatString(info->Desc, IM_ARRAYSIZE(info->Desc), "0x%08X [override]", id);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
IM_ASSERT(0);
|
IM_ASSERT(0);
|
||||||
}
|
}
|
||||||
info->QuerySuccess = true;
|
info->QuerySuccess = true;
|
||||||
|
info->DataType = data_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int StackToolFormatLevelInfo(ImGuiStackTool* tool, int n, bool format_for_ui, char* buf, size_t buf_size)
|
||||||
|
{
|
||||||
|
ImGuiStackLevelInfo* info = &tool->Results[n];
|
||||||
|
ImGuiWindow* window = (info->Desc[0] == 0 && n == 0) ? ImGui::FindWindowByID(info->ID) : NULL;
|
||||||
|
if (window) // Source: window name (because the root ID don't call GetID() and so doesn't get hooked)
|
||||||
|
return ImFormatString(buf, buf_size, format_for_ui ? "\"%s\" [window]" : "%s", window->Name);
|
||||||
|
if (info->QuerySuccess) // Source: GetID() hooks (prioritize over ItemInfo() because we frequently use patterns like: PushID(str), Button("") where they both have same id)
|
||||||
|
return ImFormatString(buf, buf_size, (format_for_ui && info->DataType == ImGuiDataType_String) ? "\"%s\"" : "%s", info->Desc);
|
||||||
|
if (tool->StackLevel < tool->Results.Size) // Only start using fallback below when all queries are done, so during queries we don't flickering ??? markers.
|
||||||
|
return (*buf = 0);
|
||||||
|
#ifdef IMGUI_ENABLE_TEST_ENGINE
|
||||||
|
if (const char* label = ImGuiTestEngine_FindItemDebugLabel(GImGui, info->ID)) // Source: ImGuiTestEngine's ItemInfo()
|
||||||
|
return ImFormatString(buf, buf_size, format_for_ui ? "??? \"%s\"" : "%s", label);
|
||||||
|
#endif
|
||||||
|
return ImFormatString(buf, buf_size, "???");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stack Tool: Display UI
|
// Stack Tool: Display UI
|
||||||
@ -13062,6 +13079,7 @@ void ImGui::ShowStackToolWindow(bool* p_open)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Display hovered/active status
|
// Display hovered/active status
|
||||||
|
ImGuiStackTool* tool = &g.DebugStackTool;
|
||||||
const ImGuiID hovered_id = g.HoveredIdPreviousFrame;
|
const ImGuiID hovered_id = g.HoveredIdPreviousFrame;
|
||||||
const ImGuiID active_id = g.ActiveId;
|
const ImGuiID active_id = g.ActiveId;
|
||||||
#ifdef IMGUI_ENABLE_TEST_ENGINE
|
#ifdef IMGUI_ENABLE_TEST_ENGINE
|
||||||
@ -13072,8 +13090,33 @@ void ImGui::ShowStackToolWindow(bool* p_open)
|
|||||||
SameLine();
|
SameLine();
|
||||||
MetricsHelpMarker("Hover an item with the mouse to display elements of the ID Stack leading to the item's final ID.\nEach level of the stack correspond to a PushID() call.\nAll levels of the stack are hashed together to make the final ID of a widget (ID displayed at the bottom level of the stack).\nRead FAQ entry about the ID stack for details.");
|
MetricsHelpMarker("Hover an item with the mouse to display elements of the ID Stack leading to the item's final ID.\nEach level of the stack correspond to a PushID() call.\nAll levels of the stack are hashed together to make the final ID of a widget (ID displayed at the bottom level of the stack).\nRead FAQ entry about the ID stack for details.");
|
||||||
|
|
||||||
|
// CTRL+C to copy path
|
||||||
|
const float time_since_copy = (float)g.Time - tool->CopyToClipboardLastTime;
|
||||||
|
Checkbox("Ctrl+C: copy path to clipboard", &tool->CopyToClipboardOnCtrlC);
|
||||||
|
SameLine();
|
||||||
|
TextColored((time_since_copy >= 0.0f && time_since_copy < 0.75f && ImFmod(time_since_copy, 0.25f) < 0.25f * 0.5f) ? ImVec4(1.f, 1.f, 0.3f, 1.f) : ImVec4(), "*COPIED*");
|
||||||
|
if (tool->CopyToClipboardOnCtrlC && IsKeyDown(ImGuiKey_ModCtrl) && IsKeyPressed(ImGuiKey_C))
|
||||||
|
{
|
||||||
|
tool->CopyToClipboardLastTime = (float)g.Time;
|
||||||
|
char* p = g.TempBuffer;
|
||||||
|
char* p_end = p + IM_ARRAYSIZE(g.TempBuffer);
|
||||||
|
for (int stack_n = 0; stack_n < tool->Results.Size && p + 3 < p_end; stack_n++)
|
||||||
|
{
|
||||||
|
*p++ = '/';
|
||||||
|
char level_desc[256];
|
||||||
|
StackToolFormatLevelInfo(tool, stack_n, false, level_desc, IM_ARRAYSIZE(level_desc));
|
||||||
|
for (int n = 0; level_desc[n] && p + 2 < p_end; n++)
|
||||||
|
{
|
||||||
|
if (level_desc[n] == '/')
|
||||||
|
*p++ = '\\';
|
||||||
|
*p++ = level_desc[n];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*p = '\0';
|
||||||
|
SetClipboardText(g.TempBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
// Display decorated stack
|
// Display decorated stack
|
||||||
ImGuiStackTool* tool = &g.DebugStackTool;
|
|
||||||
tool->LastActiveFrame = g.FrameCount;
|
tool->LastActiveFrame = g.FrameCount;
|
||||||
if (tool->Results.Size > 0 && BeginTable("##table", 3, ImGuiTableFlags_Borders))
|
if (tool->Results.Size > 0 && BeginTable("##table", 3, ImGuiTableFlags_Borders))
|
||||||
{
|
{
|
||||||
@ -13087,23 +13130,9 @@ void ImGui::ShowStackToolWindow(bool* p_open)
|
|||||||
ImGuiStackLevelInfo* info = &tool->Results[n];
|
ImGuiStackLevelInfo* info = &tool->Results[n];
|
||||||
TableNextColumn();
|
TableNextColumn();
|
||||||
Text("0x%08X", (n > 0) ? tool->Results[n - 1].ID : 0);
|
Text("0x%08X", (n > 0) ? tool->Results[n - 1].ID : 0);
|
||||||
|
|
||||||
TableNextColumn();
|
TableNextColumn();
|
||||||
ImGuiWindow* window = (info->Desc[0] == 0 && n == 0) ? FindWindowByID(info->ID) : NULL;
|
StackToolFormatLevelInfo(tool, n, true, g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer));
|
||||||
if (window) // Source: window name (because the root ID don't call GetID() and so doesn't get hooked)
|
TextUnformatted(g.TempBuffer);
|
||||||
Text("\"%s\" [window]", window->Name);
|
|
||||||
else if (info->QuerySuccess) // Source: GetID() hooks (prioritize over ItemInfo() because we frequently use patterns like: PushID(str), Button("") where they both have same id)
|
|
||||||
TextUnformatted(info->Desc);
|
|
||||||
else if (tool->StackLevel >= tool->Results.Size) // Only start using fallback below when all queries are done, so during queries we don't flickering ??? markers.
|
|
||||||
{
|
|
||||||
#ifdef IMGUI_ENABLE_TEST_ENGINE
|
|
||||||
if (const char* label = ImGuiTestEngine_FindItemDebugLabel(&g, info->ID)) // Source: ImGuiTestEngine's ItemInfo()
|
|
||||||
Text("??? \"%s\"", label);
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
TextUnformatted("???");
|
|
||||||
}
|
|
||||||
|
|
||||||
TableNextColumn();
|
TableNextColumn();
|
||||||
Text("0x%08X", info->ID);
|
Text("0x%08X", info->ID);
|
||||||
if (n == tool->Results.Size - 1)
|
if (n == tool->Results.Size - 1)
|
||||||
|
@ -1510,7 +1510,8 @@ struct ImGuiStackLevelInfo
|
|||||||
ImGuiID ID;
|
ImGuiID ID;
|
||||||
ImS8 QueryFrameCount; // >= 1: Query in progress
|
ImS8 QueryFrameCount; // >= 1: Query in progress
|
||||||
bool QuerySuccess; // Obtained result from DebugHookIdInfo()
|
bool QuerySuccess; // Obtained result from DebugHookIdInfo()
|
||||||
char Desc[58]; // Arbitrarily sized buffer to hold a result (FIXME: could replace Results[] with a chunk stream?)
|
ImGuiDataType DataType : 8;
|
||||||
|
char Desc[57]; // Arbitrarily sized buffer to hold a result (FIXME: could replace Results[] with a chunk stream?) FIXME: Now that we added CTRL+C this should be fixed.
|
||||||
|
|
||||||
ImGuiStackLevelInfo() { memset(this, 0, sizeof(*this)); }
|
ImGuiStackLevelInfo() { memset(this, 0, sizeof(*this)); }
|
||||||
};
|
};
|
||||||
@ -1522,8 +1523,10 @@ struct ImGuiStackTool
|
|||||||
int StackLevel; // -1: query stack and resize Results, >= 0: individual stack level
|
int StackLevel; // -1: query stack and resize Results, >= 0: individual stack level
|
||||||
ImGuiID QueryId; // ID to query details for
|
ImGuiID QueryId; // ID to query details for
|
||||||
ImVector<ImGuiStackLevelInfo> Results;
|
ImVector<ImGuiStackLevelInfo> Results;
|
||||||
|
bool CopyToClipboardOnCtrlC;
|
||||||
|
float CopyToClipboardLastTime;
|
||||||
|
|
||||||
ImGuiStackTool() { memset(this, 0, sizeof(*this)); }
|
ImGuiStackTool() { memset(this, 0, sizeof(*this)); CopyToClipboardLastTime = -FLT_MAX; }
|
||||||
};
|
};
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
Loading…
Reference in New Issue
Block a user