Debug: added encoding viewer in Metrics.

(reworked by omar from original/old commit)
This commit is contained in:
Adrien LPN 2021-06-17 19:58:50 +02:00 committed by ocornut
parent e66fc22057
commit e668890837

View File

@ -12127,6 +12127,81 @@ static void RenderViewportsThumbnails()
ImGui::Dummy(bb_full.GetSize() * SCALE); ImGui::Dummy(bb_full.GetSize() * SCALE);
} }
static void ShowEncodingViewerChar(ImFont* font, ImWchar c, const char* c_utf8)
{
ImGui::TableNextColumn();
if (font->FindGlyphNoFallback(c))
ImGui::TextUnformatted(c_utf8);
else
ImGui::TextColored(ImVec4(1.0f, 0.0f, 0.0f, 1.0f), "(not in font)");
ImGui::TableNextColumn();
char utf8_code[] = "0x.. 0x.. 0x.. 0x..";
for (int byte_index = 0; c_utf8[byte_index]; byte_index++)
{
if (byte_index > 0)
utf8_code[byte_index * 5 - 1] = ' ';
ImFormatString(utf8_code + (byte_index * 5) + 2, 3, "%02X", (int)(unsigned char)c_utf8[byte_index]);
}
ImGui::TextUnformatted(utf8_code);
ImGui::TableNextColumn();
ImGui::Text("U+%04X", (int)c);
}
static void ShowUTF8EncodingViewer()
{
static char buf[256] = "";
static ImFontGlyphRangesBuilder range_builder;
static ImVector<ImWchar> ranges;
static bool unique_glyphs = false;
ImGui::SetNextItemWidth(-FLT_MIN);
bool rebuild = false;
rebuild |= ImGui::InputText("##Sample Text", buf, IM_ARRAYSIZE(buf));
rebuild |= ImGui::Checkbox("Sorted unique glyphs", &unique_glyphs);
if (rebuild && unique_glyphs)
{
range_builder.Clear();
range_builder.AddText(buf);
ranges.clear();
range_builder.BuildRanges(&ranges);
}
if (ImGui::BeginTable("list", 3, ImGuiTableFlags_Borders | ImGuiTableFlags_ScrollY, ImVec2(0.0f, ImGui::GetFontSize() * 15)))
{
ImGui::TableSetupColumn("Glyph");
ImGui::TableSetupColumn("UTF-8");
ImGui::TableSetupColumn("Codepoint");
ImGui::TableHeadersRow();
ImFont* font = ImGui::GetFont();
if (unique_glyphs)
{
for (int range_index = 0; range_index < ranges.Size && ranges[range_index] != 0; range_index += 2)
for (ImWchar c = ranges[range_index]; c <= ranges[range_index + 1]; c++)
{
char c_utf8[4 + 1];
ImTextStrToUtf8(c_utf8, IM_ARRAYSIZE(c_utf8), &c, &c + 1);
ShowEncodingViewerChar(font, c, c_utf8);
}
}
else
{
for (const char* p = buf; p[0] != 0;)
{
unsigned int c;
int c_utf8_len = ImTextCharFromUtf8(&c, p, NULL);
char c_utf8[4 + 1];
memcpy(c_utf8, p, c_utf8_len);
c_utf8[c_utf8_len] = 0;
ShowEncodingViewerChar(font, (ImWchar)c, c_utf8);
p += c_utf8_len;
}
}
ImGui::EndTable();
}
}
// Avoid naming collision with imgui_demo.cpp's HelpMarker() for unity builds. // Avoid naming collision with imgui_demo.cpp's HelpMarker() for unity builds.
static void MetricsHelpMarker(const char* desc) static void MetricsHelpMarker(const char* desc)
{ {
@ -12285,6 +12360,12 @@ void ImGui::ShowMetricsWindow(bool* p_open)
} }
} }
if (TreeNode("UTF-8 Encoding viewer"))
{
ShowUTF8EncodingViewer();
TreePop();
}
// The Item Picker tool is super useful to visually select an item and break into the call-stack of where it was submitted. // The Item Picker tool is super useful to visually select an item and break into the call-stack of where it was submitted.
if (Button("Item Picker..")) if (Button("Item Picker.."))
DebugStartItemPicker(); DebugStartItemPicker();