|
|
@@ -1,4 +1,4 @@
|
|
|
-// dear imgui, v1.92.0 WIP
|
|
|
+// dear imgui, v1.92.5 WIP
|
|
|
// (demo code)
|
|
|
|
|
|
// Help:
|
|
|
@@ -576,14 +576,15 @@ void ImGui::ShowDemoWindow(bool* p_open)
|
|
|
ImGui::CheckboxFlags("io.BackendFlags: HasMouseCursors", &io.BackendFlags, ImGuiBackendFlags_HasMouseCursors);
|
|
|
ImGui::CheckboxFlags("io.BackendFlags: HasSetMousePos", &io.BackendFlags, ImGuiBackendFlags_HasSetMousePos);
|
|
|
ImGui::CheckboxFlags("io.BackendFlags: RendererHasVtxOffset", &io.BackendFlags, ImGuiBackendFlags_RendererHasVtxOffset);
|
|
|
+ ImGui::CheckboxFlags("io.BackendFlags: RendererHasTextures", &io.BackendFlags, ImGuiBackendFlags_RendererHasTextures);
|
|
|
ImGui::EndDisabled();
|
|
|
|
|
|
ImGui::TreePop();
|
|
|
ImGui::Spacing();
|
|
|
}
|
|
|
|
|
|
- IMGUI_DEMO_MARKER("Configuration/Style");
|
|
|
- if (ImGui::TreeNode("Style"))
|
|
|
+ IMGUI_DEMO_MARKER("Configuration/Style, Fonts");
|
|
|
+ if (ImGui::TreeNode("Style, Fonts"))
|
|
|
{
|
|
|
ImGui::Checkbox("Style Editor", &demo_data.ShowStyleEditor);
|
|
|
ImGui::SameLine();
|
|
|
@@ -841,6 +842,9 @@ static void DemoWindowWidgetsBasic()
|
|
|
ImGui::RadioButton("radio b", &e, 1); ImGui::SameLine();
|
|
|
ImGui::RadioButton("radio c", &e, 2);
|
|
|
|
|
|
+ ImGui::AlignTextToFramePadding();
|
|
|
+ ImGui::TextLinkOpenURL("Hyperlink", "https://github.com/ocornut/imgui/wiki/Error-Handling");
|
|
|
+
|
|
|
// Color buttons, demonstrate using PushID() to add unique identifier in the ID stack, and changing style.
|
|
|
IMGUI_DEMO_MARKER("Widgets/Basic/Buttons (Colored)");
|
|
|
for (int i = 0; i < 7; i++)
|
|
|
@@ -1744,6 +1748,7 @@ static void DemoWindowWidgetsFonts()
|
|
|
{
|
|
|
ImFontAtlas* atlas = ImGui::GetIO().Fonts;
|
|
|
ImGui::ShowFontAtlas(atlas);
|
|
|
+ // FIXME-NEWATLAS: Provide a demo to add/create a procedural font?
|
|
|
ImGui::TreePop();
|
|
|
}
|
|
|
}
|
|
|
@@ -1764,13 +1769,12 @@ static void DemoWindowWidgetsImages()
|
|
|
"Hover the texture for a zoomed view!");
|
|
|
|
|
|
// Below we are displaying the font texture because it is the only texture we have access to inside the demo!
|
|
|
- // Remember that ImTextureID is just storage for whatever you want it to be. It is essentially a value that
|
|
|
- // will be passed to the rendering backend via the ImDrawCmd structure.
|
|
|
+ // Read description about ImTextureID/ImTextureRef and FAQ for details about texture identifiers.
|
|
|
// If you use one of the default imgui_impl_XXXX.cpp rendering backend, they all have comments at the top
|
|
|
- // of their respective source file to specify what they expect to be stored in ImTextureID, for example:
|
|
|
- // - The imgui_impl_dx11.cpp renderer expect a 'ID3D11ShaderResourceView*' pointer
|
|
|
+ // of their respective source file to specify what they are using as texture identifier, for example:
|
|
|
+ // - The imgui_impl_dx11.cpp renderer expect a 'ID3D11ShaderResourceView*' pointer.
|
|
|
// - The imgui_impl_opengl3.cpp renderer expect a GLuint OpenGL texture identifier, etc.
|
|
|
- // More:
|
|
|
+ // So with the DirectX11 backend, you call ImGui::Image() with a 'ID3D11ShaderResourceView*' cast to ImTextureID.
|
|
|
// - If you decided that ImTextureID = MyEngineTexture*, then you can pass your MyEngineTexture* pointers
|
|
|
// to ImGui::Image(), and gather width/height through your own functions, etc.
|
|
|
// - You can use ShowMetricsWindow() to inspect the draw data that are being passed to your renderer,
|
|
|
@@ -1778,14 +1782,19 @@ static void DemoWindowWidgetsImages()
|
|
|
// - Consider using the lower-level ImDrawList::AddImage() API, via ImGui::GetWindowDrawList()->AddImage().
|
|
|
// - Read https://github.com/ocornut/imgui/blob/master/docs/FAQ.md
|
|
|
// - Read https://github.com/ocornut/imgui/wiki/Image-Loading-and-Displaying-Examples
|
|
|
- ImTextureID my_tex_id = io.Fonts->TexID;
|
|
|
- float my_tex_w = (float)io.Fonts->TexWidth;
|
|
|
- float my_tex_h = (float)io.Fonts->TexHeight;
|
|
|
+
|
|
|
+ // Grab the current texture identifier used by the font atlas.
|
|
|
+ ImTextureRef my_tex_id = io.Fonts->TexRef;
|
|
|
+
|
|
|
+ // Regular user code should never have to care about TexData-> fields, but since we want to display the entire texture here, we pull Width/Height from it.
|
|
|
+ float my_tex_w = (float)io.Fonts->TexData->Width;
|
|
|
+ float my_tex_h = (float)io.Fonts->TexData->Height;
|
|
|
+
|
|
|
{
|
|
|
ImGui::Text("%.0fx%.0f", my_tex_w, my_tex_h);
|
|
|
ImVec2 pos = ImGui::GetCursorScreenPos();
|
|
|
- ImVec2 uv_min = ImVec2(0.0f, 0.0f); // Top-left
|
|
|
- ImVec2 uv_max = ImVec2(1.0f, 1.0f); // Lower-right
|
|
|
+ ImVec2 uv_min = ImVec2(0.0f, 0.0f); // Top-left
|
|
|
+ ImVec2 uv_max = ImVec2(1.0f, 1.0f); // Lower-right
|
|
|
ImGui::PushStyleVar(ImGuiStyleVar_ImageBorderSize, IM_MAX(1.0f, ImGui::GetStyle().ImageBorderSize));
|
|
|
ImGui::ImageWithBg(my_tex_id, ImVec2(my_tex_w, my_tex_h), uv_min, uv_max, ImVec4(0.0f, 0.0f, 0.0f, 1.0f));
|
|
|
if (ImGui::BeginItemTooltip())
|
|
|
@@ -2161,7 +2170,7 @@ static void DemoWindowWidgetsQueryingStatuses()
|
|
|
);
|
|
|
ImGui::BulletText(
|
|
|
"with Hovering Delay or Stationary test:\n"
|
|
|
- "IsItemHovered() = = %d\n"
|
|
|
+ "IsItemHovered() = %d\n"
|
|
|
"IsItemHovered(_Stationary) = %d\n"
|
|
|
"IsItemHovered(_DelayShort) = %d\n"
|
|
|
"IsItemHovered(_DelayNormal) = %d\n"
|
|
|
@@ -2638,6 +2647,10 @@ static void DemoWindowWidgetsSelectionAndMultiSelect(ImGuiDemoWindowData* demo_d
|
|
|
{
|
|
|
HelpMarker("Selections can be built using Selectable(), TreeNode() or other widgets. Selection state is owned by application code/data.");
|
|
|
|
|
|
+ ImGui::BulletText("Wiki page:");
|
|
|
+ ImGui::SameLine();
|
|
|
+ ImGui::TextLinkOpenURL("imgui/wiki/Multi-Select", "https://github.com/ocornut/imgui/wiki/Multi-Select");
|
|
|
+
|
|
|
// Without any fancy API: manage single-selection yourself.
|
|
|
IMGUI_DEMO_MARKER("Widgets/Selection State/Single-Select");
|
|
|
if (ImGui::TreeNode("Single-Select"))
|
|
|
@@ -3171,6 +3184,7 @@ static void DemoWindowWidgetsSelectionAndMultiSelect(ImGuiDemoWindowData* demo_d
|
|
|
ImGui::CheckboxFlags("ImGuiMultiSelectFlags_NoAutoSelect", &flags, ImGuiMultiSelectFlags_NoAutoSelect);
|
|
|
ImGui::CheckboxFlags("ImGuiMultiSelectFlags_NoAutoClear", &flags, ImGuiMultiSelectFlags_NoAutoClear);
|
|
|
ImGui::CheckboxFlags("ImGuiMultiSelectFlags_NoAutoClearOnReselect", &flags, ImGuiMultiSelectFlags_NoAutoClearOnReselect);
|
|
|
+ ImGui::CheckboxFlags("ImGuiMultiSelectFlags_NoSelectOnRightClick", &flags, ImGuiMultiSelectFlags_NoSelectOnRightClick);
|
|
|
ImGui::CheckboxFlags("ImGuiMultiSelectFlags_BoxSelect1d", &flags, ImGuiMultiSelectFlags_BoxSelect1d);
|
|
|
ImGui::CheckboxFlags("ImGuiMultiSelectFlags_BoxSelect2d", &flags, ImGuiMultiSelectFlags_BoxSelect2d);
|
|
|
ImGui::CheckboxFlags("ImGuiMultiSelectFlags_BoxSelectNoScroll", &flags, ImGuiMultiSelectFlags_BoxSelectNoScroll);
|
|
|
@@ -3220,7 +3234,7 @@ static void DemoWindowWidgetsSelectionAndMultiSelect(ImGuiDemoWindowData* demo_d
|
|
|
ImGui::BeginTable("##Split", 2, ImGuiTableFlags_Resizable | ImGuiTableFlags_NoSavedSettings | ImGuiTableFlags_NoPadOuterX);
|
|
|
ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch, 0.70f);
|
|
|
ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthStretch, 0.30f);
|
|
|
- //ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacingY, 0.0f);
|
|
|
+ //ImGui::PushStyleVarY(ImGuiStyleVar_ItemSpacing, 0.0f);
|
|
|
}
|
|
|
|
|
|
ImGuiListClipper clipper;
|
|
|
@@ -3370,6 +3384,18 @@ static void DemoWindowWidgetsSelectionAndMultiSelect(ImGuiDemoWindowData* demo_d
|
|
|
// [SECTION] DemoWindowWidgetsTabs()
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
+static void EditTabBarFittingPolicyFlags(ImGuiTabBarFlags* p_flags)
|
|
|
+{
|
|
|
+ if ((*p_flags & ImGuiTabBarFlags_FittingPolicyMask_) == 0)
|
|
|
+ *p_flags |= ImGuiTabBarFlags_FittingPolicyDefault_;
|
|
|
+ if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyMixed", p_flags, ImGuiTabBarFlags_FittingPolicyMixed))
|
|
|
+ *p_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyMixed);
|
|
|
+ if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyShrink", p_flags, ImGuiTabBarFlags_FittingPolicyShrink))
|
|
|
+ *p_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyShrink);
|
|
|
+ if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyScroll", p_flags, ImGuiTabBarFlags_FittingPolicyScroll))
|
|
|
+ *p_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyScroll);
|
|
|
+}
|
|
|
+
|
|
|
static void DemoWindowWidgetsTabs()
|
|
|
{
|
|
|
IMGUI_DEMO_MARKER("Widgets/Tabs");
|
|
|
@@ -3412,12 +3438,7 @@ static void DemoWindowWidgetsTabs()
|
|
|
ImGui::CheckboxFlags("ImGuiTabBarFlags_TabListPopupButton", &tab_bar_flags, ImGuiTabBarFlags_TabListPopupButton);
|
|
|
ImGui::CheckboxFlags("ImGuiTabBarFlags_NoCloseWithMiddleMouseButton", &tab_bar_flags, ImGuiTabBarFlags_NoCloseWithMiddleMouseButton);
|
|
|
ImGui::CheckboxFlags("ImGuiTabBarFlags_DrawSelectedOverline", &tab_bar_flags, ImGuiTabBarFlags_DrawSelectedOverline);
|
|
|
- if ((tab_bar_flags & ImGuiTabBarFlags_FittingPolicyMask_) == 0)
|
|
|
- tab_bar_flags |= ImGuiTabBarFlags_FittingPolicyDefault_;
|
|
|
- if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyResizeDown", &tab_bar_flags, ImGuiTabBarFlags_FittingPolicyResizeDown))
|
|
|
- tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyResizeDown);
|
|
|
- if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyScroll", &tab_bar_flags, ImGuiTabBarFlags_FittingPolicyScroll))
|
|
|
- tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyScroll);
|
|
|
+ EditTabBarFittingPolicyFlags(&tab_bar_flags);
|
|
|
|
|
|
// Tab Bar
|
|
|
ImGui::AlignTextToFramePadding();
|
|
|
@@ -3466,12 +3487,8 @@ static void DemoWindowWidgetsTabs()
|
|
|
ImGui::Checkbox("Show Trailing TabItemButton()", &show_trailing_button);
|
|
|
|
|
|
// Expose some other flags which are useful to showcase how they interact with Leading/Trailing tabs
|
|
|
- static ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_AutoSelectNewTabs | ImGuiTabBarFlags_Reorderable | ImGuiTabBarFlags_FittingPolicyResizeDown;
|
|
|
- ImGui::CheckboxFlags("ImGuiTabBarFlags_TabListPopupButton", &tab_bar_flags, ImGuiTabBarFlags_TabListPopupButton);
|
|
|
- if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyResizeDown", &tab_bar_flags, ImGuiTabBarFlags_FittingPolicyResizeDown))
|
|
|
- tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyResizeDown);
|
|
|
- if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyScroll", &tab_bar_flags, ImGuiTabBarFlags_FittingPolicyScroll))
|
|
|
- tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyScroll);
|
|
|
+ static ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_AutoSelectNewTabs | ImGuiTabBarFlags_Reorderable | ImGuiTabBarFlags_FittingPolicyShrink;
|
|
|
+ EditTabBarFittingPolicyFlags(&tab_bar_flags);
|
|
|
|
|
|
if (ImGui::BeginTabBar("MyTabBar", tab_bar_flags))
|
|
|
{
|
|
|
@@ -3539,6 +3556,43 @@ static void DemoWindowWidgetsText()
|
|
|
ImGui::TreePop();
|
|
|
}
|
|
|
|
|
|
+ IMGUI_DEMO_MARKER("Widgets/Text/Font Size");
|
|
|
+ if (ImGui::TreeNode("Font Size"))
|
|
|
+ {
|
|
|
+ ImGuiStyle& style = ImGui::GetStyle();
|
|
|
+ const float global_scale = style.FontScaleMain * style.FontScaleDpi;
|
|
|
+ ImGui::Text("style.FontScaleMain = %0.2f", style.FontScaleMain);
|
|
|
+ ImGui::Text("style.FontScaleDpi = %0.2f", style.FontScaleDpi);
|
|
|
+ ImGui::Text("global_scale = ~%0.2f", global_scale); // This is not technically accurate as internal scales may apply, but conceptually let's pretend it is.
|
|
|
+ ImGui::Text("FontSize = %0.2f", ImGui::GetFontSize());
|
|
|
+
|
|
|
+ ImGui::SeparatorText("");
|
|
|
+ static float custom_size = 16.0f;
|
|
|
+ ImGui::SliderFloat("custom_size", &custom_size, 10.0f, 100.0f, "%.0f");
|
|
|
+ ImGui::Text("ImGui::PushFont(nullptr, custom_size);");
|
|
|
+ ImGui::PushFont(NULL, custom_size);
|
|
|
+ ImGui::Text("FontSize = %.2f (== %.2f * global_scale)", ImGui::GetFontSize(), custom_size);
|
|
|
+ ImGui::PopFont();
|
|
|
+
|
|
|
+ ImGui::SeparatorText("");
|
|
|
+ static float custom_scale = 1.0f;
|
|
|
+ ImGui::SliderFloat("custom_scale", &custom_scale, 0.5f, 4.0f, "%.2f");
|
|
|
+ ImGui::Text("ImGui::PushFont(nullptr, style.FontSizeBase * custom_scale);");
|
|
|
+ ImGui::PushFont(NULL, style.FontSizeBase * custom_scale);
|
|
|
+ ImGui::Text("FontSize = %.2f (== style.FontSizeBase * %.2f * global_scale)", ImGui::GetFontSize(), custom_scale);
|
|
|
+ ImGui::PopFont();
|
|
|
+
|
|
|
+ ImGui::SeparatorText("");
|
|
|
+ for (float scaling = 0.5f; scaling <= 4.0f; scaling += 0.5f)
|
|
|
+ {
|
|
|
+ ImGui::PushFont(NULL, style.FontSizeBase * scaling);
|
|
|
+ ImGui::Text("FontSize = %.2f (== style.FontSizeBase * %.2f * global_scale)", ImGui::GetFontSize(), scaling);
|
|
|
+ ImGui::PopFont();
|
|
|
+ }
|
|
|
+
|
|
|
+ ImGui::TreePop();
|
|
|
+ }
|
|
|
+
|
|
|
IMGUI_DEMO_MARKER("Widgets/Text/Word Wrapping");
|
|
|
if (ImGui::TreeNode("Word Wrapping"))
|
|
|
{
|
|
|
@@ -3659,6 +3713,8 @@ static void DemoWindowWidgetsTextInput()
|
|
|
static ImGuiInputTextFlags flags = ImGuiInputTextFlags_AllowTabInput;
|
|
|
HelpMarker("You can use the ImGuiInputTextFlags_CallbackResize facility if you need to wire InputTextMultiline() to a dynamic string type. See misc/cpp/imgui_stdlib.h for an example. (This is not demonstrated in imgui_demo.cpp because we don't want to include <string> in here)");
|
|
|
ImGui::CheckboxFlags("ImGuiInputTextFlags_ReadOnly", &flags, ImGuiInputTextFlags_ReadOnly);
|
|
|
+ ImGui::CheckboxFlags("ImGuiInputTextFlags_WordWrap", &flags, ImGuiInputTextFlags_WordWrap);
|
|
|
+ ImGui::SameLine(); HelpMarker("Feature is currently in Beta. Please read comments in imgui.h");
|
|
|
ImGui::CheckboxFlags("ImGuiInputTextFlags_AllowTabInput", &flags, ImGuiInputTextFlags_AllowTabInput);
|
|
|
ImGui::SameLine(); HelpMarker("When _AllowTabInput is set, passing through the widget with Tabbing doesn't automatically activate it, in order to also cycling through subsequent widgets.");
|
|
|
ImGui::CheckboxFlags("ImGuiInputTextFlags_CtrlEnterForNewLine", &flags, ImGuiInputTextFlags_CtrlEnterForNewLine);
|
|
|
@@ -3806,10 +3862,13 @@ static void DemoWindowWidgetsTextInput()
|
|
|
// For this demo we are using ImVector as a string container.
|
|
|
// Note that because we need to store a terminating zero character, our size/capacity are 1 more
|
|
|
// than usually reported by a typical string class.
|
|
|
+ static ImGuiInputTextFlags flags = ImGuiInputTextFlags_None;
|
|
|
+ ImGui::CheckboxFlags("ImGuiInputTextFlags_WordWrap", &flags, ImGuiInputTextFlags_WordWrap);
|
|
|
+
|
|
|
static ImVector<char> my_str;
|
|
|
if (my_str.empty())
|
|
|
my_str.push_back(0);
|
|
|
- Funcs::MyInputTextMultiline("##MyStr", &my_str, ImVec2(-FLT_MIN, ImGui::GetTextLineHeight() * 16));
|
|
|
+ Funcs::MyInputTextMultiline("##MyStr", &my_str, ImVec2(-FLT_MIN, ImGui::GetTextLineHeight() * 16), flags);
|
|
|
ImGui::Text("Data: %p\nSize: %d\nCapacity: %d", (void*)my_str.begin(), my_str.size(), my_str.capacity());
|
|
|
ImGui::TreePop();
|
|
|
}
|
|
|
@@ -4438,11 +4497,11 @@ static void DemoWindowLayout()
|
|
|
|
|
|
ImGui::Text("SetNextItemWidth/PushItemWidth(-Min(GetContentRegionAvail().x * 0.40f, GetFontSize() * 12))");
|
|
|
ImGui::PushItemWidth(-IM_MIN(ImGui::GetFontSize() * 12, ImGui::GetContentRegionAvail().x * 0.40f));
|
|
|
- ImGui::DragFloat("float##4a", &f);
|
|
|
+ ImGui::DragFloat("float##5a", &f);
|
|
|
if (show_indented_items)
|
|
|
{
|
|
|
ImGui::Indent();
|
|
|
- ImGui::DragFloat("float (indented)##4b", &f);
|
|
|
+ ImGui::DragFloat("float (indented)##5b", &f);
|
|
|
ImGui::Unindent();
|
|
|
}
|
|
|
ImGui::PopItemWidth();
|
|
|
@@ -4452,11 +4511,11 @@ static void DemoWindowLayout()
|
|
|
ImGui::Text("SetNextItemWidth/PushItemWidth(-FLT_MIN)");
|
|
|
ImGui::SameLine(); HelpMarker("Align to right edge");
|
|
|
ImGui::PushItemWidth(-FLT_MIN);
|
|
|
- ImGui::DragFloat("##float5a", &f);
|
|
|
+ ImGui::DragFloat("##float6a", &f);
|
|
|
if (show_indented_items)
|
|
|
{
|
|
|
ImGui::Indent();
|
|
|
- ImGui::DragFloat("float (indented)##5b", &f);
|
|
|
+ ImGui::DragFloat("float (indented)##6b", &f);
|
|
|
ImGui::Unindent();
|
|
|
}
|
|
|
ImGui::PopItemWidth();
|
|
|
@@ -4741,15 +4800,18 @@ static void DemoWindowLayout()
|
|
|
|
|
|
ImGui::Checkbox("Decoration", &enable_extra_decorations);
|
|
|
|
|
|
+ ImGui::PushItemWidth(ImGui::GetFontSize() * 10);
|
|
|
+ enable_track |= ImGui::DragInt("##item", &track_item, 0.25f, 0, 99, "Item = %d");
|
|
|
+ ImGui::SameLine();
|
|
|
ImGui::Checkbox("Track", &enable_track);
|
|
|
- ImGui::PushItemWidth(100);
|
|
|
- ImGui::SameLine(140); enable_track |= ImGui::DragInt("##item", &track_item, 0.25f, 0, 99, "Item = %d");
|
|
|
|
|
|
- bool scroll_to_off = ImGui::Button("Scroll Offset");
|
|
|
- ImGui::SameLine(140); scroll_to_off |= ImGui::DragFloat("##off", &scroll_to_off_px, 1.00f, 0, FLT_MAX, "+%.0f px");
|
|
|
+ bool scroll_to_off = ImGui::DragFloat("##off", &scroll_to_off_px, 1.00f, 0, FLT_MAX, "+%.0f px");
|
|
|
+ ImGui::SameLine();
|
|
|
+ scroll_to_off |= ImGui::Button("Scroll Offset");
|
|
|
|
|
|
- bool scroll_to_pos = ImGui::Button("Scroll To Pos");
|
|
|
- ImGui::SameLine(140); scroll_to_pos |= ImGui::DragFloat("##pos", &scroll_to_pos_px, 1.00f, -10, FLT_MAX, "X/Y = %.0f px");
|
|
|
+ bool scroll_to_pos = ImGui::DragFloat("##pos", &scroll_to_pos_px, 1.00f, -10, FLT_MAX, "X/Y = %.0f px");
|
|
|
+ ImGui::SameLine();
|
|
|
+ scroll_to_pos |= ImGui::Button("Scroll To Pos");
|
|
|
ImGui::PopItemWidth();
|
|
|
|
|
|
if (scroll_to_off || scroll_to_pos)
|
|
|
@@ -5133,7 +5195,7 @@ static void DemoWindowPopups()
|
|
|
// Typical use for regular windows:
|
|
|
// bool my_tool_is_active = false; if (ImGui::Button("Open")) my_tool_is_active = true; [...] if (my_tool_is_active) Begin("My Tool", &my_tool_is_active) { [...] } End();
|
|
|
// Typical use for popups:
|
|
|
- // if (ImGui::Button("Open")) ImGui::OpenPopup("MyPopup"); if (ImGui::BeginPopup("MyPopup") { [...] EndPopup(); }
|
|
|
+ // if (ImGui::Button("Open")) ImGui::OpenPopup("MyPopup"); if (ImGui::BeginPopup("MyPopup")) { [...] EndPopup(); }
|
|
|
|
|
|
// With popups we have to go through a library call (here OpenPopup) to manipulate the visibility state.
|
|
|
// This may be a bit confusing at first but it should quickly make sense. Follow on the examples below.
|
|
|
@@ -5719,7 +5781,7 @@ static void DemoWindowTables()
|
|
|
ImGui::SameLine(); ImGui::RadioButton("Text", &contents_type, CT_Text);
|
|
|
ImGui::SameLine(); ImGui::RadioButton("FillButton", &contents_type, CT_FillButton);
|
|
|
ImGui::Checkbox("Display headers", &display_headers);
|
|
|
- ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBody", &flags, ImGuiTableFlags_NoBordersInBody); ImGui::SameLine(); HelpMarker("Disable vertical borders in columns Body (borders will always appear in Headers");
|
|
|
+ ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBody", &flags, ImGuiTableFlags_NoBordersInBody); ImGui::SameLine(); HelpMarker("Disable vertical borders in columns Body (borders will always appear in Headers)");
|
|
|
PopStyleCompact();
|
|
|
|
|
|
if (ImGui::BeginTable("table1", 3, flags))
|
|
|
@@ -7212,7 +7274,7 @@ static void DemoWindowTables()
|
|
|
ImGui::CheckboxFlags("ImGuiTableFlags_BordersH", &flags, ImGuiTableFlags_BordersH);
|
|
|
ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuterH", &flags, ImGuiTableFlags_BordersOuterH);
|
|
|
ImGui::CheckboxFlags("ImGuiTableFlags_BordersInnerH", &flags, ImGuiTableFlags_BordersInnerH);
|
|
|
- ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBody", &flags, ImGuiTableFlags_NoBordersInBody); ImGui::SameLine(); HelpMarker("Disable vertical borders in columns Body (borders will always appear in Headers");
|
|
|
+ ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBody", &flags, ImGuiTableFlags_NoBordersInBody); ImGui::SameLine(); HelpMarker("Disable vertical borders in columns Body (borders will always appear in Headers)");
|
|
|
ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBodyUntilResize", &flags, ImGuiTableFlags_NoBordersInBodyUntilResize); ImGui::SameLine(); HelpMarker("Disable vertical borders in columns Body until hovered for resize (borders will always appear in Headers)");
|
|
|
ImGui::TreePop();
|
|
|
}
|
|
|
@@ -8018,6 +8080,8 @@ void ImGui::ShowAboutWindow(bool* p_open)
|
|
|
ImGui::SameLine();
|
|
|
ImGui::TextLinkOpenURL("Wiki", "https://github.com/ocornut/imgui/wiki");
|
|
|
ImGui::SameLine();
|
|
|
+ ImGui::TextLinkOpenURL("Extensions", "https://github.com/ocornut/imgui/wiki/Useful-Extensions");
|
|
|
+ ImGui::SameLine();
|
|
|
ImGui::TextLinkOpenURL("Releases", "https://github.com/ocornut/imgui/releases");
|
|
|
ImGui::SameLine();
|
|
|
ImGui::TextLinkOpenURL("Funding", "https://github.com/ocornut/imgui/wiki/Funding");
|
|
|
@@ -8041,13 +8105,16 @@ void ImGui::ShowAboutWindow(bool* p_open)
|
|
|
if (copy_to_clipboard)
|
|
|
{
|
|
|
ImGui::LogToClipboard();
|
|
|
- ImGui::LogText("```\n"); // Back quotes will make text appears without formatting when pasting on GitHub
|
|
|
+ ImGui::LogText("```cpp\n"); // Back quotes will make text appears without formatting when pasting on GitHub
|
|
|
}
|
|
|
|
|
|
ImGui::Text("Dear ImGui %s (%d)", IMGUI_VERSION, IMGUI_VERSION_NUM);
|
|
|
ImGui::Separator();
|
|
|
ImGui::Text("sizeof(size_t): %d, sizeof(ImDrawIdx): %d, sizeof(ImDrawVert): %d", (int)sizeof(size_t), (int)sizeof(ImDrawIdx), (int)sizeof(ImDrawVert));
|
|
|
ImGui::Text("define: __cplusplus=%d", (int)__cplusplus);
|
|
|
+#ifdef IMGUI_ENABLE_TEST_ENGINE
|
|
|
+ ImGui::Text("define: IMGUI_ENABLE_TEST_ENGINE");
|
|
|
+#endif
|
|
|
#ifdef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
|
|
|
ImGui::Text("define: IMGUI_DISABLE_OBSOLETE_FUNCTIONS");
|
|
|
#endif
|
|
|
@@ -8137,8 +8204,10 @@ void ImGui::ShowAboutWindow(bool* p_open)
|
|
|
if (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) ImGui::Text(" HasMouseCursors");
|
|
|
if (io.BackendFlags & ImGuiBackendFlags_HasSetMousePos) ImGui::Text(" HasSetMousePos");
|
|
|
if (io.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset) ImGui::Text(" RendererHasVtxOffset");
|
|
|
+ if (io.BackendFlags & ImGuiBackendFlags_RendererHasTextures) ImGui::Text(" RendererHasTextures");
|
|
|
ImGui::Separator();
|
|
|
- ImGui::Text("io.Fonts: %d fonts, Flags: 0x%08X, TexSize: %d,%d", io.Fonts->Fonts.Size, io.Fonts->Flags, io.Fonts->TexWidth, io.Fonts->TexHeight);
|
|
|
+ ImGui::Text("io.Fonts: %d fonts, Flags: 0x%08X, TexSize: %d,%d", io.Fonts->Fonts.Size, io.Fonts->Flags, io.Fonts->TexData->Width, io.Fonts->TexData->Height);
|
|
|
+ ImGui::Text("io.Fonts->FontLoaderName: %s", io.Fonts->FontLoaderName ? io.Fonts->FontLoaderName : "NULL");
|
|
|
ImGui::Text("io.DisplaySize: %.2f,%.2f", io.DisplaySize.x, io.DisplaySize.y);
|
|
|
ImGui::Text("io.DisplayFramebufferScale: %.2f,%.2f", io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y);
|
|
|
ImGui::Separator();
|
|
|
@@ -8163,58 +8232,39 @@ void ImGui::ShowAboutWindow(bool* p_open)
|
|
|
//-----------------------------------------------------------------------------
|
|
|
// [SECTION] Style Editor / ShowStyleEditor()
|
|
|
//-----------------------------------------------------------------------------
|
|
|
-// - ShowFontSelector()
|
|
|
// - ShowStyleSelector()
|
|
|
// - ShowStyleEditor()
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
-// Forward declare ShowFontAtlas() which isn't worth putting in public API yet
|
|
|
-namespace ImGui { IMGUI_API void ShowFontAtlas(ImFontAtlas* atlas); }
|
|
|
-
|
|
|
-// Demo helper function to select among loaded fonts.
|
|
|
-// Here we use the regular BeginCombo()/EndCombo() api which is the more flexible one.
|
|
|
-void ImGui::ShowFontSelector(const char* label)
|
|
|
-{
|
|
|
- ImGuiIO& io = ImGui::GetIO();
|
|
|
- ImFont* font_current = ImGui::GetFont();
|
|
|
- if (ImGui::BeginCombo(label, font_current->GetDebugName()))
|
|
|
- {
|
|
|
- for (ImFont* font : io.Fonts->Fonts)
|
|
|
- {
|
|
|
- ImGui::PushID((void*)font);
|
|
|
- if (ImGui::Selectable(font->GetDebugName(), font == font_current))
|
|
|
- io.FontDefault = font;
|
|
|
- if (font == font_current)
|
|
|
- ImGui::SetItemDefaultFocus();
|
|
|
- ImGui::PopID();
|
|
|
- }
|
|
|
- ImGui::EndCombo();
|
|
|
- }
|
|
|
- ImGui::SameLine();
|
|
|
- HelpMarker(
|
|
|
- "- Load additional fonts with io.Fonts->AddFontFromFileTTF().\n"
|
|
|
- "- The font atlas is built when calling io.Fonts->GetTexDataAsXXXX() or io.Fonts->Build().\n"
|
|
|
- "- Read FAQ and docs/FONTS.md for more details.\n"
|
|
|
- "- If you need to add/remove fonts at runtime (e.g. for DPI change), do it before calling NewFrame().");
|
|
|
-}
|
|
|
-
|
|
|
// Demo helper function to select among default colors. See ShowStyleEditor() for more advanced options.
|
|
|
-// Here we use the simplified Combo() api that packs items into a single literal string.
|
|
|
-// Useful for quick combo boxes where the choices are known locally.
|
|
|
bool ImGui::ShowStyleSelector(const char* label)
|
|
|
{
|
|
|
+ // FIXME: This is a bit tricky to get right as style are functions, they don't register a name nor the fact that one is active.
|
|
|
+ // So we keep track of last active one among our limited selection.
|
|
|
static int style_idx = -1;
|
|
|
- if (ImGui::Combo(label, &style_idx, "Dark\0Light\0Classic\0"))
|
|
|
+ const char* style_names[] = { "Dark", "Light", "Classic" };
|
|
|
+ bool ret = false;
|
|
|
+ if (ImGui::BeginCombo(label, (style_idx >= 0 && style_idx < IM_ARRAYSIZE(style_names)) ? style_names[style_idx] : ""))
|
|
|
{
|
|
|
- switch (style_idx)
|
|
|
+ for (int n = 0; n < IM_ARRAYSIZE(style_names); n++)
|
|
|
{
|
|
|
- case 0: ImGui::StyleColorsDark(); break;
|
|
|
- case 1: ImGui::StyleColorsLight(); break;
|
|
|
- case 2: ImGui::StyleColorsClassic(); break;
|
|
|
+ if (ImGui::Selectable(style_names[n], style_idx == n, ImGuiSelectableFlags_SelectOnNav))
|
|
|
+ {
|
|
|
+ style_idx = n;
|
|
|
+ ret = true;
|
|
|
+ switch (style_idx)
|
|
|
+ {
|
|
|
+ case 0: ImGui::StyleColorsDark(); break;
|
|
|
+ case 1: ImGui::StyleColorsLight(); break;
|
|
|
+ case 2: ImGui::StyleColorsClassic(); break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (style_idx == n)
|
|
|
+ ImGui::SetItemDefaultFocus();
|
|
|
}
|
|
|
- return true;
|
|
|
+ ImGui::EndCombo();
|
|
|
}
|
|
|
- return false;
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
static const char* GetTreeLinesFlagsName(ImGuiTreeNodeFlags flags)
|
|
|
@@ -8246,9 +8296,26 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref)
|
|
|
|
|
|
{
|
|
|
// General
|
|
|
+ SeparatorText("General");
|
|
|
+ if ((GetIO().BackendFlags & ImGuiBackendFlags_RendererHasTextures) == 0)
|
|
|
+ {
|
|
|
+ BulletText("Warning: Font scaling will NOT be smooth, because\nImGuiBackendFlags_RendererHasTextures is not set!");
|
|
|
+ BulletText("For instructions, see:");
|
|
|
+ SameLine();
|
|
|
+ TextLinkOpenURL("docs/BACKENDS.md", "https://github.com/ocornut/imgui/blob/master/docs/BACKENDS.md");
|
|
|
+ }
|
|
|
+
|
|
|
if (ShowStyleSelector("Colors##Selector"))
|
|
|
ref_saved_style = style;
|
|
|
ShowFontSelector("Fonts##Selector");
|
|
|
+ if (DragFloat("FontSizeBase", &style.FontSizeBase, 0.20f, 5.0f, 100.0f, "%.0f"))
|
|
|
+ style._NextFrameFontSizeBase = style.FontSizeBase; // FIXME: Temporary hack until we finish remaining work.
|
|
|
+ SameLine(0.0f, 0.0f); Text(" (out %.2f)", GetFontSize());
|
|
|
+ DragFloat("FontScaleMain", &style.FontScaleMain, 0.02f, 0.5f, 4.0f);
|
|
|
+ //BeginDisabled(GetIO().ConfigDpiScaleFonts);
|
|
|
+ DragFloat("FontScaleDpi", &style.FontScaleDpi, 0.02f, 0.5f, 4.0f);
|
|
|
+ //SetItemTooltip("When io.ConfigDpiScaleFonts is set, this value is automatically overwritten.");
|
|
|
+ //EndDisabled();
|
|
|
|
|
|
// Simplified Settings (expose floating-pointer border sizes as boolean representing 0.0f or 1.0f)
|
|
|
if (SliderFloat("FrameRounding", &style.FrameRounding, 0.0f, 12.0f, "%.0f"))
|
|
|
@@ -8271,8 +8338,7 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref)
|
|
|
"Save/Revert in local non-persistent storage. Default Colors definition are not affected. "
|
|
|
"Use \"Export\" below to save them somewhere.");
|
|
|
|
|
|
- Separator();
|
|
|
-
|
|
|
+ SeparatorText("Details");
|
|
|
if (BeginTabBar("##tabs", ImGuiTabBarFlags_None))
|
|
|
{
|
|
|
if (BeginTabItem("Sizes"))
|
|
|
@@ -8284,7 +8350,6 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref)
|
|
|
SliderFloat2("ItemInnerSpacing", (float*)&style.ItemInnerSpacing, 0.0f, 20.0f, "%.0f");
|
|
|
SliderFloat2("TouchExtraPadding", (float*)&style.TouchExtraPadding, 0.0f, 10.0f, "%.0f");
|
|
|
SliderFloat("IndentSpacing", &style.IndentSpacing, 0.0f, 30.0f, "%.0f");
|
|
|
- SliderFloat("ScrollbarSize", &style.ScrollbarSize, 1.0f, 20.0f, "%.0f");
|
|
|
SliderFloat("GrabMinSize", &style.GrabMinSize, 1.0f, 20.0f, "%.0f");
|
|
|
|
|
|
SeparatorText("Borders");
|
|
|
@@ -8298,16 +8363,22 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref)
|
|
|
SliderFloat("ChildRounding", &style.ChildRounding, 0.0f, 12.0f, "%.0f");
|
|
|
SliderFloat("FrameRounding", &style.FrameRounding, 0.0f, 12.0f, "%.0f");
|
|
|
SliderFloat("PopupRounding", &style.PopupRounding, 0.0f, 12.0f, "%.0f");
|
|
|
- SliderFloat("ScrollbarRounding", &style.ScrollbarRounding, 0.0f, 12.0f, "%.0f");
|
|
|
SliderFloat("GrabRounding", &style.GrabRounding, 0.0f, 12.0f, "%.0f");
|
|
|
|
|
|
+ SeparatorText("Scrollbar");
|
|
|
+ SliderFloat("ScrollbarSize", &style.ScrollbarSize, 1.0f, 20.0f, "%.0f");
|
|
|
+ SliderFloat("ScrollbarRounding", &style.ScrollbarRounding, 0.0f, 12.0f, "%.0f");
|
|
|
+ SliderFloat("ScrollbarPadding", &style.ScrollbarPadding, 0.0f, 10.0f, "%.0f");
|
|
|
+
|
|
|
SeparatorText("Tabs");
|
|
|
SliderFloat("TabBorderSize", &style.TabBorderSize, 0.0f, 1.0f, "%.0f");
|
|
|
SliderFloat("TabBarBorderSize", &style.TabBarBorderSize, 0.0f, 2.0f, "%.0f");
|
|
|
SliderFloat("TabBarOverlineSize", &style.TabBarOverlineSize, 0.0f, 3.0f, "%.0f");
|
|
|
SameLine(); HelpMarker("Overline is only drawn over the selected tab when ImGuiTabBarFlags_DrawSelectedOverline is set.");
|
|
|
- DragFloat("TabCloseButtonMinWidthSelected", &style.TabCloseButtonMinWidthSelected, 0.1f, -1.0f, 100.0f, (style.TabCloseButtonMinWidthSelected < 0.0f) ? "%.0f (Always)" : "%.0f");
|
|
|
- DragFloat("TabCloseButtonMinWidthUnselected", &style.TabCloseButtonMinWidthUnselected, 0.1f, -1.0f, 100.0f, (style.TabCloseButtonMinWidthUnselected < 0.0f) ? "%.0f (Always)" : "%.0f");
|
|
|
+ DragFloat("TabMinWidthBase", &style.TabMinWidthBase, 0.5f, 1.0f, 500.0f, "%.0f");
|
|
|
+ DragFloat("TabMinWidthShrink", &style.TabMinWidthShrink, 0.5f, 1.0f, 500.0f, "%0.f");
|
|
|
+ DragFloat("TabCloseButtonMinWidthSelected", &style.TabCloseButtonMinWidthSelected, 0.5f, -1.0f, 100.0f, (style.TabCloseButtonMinWidthSelected < 0.0f) ? "%.0f (Always)" : "%.0f");
|
|
|
+ DragFloat("TabCloseButtonMinWidthUnselected", &style.TabCloseButtonMinWidthUnselected, 0.5f, -1.0f, 100.0f, (style.TabCloseButtonMinWidthUnselected < 0.0f) ? "%.0f (Always)" : "%.0f");
|
|
|
SliderFloat("TabRounding", &style.TabRounding, 0.0f, 12.0f, "%.0f");
|
|
|
|
|
|
SeparatorText("Tables");
|
|
|
@@ -8443,11 +8514,12 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref)
|
|
|
{
|
|
|
ImGuiIO& io = GetIO();
|
|
|
ImFontAtlas* atlas = io.Fonts;
|
|
|
- HelpMarker("Read FAQ and docs/FONTS.md for details on font loading.");
|
|
|
ShowFontAtlas(atlas);
|
|
|
|
|
|
// Post-baking font scaling. Note that this is NOT the nice way of scaling fonts, read below.
|
|
|
// (we enforce hard clamping manually as by default DragFloat/SliderFloat allows CTRL+Click text to get out of bounds).
|
|
|
+ /*
|
|
|
+ SeparatorText("Legacy Scaling");
|
|
|
const float MIN_SCALE = 0.3f;
|
|
|
const float MAX_SCALE = 2.0f;
|
|
|
HelpMarker(
|
|
|
@@ -8455,12 +8527,13 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref)
|
|
|
"However, the _correct_ way of scaling your UI is currently to reload your font at the designed size, "
|
|
|
"rebuild the font atlas, and call style.ScaleAllSizes() on a reference ImGuiStyle structure.\n"
|
|
|
"Using those settings here will give you poor quality results.");
|
|
|
- static float window_scale = 1.0f;
|
|
|
PushItemWidth(GetFontSize() * 8);
|
|
|
- if (DragFloat("window scale", &window_scale, 0.005f, MIN_SCALE, MAX_SCALE, "%.2f", ImGuiSliderFlags_AlwaysClamp)) // Scale only this window
|
|
|
- SetWindowFontScale(window_scale);
|
|
|
DragFloat("global scale", &io.FontGlobalScale, 0.005f, MIN_SCALE, MAX_SCALE, "%.2f", ImGuiSliderFlags_AlwaysClamp); // Scale everything
|
|
|
+ //static float window_scale = 1.0f;
|
|
|
+ //if (DragFloat("window scale", &window_scale, 0.005f, MIN_SCALE, MAX_SCALE, "%.2f", ImGuiSliderFlags_AlwaysClamp)) // Scale only this window
|
|
|
+ // SetWindowFontScale(window_scale);
|
|
|
PopItemWidth();
|
|
|
+ */
|
|
|
|
|
|
EndTabItem();
|
|
|
}
|
|
|
@@ -9240,10 +9313,9 @@ static void ShowExampleAppLayout(bool* p_open)
|
|
|
ImGui::BeginChild("left pane", ImVec2(150, 0), ImGuiChildFlags_Borders | ImGuiChildFlags_ResizeX);
|
|
|
for (int i = 0; i < 100; i++)
|
|
|
{
|
|
|
- // FIXME: Good candidate to use ImGuiSelectableFlags_SelectOnNav
|
|
|
char label[128];
|
|
|
sprintf(label, "MyObject %d", i);
|
|
|
- if (ImGui::Selectable(label, selected == i))
|
|
|
+ if (ImGui::Selectable(label, selected == i, ImGuiSelectableFlags_SelectOnNav))
|
|
|
selected = i;
|
|
|
}
|
|
|
ImGui::EndChild();
|
|
|
@@ -9595,7 +9667,7 @@ static void ShowExampleAppConstrainedResize(bool* p_open)
|
|
|
IMGUI_DEMO_MARKER("Examples/Constrained Resizing window");
|
|
|
if (ImGui::GetIO().KeyShift)
|
|
|
{
|
|
|
- // Display a dummy viewport (in your real app you would likely use ImageButton() to display a texture.
|
|
|
+ // Display a dummy viewport (in your real app you would likely use ImageButton() to display a texture)
|
|
|
ImVec2 avail_size = ImGui::GetContentRegionAvail();
|
|
|
ImVec2 pos = ImGui::GetCursorScreenPos();
|
|
|
ImGui::ColorButton("viewport", ImVec4(0.5f, 0.2f, 0.5f, 1.0f), ImGuiColorEditFlags_NoTooltip | ImGuiColorEditFlags_NoDragDrop, avail_size);
|
|
|
@@ -10785,9 +10857,8 @@ void ImGui::ShowAboutWindow(bool*) {}
|
|
|
void ImGui::ShowDemoWindow(bool*) {}
|
|
|
void ImGui::ShowUserGuide() {}
|
|
|
void ImGui::ShowStyleEditor(ImGuiStyle*) {}
|
|
|
-bool ImGui::ShowStyleSelector(const char* label) { return false; }
|
|
|
-void ImGui::ShowFontSelector(const char* label) {}
|
|
|
+bool ImGui::ShowStyleSelector(const char*) { return false; }
|
|
|
|
|
|
-#endif
|
|
|
+#endif // #ifndef IMGUI_DISABLE_DEMO_WINDOWS
|
|
|
|
|
|
#endif // #ifndef IMGUI_DISABLE
|