mirror of
https://github.com/ocornut/imgui.git
synced 2025-01-19 09:37:30 +01:00
Merge branch 'master' into docking
# Conflicts: # imgui.cpp
This commit is contained in:
commit
71bcf350bd
@ -36,9 +36,11 @@ HOW TO UPDATE?
|
|||||||
- Please report any issue!
|
- Please report any issue!
|
||||||
|
|
||||||
-----------------------------------------------------------------------
|
-----------------------------------------------------------------------
|
||||||
VERSION 1.90.2 WIP (In Progress)
|
VERSION 1.90.2 (Released 2024-01-09)
|
||||||
-----------------------------------------------------------------------
|
-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
Decorated log and release notes: https://github.com/ocornut/imgui/releases/tag/v1.90.2
|
||||||
|
|
||||||
Breaking changes:
|
Breaking changes:
|
||||||
|
|
||||||
- Commented out ImGuiIO::ImeWindowHandle obsoleted in 1.87 in favor of writing
|
- Commented out ImGuiIO::ImeWindowHandle obsoleted in 1.87 in favor of writing
|
||||||
@ -55,8 +57,20 @@ Other changes:
|
|||||||
regression from 1.90.1 related to code scoping Tab presses to local scope. (#7226) [@bratpilz]
|
regression from 1.90.1 related to code scoping Tab presses to local scope. (#7226) [@bratpilz]
|
||||||
- Nav: Fixed pressing Escape while in a child window with _NavFlattened flag. (#7237)
|
- Nav: Fixed pressing Escape while in a child window with _NavFlattened flag. (#7237)
|
||||||
- Nav: Improve handling of Alt key to toggle menu so that key ownership may be claimed on
|
- Nav: Improve handling of Alt key to toggle menu so that key ownership may be claimed on
|
||||||
indiviudal left/right alt key without intefering with the other.
|
individual left/right alt key without interfering with the other.
|
||||||
|
- Nav, Menus: Fixed click on a BeginMenu() followed by right-arrow from making the child menu
|
||||||
|
reopen and flicker (using ImGuiPopupFlags_NoReopen).
|
||||||
|
- Nav: ImGuiWindowFlags_NoNavInputs is tested during scoring so NavFlattened windows can use it.
|
||||||
|
- Popups: OpenPopup(): added ImGuiPopupFlags_NoReopen flag to specifically not close and reopen
|
||||||
|
a popup when it is already open. (#1497, #1533)
|
||||||
|
(Note that this differs from specific handling we already have in place for the case of calling
|
||||||
|
OpenPopup() repeatedly every frame: we already didn't reopen in that specific situation, otherwise
|
||||||
|
the effect would be very disastrous in term of confusion, as reopening would steal focus).
|
||||||
|
- Popups: Slight change to popup closing logic (e.g. after focusing another window) which skipped
|
||||||
|
over popups that are also child windows.
|
||||||
|
- Combo: Fixed not reusing windows optimally when used inside a popup stack.
|
||||||
- Debug Tools: Metrics: Fixed debug break in SetShortcutRouting() not handling ImGuiMod_Shortcut redirect.
|
- Debug Tools: Metrics: Fixed debug break in SetShortcutRouting() not handling ImGuiMod_Shortcut redirect.
|
||||||
|
- Debug Tools: Metrics: Improved Monitors and Viewports minimap display. Highlight on hover.
|
||||||
- Debug Tools: Debug Log: Added "Input Routing" logging.
|
- Debug Tools: Debug Log: Added "Input Routing" logging.
|
||||||
- Debug Tools: Added "nop" to IM_DEBUG_BREAK macro on GCC to work around GDB bug (#7266) [@Peter0x44]
|
- Debug Tools: Added "nop" to IM_DEBUG_BREAK macro on GCC to work around GDB bug (#7266) [@Peter0x44]
|
||||||
- Backends: Vulkan: Fixed vkAcquireNextImageKHR() validation errors in VulkanSDK 1.3.275 by
|
- Backends: Vulkan: Fixed vkAcquireNextImageKHR() validation errors in VulkanSDK 1.3.275 by
|
||||||
@ -69,7 +83,7 @@ Other changes:
|
|||||||
- Backends: WebGPU: Fixed pipeline layout leak. (#7245) [@rajveermalviya]
|
- Backends: WebGPU: Fixed pipeline layout leak. (#7245) [@rajveermalviya]
|
||||||
- Backends: OpenGL3: Backup and restore GL_PIXEL_UNPACK_BUFFER. (#7253)
|
- Backends: OpenGL3: Backup and restore GL_PIXEL_UNPACK_BUFFER. (#7253)
|
||||||
- Internals: Many improvements related to yet unpublicized shortcut routing and input ownership systems.
|
- Internals: Many improvements related to yet unpublicized shortcut routing and input ownership systems.
|
||||||
- Internals: InputText: Add way to force reload of user-buf when active. (#2890) [@kudaba, @ocornut]
|
- Internals: InputText: Added internal helpers to force reload of user-buf when active. (#2890) [@kudaba, @ocornut]
|
||||||
Often requested in some form (#6962, #5219, #3290, #4627, #5054, #3878, #2881, #1506, #1216, #968),
|
Often requested in some form (#6962, #5219, #3290, #4627, #5054, #3878, #2881, #1506, #1216, #968),
|
||||||
and useful for interactive completion/suggestions popups (#2057, #718)
|
and useful for interactive completion/suggestions popups (#2057, #718)
|
||||||
|
|
||||||
|
91
imgui.cpp
91
imgui.cpp
@ -1,4 +1,4 @@
|
|||||||
// dear imgui, v1.90.2 WIP
|
// dear imgui, v1.90.2
|
||||||
// (main code and documentation)
|
// (main code and documentation)
|
||||||
|
|
||||||
// Help:
|
// Help:
|
||||||
@ -3519,22 +3519,22 @@ void ImGui::RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFl
|
|||||||
float rounding = (flags & ImGuiNavHighlightFlags_NoRounding) ? 0.0f : g.Style.FrameRounding;
|
float rounding = (flags & ImGuiNavHighlightFlags_NoRounding) ? 0.0f : g.Style.FrameRounding;
|
||||||
ImRect display_rect = bb;
|
ImRect display_rect = bb;
|
||||||
display_rect.ClipWith(window->ClipRect);
|
display_rect.ClipWith(window->ClipRect);
|
||||||
if (flags & ImGuiNavHighlightFlags_TypeDefault)
|
const float thickness = 2.0f;
|
||||||
|
if (flags & ImGuiNavHighlightFlags_Compact)
|
||||||
{
|
{
|
||||||
const float THICKNESS = 2.0f;
|
window->DrawList->AddRect(display_rect.Min, display_rect.Max, GetColorU32(ImGuiCol_NavHighlight), rounding, 0, thickness);
|
||||||
const float DISTANCE = 3.0f + THICKNESS * 0.5f;
|
}
|
||||||
display_rect.Expand(ImVec2(DISTANCE, DISTANCE));
|
else
|
||||||
|
{
|
||||||
|
const float distance = 3.0f + thickness * 0.5f;
|
||||||
|
display_rect.Expand(ImVec2(distance, distance));
|
||||||
bool fully_visible = window->ClipRect.Contains(display_rect);
|
bool fully_visible = window->ClipRect.Contains(display_rect);
|
||||||
if (!fully_visible)
|
if (!fully_visible)
|
||||||
window->DrawList->PushClipRect(display_rect.Min, display_rect.Max);
|
window->DrawList->PushClipRect(display_rect.Min, display_rect.Max);
|
||||||
window->DrawList->AddRect(display_rect.Min + ImVec2(THICKNESS * 0.5f, THICKNESS * 0.5f), display_rect.Max - ImVec2(THICKNESS * 0.5f, THICKNESS * 0.5f), GetColorU32(ImGuiCol_NavHighlight), rounding, 0, THICKNESS);
|
window->DrawList->AddRect(display_rect.Min, display_rect.Max, GetColorU32(ImGuiCol_NavHighlight), rounding, 0, thickness);
|
||||||
if (!fully_visible)
|
if (!fully_visible)
|
||||||
window->DrawList->PopClipRect();
|
window->DrawList->PopClipRect();
|
||||||
}
|
}
|
||||||
if (flags & ImGuiNavHighlightFlags_TypeThin)
|
|
||||||
{
|
|
||||||
window->DrawList->AddRect(display_rect.Min, display_rect.Max, GetColorU32(ImGuiCol_NavHighlight), rounding, 0, 1.0f);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGui::RenderMouseCursor(ImVec2 base_pos, float base_scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow)
|
void ImGui::RenderMouseCursor(ImVec2 base_pos, float base_scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow)
|
||||||
@ -5675,7 +5675,7 @@ ImVec2 ImGui::GetItemRectSize()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Prior to v1.90 2023/10/16, the BeginChild() function took a 'bool border = false' parameter instead of 'ImGuiChildFlags child_flags = 0'.
|
// Prior to v1.90 2023/10/16, the BeginChild() function took a 'bool border = false' parameter instead of 'ImGuiChildFlags child_flags = 0'.
|
||||||
// ImGuiChildFlags_Border is defined as always == 1 in order to allow old code passing 'true'.
|
// ImGuiChildFlags_Border is defined as always == 1 in order to allow old code passing 'true'. Read comments in imgui.h for details!
|
||||||
bool ImGui::BeginChild(const char* str_id, const ImVec2& size_arg, ImGuiChildFlags child_flags, ImGuiWindowFlags window_flags)
|
bool ImGui::BeginChild(const char* str_id, const ImVec2& size_arg, ImGuiChildFlags child_flags, ImGuiWindowFlags window_flags)
|
||||||
{
|
{
|
||||||
ImGuiID id = GetCurrentWindow()->GetID(str_id);
|
ImGuiID id = GetCurrentWindow()->GetID(str_id);
|
||||||
@ -5817,7 +5817,7 @@ void ImGui::EndChild()
|
|||||||
|
|
||||||
// When browsing a window that has no activable items (scroll only) we keep a highlight on the child (pass g.NavId to trick into always displaying)
|
// When browsing a window that has no activable items (scroll only) we keep a highlight on the child (pass g.NavId to trick into always displaying)
|
||||||
if (child_window->DC.NavLayersActiveMask == 0 && child_window == g.NavWindow)
|
if (child_window->DC.NavLayersActiveMask == 0 && child_window == g.NavWindow)
|
||||||
RenderNavHighlight(ImRect(bb.Min - ImVec2(2, 2), bb.Max + ImVec2(2, 2)), g.NavId, ImGuiNavHighlightFlags_TypeThin);
|
RenderNavHighlight(ImRect(bb.Min - ImVec2(2, 2), bb.Max + ImVec2(2, 2)), g.NavId, ImGuiNavHighlightFlags_Compact);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -6841,7 +6841,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|||||||
window_stack_data.StackSizesOnBegin.SetToContextState(&g);
|
window_stack_data.StackSizesOnBegin.SetToContextState(&g);
|
||||||
g.CurrentWindowStack.push_back(window_stack_data);
|
g.CurrentWindowStack.push_back(window_stack_data);
|
||||||
if (flags & ImGuiWindowFlags_ChildMenu)
|
if (flags & ImGuiWindowFlags_ChildMenu)
|
||||||
g.BeginMenuCount++;
|
g.BeginMenuDepth++;
|
||||||
|
|
||||||
// Update ->RootWindow and others pointers (before any possible call to FocusWindow)
|
// Update ->RootWindow and others pointers (before any possible call to FocusWindow)
|
||||||
if (first_begin_of_the_frame)
|
if (first_begin_of_the_frame)
|
||||||
@ -7658,7 +7658,7 @@ void ImGui::End()
|
|||||||
// Pop from window stack
|
// Pop from window stack
|
||||||
g.LastItemData = g.CurrentWindowStack.back().ParentLastItemDataBackup;
|
g.LastItemData = g.CurrentWindowStack.back().ParentLastItemDataBackup;
|
||||||
if (window->Flags & ImGuiWindowFlags_ChildMenu)
|
if (window->Flags & ImGuiWindowFlags_ChildMenu)
|
||||||
g.BeginMenuCount--;
|
g.BeginMenuDepth--;
|
||||||
if (window->Flags & ImGuiWindowFlags_Popup)
|
if (window->Flags & ImGuiWindowFlags_Popup)
|
||||||
g.BeginPopupStack.pop_back();
|
g.BeginPopupStack.pop_back();
|
||||||
g.CurrentWindowStack.back().StackSizesOnBegin.CompareWithContextState(&g);
|
g.CurrentWindowStack.back().StackSizesOnBegin.CompareWithContextState(&g);
|
||||||
@ -11445,16 +11445,22 @@ void ImGui::OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Gently handle the user mistakenly calling OpenPopup() every frame. It is a programming mistake! However, if we were to run the regular code path, the ui
|
// Gently handle the user mistakenly calling OpenPopup() every frames: it is likely a programming mistake!
|
||||||
// would become completely unusable because the popup will always be in hidden-while-calculating-size state _while_ claiming focus. Which would be a very confusing
|
// However, if we were to run the regular code path, the ui would become completely unusable because the popup will always be
|
||||||
// situation for the programmer. Instead, we silently allow the popup to proceed, it will keep reappearing and the programming error will be more obvious to understand.
|
// in hidden-while-calculating-size state _while_ claiming focus. Which is extremely confusing situation for the programmer.
|
||||||
if (g.OpenPopupStack[current_stack_size].PopupId == id && g.OpenPopupStack[current_stack_size].OpenFrameCount == g.FrameCount - 1)
|
// Instead, for successive frames calls to OpenPopup(), we silently avoid reopening even if ImGuiPopupFlags_NoReopen is not specified.
|
||||||
|
bool keep_existing = false;
|
||||||
|
if (g.OpenPopupStack[current_stack_size].PopupId == id)
|
||||||
|
if ((g.OpenPopupStack[current_stack_size].OpenFrameCount == g.FrameCount - 1) || (popup_flags & ImGuiPopupFlags_NoReopen))
|
||||||
|
keep_existing = true;
|
||||||
|
if (keep_existing)
|
||||||
{
|
{
|
||||||
|
// No reopen
|
||||||
g.OpenPopupStack[current_stack_size].OpenFrameCount = popup_ref.OpenFrameCount;
|
g.OpenPopupStack[current_stack_size].OpenFrameCount = popup_ref.OpenFrameCount;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Close child popups if any, then flag popup for open/reopen
|
// Reopen: close child popups if any, then flag popup for open/reopen (set position, focus, init navigation)
|
||||||
ClosePopupToLevel(current_stack_size, false);
|
ClosePopupToLevel(current_stack_size, false);
|
||||||
g.OpenPopupStack.push_back(popup_ref);
|
g.OpenPopupStack.push_back(popup_ref);
|
||||||
}
|
}
|
||||||
@ -11485,14 +11491,15 @@ void ImGui::ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to
|
|||||||
if (!popup.Window)
|
if (!popup.Window)
|
||||||
continue;
|
continue;
|
||||||
IM_ASSERT((popup.Window->Flags & ImGuiWindowFlags_Popup) != 0);
|
IM_ASSERT((popup.Window->Flags & ImGuiWindowFlags_Popup) != 0);
|
||||||
if (popup.Window->Flags & ImGuiWindowFlags_ChildWindow)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// Trim the stack unless the popup is a direct parent of the reference window (the reference window is often the NavWindow)
|
// Trim the stack unless the popup is a direct parent of the reference window (the reference window is often the NavWindow)
|
||||||
// - With this stack of window, clicking/focusing Popup1 will close Popup2 and Popup3:
|
// - Clicking/Focusing Window2 won't close Popup1:
|
||||||
// Window -> Popup1 -> Popup2 -> Popup3
|
// Window -> Popup1 -> Window2(Ref)
|
||||||
|
// - Clicking/focusing Popup1 will close Popup2 and Popup3:
|
||||||
|
// Window -> Popup1(Ref) -> Popup2 -> Popup3
|
||||||
// - Each popups may contain child windows, which is why we compare ->RootWindowDockTree!
|
// - Each popups may contain child windows, which is why we compare ->RootWindowDockTree!
|
||||||
// Window -> Popup1 -> Popup1_Child -> Popup2 -> Popup2_Child
|
// Window -> Popup1 -> Popup1_Child -> Popup2 -> Popup2_Child
|
||||||
|
// We step through every popup from bottom to top to validate their position relative to reference window.
|
||||||
bool ref_window_is_descendent_of_popup = false;
|
bool ref_window_is_descendent_of_popup = false;
|
||||||
for (int n = popup_count_to_keep; n < g.OpenPopupStack.Size; n++)
|
for (int n = popup_count_to_keep; n < g.OpenPopupStack.Size; n++)
|
||||||
if (ImGuiWindow* popup_window = g.OpenPopupStack[n].Window)
|
if (ImGuiWindow* popup_window = g.OpenPopupStack[n].Window)
|
||||||
@ -11592,7 +11599,7 @@ bool ImGui::BeginPopupEx(ImGuiID id, ImGuiWindowFlags flags)
|
|||||||
|
|
||||||
char name[20];
|
char name[20];
|
||||||
if (flags & ImGuiWindowFlags_ChildMenu)
|
if (flags & ImGuiWindowFlags_ChildMenu)
|
||||||
ImFormatString(name, IM_ARRAYSIZE(name), "##Menu_%02d", g.BeginMenuCount); // Recycle windows based on depth
|
ImFormatString(name, IM_ARRAYSIZE(name), "##Menu_%02d", g.BeginMenuDepth); // Recycle windows based on depth
|
||||||
else
|
else
|
||||||
ImFormatString(name, IM_ARRAYSIZE(name), "##Popup_%08x", id); // Not recycling, so we can close/open during the same frame
|
ImFormatString(name, IM_ARRAYSIZE(name), "##Popup_%08x", id); // Not recycling, so we can close/open during the same frame
|
||||||
|
|
||||||
@ -12186,7 +12193,7 @@ static void ImGui::NavProcessItem()
|
|||||||
|
|
||||||
// Process Move Request (scoring for navigation)
|
// Process Move Request (scoring for navigation)
|
||||||
// FIXME-NAV: Consider policy for double scoring (scoring from NavScoringRect + scoring from a rect wrapped according to current wrapping policy)
|
// FIXME-NAV: Consider policy for double scoring (scoring from NavScoringRect + scoring from a rect wrapped according to current wrapping policy)
|
||||||
if (g.NavMoveScoringItems && (item_flags & ImGuiItemFlags_Disabled) == 0)
|
if (g.NavMoveScoringItems && (item_flags & ImGuiItemFlags_Disabled) == 0 && (window->Flags & ImGuiWindowFlags_NoNavInputs) == 0)
|
||||||
{
|
{
|
||||||
const bool is_tabbing = (g.NavMoveFlags & ImGuiNavMoveFlags_IsTabbing) != 0;
|
const bool is_tabbing = (g.NavMoveFlags & ImGuiNavMoveFlags_IsTabbing) != 0;
|
||||||
if (is_tabbing)
|
if (is_tabbing)
|
||||||
@ -19578,7 +19585,7 @@ static void SetPlatformImeDataFn_DefaultImpl(ImGuiViewport*, ImGuiPlatformImeDat
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// [SECTION] METRICS/DEBUGGER WINDOW
|
// [SECTION] METRICS/DEBUGGER WINDOW
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// - RenderViewportThumbnail() [Internal]
|
// - DebugRenderViewportThumbnail() [Internal]
|
||||||
// - RenderViewportsThumbnails() [Internal]
|
// - RenderViewportsThumbnails() [Internal]
|
||||||
// - DebugTextEncoding()
|
// - DebugTextEncoding()
|
||||||
// - MetricsHelpMarker() [Internal]
|
// - MetricsHelpMarker() [Internal]
|
||||||
@ -19620,7 +19627,7 @@ void ImGui::DebugRenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP*
|
|||||||
ImRect thumb_r = thumb_window->Rect();
|
ImRect thumb_r = thumb_window->Rect();
|
||||||
ImRect title_r = thumb_window->TitleBarRect();
|
ImRect title_r = thumb_window->TitleBarRect();
|
||||||
thumb_r = ImRect(ImTrunc(off + thumb_r.Min * scale), ImTrunc(off + thumb_r.Max * scale));
|
thumb_r = ImRect(ImTrunc(off + thumb_r.Min * scale), ImTrunc(off + thumb_r.Max * scale));
|
||||||
title_r = ImRect(ImTrunc(off + title_r.Min * scale), ImTrunc(off + ImVec2(title_r.Max.x, title_r.Min.y) * scale) + ImVec2(0,5)); // Exaggerate title bar height
|
title_r = ImRect(ImTrunc(off + title_r.Min * scale), ImTrunc(off + ImVec2(title_r.Max.x, title_r.Min.y + title_r.GetHeight() * 3.0f) * scale)); // Exaggerate title bar height
|
||||||
thumb_r.ClipWithFull(bb);
|
thumb_r.ClipWithFull(bb);
|
||||||
title_r.ClipWithFull(bb);
|
title_r.ClipWithFull(bb);
|
||||||
const bool window_is_focused = (g.NavWindow && thumb_window->RootWindowForTitleBarHighlight == g.NavWindow->RootWindowForTitleBarHighlight);
|
const bool window_is_focused = (g.NavWindow && thumb_window->RootWindowForTitleBarHighlight == g.NavWindow->RootWindowForTitleBarHighlight);
|
||||||
@ -19630,6 +19637,8 @@ void ImGui::DebugRenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP*
|
|||||||
window->DrawList->AddText(g.Font, g.FontSize * 1.0f, title_r.Min, GetColorU32(ImGuiCol_Text, alpha_mul), thumb_window->Name, FindRenderedTextEnd(thumb_window->Name));
|
window->DrawList->AddText(g.Font, g.FontSize * 1.0f, title_r.Min, GetColorU32(ImGuiCol_Text, alpha_mul), thumb_window->Name, FindRenderedTextEnd(thumb_window->Name));
|
||||||
}
|
}
|
||||||
draw_list->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_Border, alpha_mul));
|
draw_list->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_Border, alpha_mul));
|
||||||
|
if (viewport->ID == g.DebugMetricsConfig.HighlightViewportID)
|
||||||
|
window->DrawList->AddRect(bb.Min, bb.Max, IM_COL32(255, 255, 0, 255));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void RenderViewportsThumbnails()
|
static void RenderViewportsThumbnails()
|
||||||
@ -19637,13 +19646,12 @@ static void RenderViewportsThumbnails()
|
|||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
ImGuiWindow* window = g.CurrentWindow;
|
ImGuiWindow* window = g.CurrentWindow;
|
||||||
|
|
||||||
// We don't display full monitor bounds (we could, but it often looks awkward), instead we display just enough to cover all of our viewports.
|
|
||||||
float SCALE = 1.0f / 8.0f;
|
float SCALE = 1.0f / 8.0f;
|
||||||
ImRect bb_full(FLT_MAX, FLT_MAX, -FLT_MAX, -FLT_MAX);
|
ImRect bb_full(g.Viewports[0]->Pos, g.Viewports[0]->Pos + g.Viewports[0]->Size);
|
||||||
for (ImGuiViewportP* viewport : g.Viewports)
|
|
||||||
bb_full.Add(viewport->GetMainRect());
|
|
||||||
ImVec2 p = window->DC.CursorPos;
|
ImVec2 p = window->DC.CursorPos;
|
||||||
ImVec2 off = p - bb_full.Min * SCALE;
|
ImVec2 off = p - bb_full.Min * SCALE;
|
||||||
|
|
||||||
|
// Draw viewports
|
||||||
for (ImGuiViewportP* viewport : g.Viewports)
|
for (ImGuiViewportP* viewport : g.Viewports)
|
||||||
{
|
{
|
||||||
ImRect viewport_draw_bb(off + (viewport->Pos) * SCALE, off + (viewport->Pos + viewport->Size) * SCALE);
|
ImRect viewport_draw_bb(off + (viewport->Pos) * SCALE, off + (viewport->Pos + viewport->Size) * SCALE);
|
||||||
@ -19893,7 +19901,7 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|||||||
MetricsHelpMarker("Will call the IM_DEBUG_BREAK() macro to break in debugger.\nWarning: If you don't have a debugger attached, this will probably crash.");
|
MetricsHelpMarker("Will call the IM_DEBUG_BREAK() macro to break in debugger.\nWarning: If you don't have a debugger attached, this will probably crash.");
|
||||||
if (Checkbox("Show Item Picker", &g.DebugItemPickerActive) && g.DebugItemPickerActive)
|
if (Checkbox("Show Item Picker", &g.DebugItemPickerActive) && g.DebugItemPickerActive)
|
||||||
DebugStartItemPicker();
|
DebugStartItemPicker();
|
||||||
Checkbox("Show \"Debug Break\" buttons in other sections", &g.IO.ConfigDebugIsDebuggerPresent);
|
Checkbox("Show \"Debug Break\" buttons in other sections (io.ConfigDebugIsDebuggerPresent)", &g.IO.ConfigDebugIsDebuggerPresent);
|
||||||
|
|
||||||
SeparatorText("Visualize");
|
SeparatorText("Visualize");
|
||||||
|
|
||||||
@ -20037,10 +20045,6 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|||||||
// Viewports
|
// Viewports
|
||||||
if (TreeNode("Viewports", "Viewports (%d)", g.Viewports.Size))
|
if (TreeNode("Viewports", "Viewports (%d)", g.Viewports.Size))
|
||||||
{
|
{
|
||||||
Indent(GetTreeNodeToLabelSpacing());
|
|
||||||
RenderViewportsThumbnails();
|
|
||||||
Unindent(GetTreeNodeToLabelSpacing());
|
|
||||||
|
|
||||||
bool open = TreeNode("Monitors", "Monitors (%d)", g.PlatformIO.Monitors.Size);
|
bool open = TreeNode("Monitors", "Monitors (%d)", g.PlatformIO.Monitors.Size);
|
||||||
SameLine();
|
SameLine();
|
||||||
MetricsHelpMarker("Dear ImGui uses monitor data:\n- to query DPI settings on a per monitor basis\n- to position popup/tooltips so they don't straddle monitors.");
|
MetricsHelpMarker("Dear ImGui uses monitor data:\n- to query DPI settings on a per monitor basis\n- to position popup/tooltips so they don't straddle monitors.");
|
||||||
@ -20057,6 +20061,14 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|||||||
TreePop();
|
TreePop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SetNextItemOpen(true, ImGuiCond_Once);
|
||||||
|
if (TreeNode("Windows Minimap"))
|
||||||
|
{
|
||||||
|
RenderViewportsThumbnails();
|
||||||
|
TreePop();
|
||||||
|
}
|
||||||
|
cfg->HighlightViewportID = 0;
|
||||||
|
|
||||||
BulletText("MouseViewport: 0x%08X (UserHovered 0x%08X, LastHovered 0x%08X)", g.MouseViewport ? g.MouseViewport->ID : 0, g.IO.MouseHoveredViewport, g.MouseLastHoveredViewport ? g.MouseLastHoveredViewport->ID : 0);
|
BulletText("MouseViewport: 0x%08X (UserHovered 0x%08X, LastHovered 0x%08X)", g.MouseViewport ? g.MouseViewport->ID : 0, g.IO.MouseHoveredViewport, g.MouseLastHoveredViewport ? g.MouseLastHoveredViewport->ID : 0);
|
||||||
if (TreeNode("Inferred Z order (front-to-back)"))
|
if (TreeNode("Inferred Z order (front-to-back)"))
|
||||||
{
|
{
|
||||||
@ -20072,6 +20084,7 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|||||||
viewport->Window ? viewport->Window->Name : "N/A");
|
viewport->Window ? viewport->Window->Name : "N/A");
|
||||||
TreePop();
|
TreePop();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (ImGuiViewportP* viewport : g.Viewports)
|
for (ImGuiViewportP* viewport : g.Viewports)
|
||||||
DebugNodeViewport(viewport);
|
DebugNodeViewport(viewport);
|
||||||
TreePop();
|
TreePop();
|
||||||
@ -20909,8 +20922,12 @@ void ImGui::DebugNodeTabBar(ImGuiTabBar* tab_bar, const char* label)
|
|||||||
|
|
||||||
void ImGui::DebugNodeViewport(ImGuiViewportP* viewport)
|
void ImGui::DebugNodeViewport(ImGuiViewportP* viewport)
|
||||||
{
|
{
|
||||||
|
ImGuiContext& g = *GImGui;
|
||||||
SetNextItemOpen(true, ImGuiCond_Once);
|
SetNextItemOpen(true, ImGuiCond_Once);
|
||||||
if (TreeNode((void*)(intptr_t)viewport->ID, "Viewport #%d, ID: 0x%08X, Parent: 0x%08X, Window: \"%s\"", viewport->Idx, viewport->ID, viewport->ParentViewportId, viewport->Window ? viewport->Window->Name : "N/A"))
|
bool open = TreeNode((void*)(intptr_t)viewport->ID, "Viewport #%d, ID: 0x%08X, Parent: 0x%08X, Window: \"%s\"", viewport->Idx, viewport->ID, viewport->ParentViewportId, viewport->Window ? viewport->Window->Name : "N/A");
|
||||||
|
if (IsItemHovered())
|
||||||
|
g.DebugMetricsConfig.HighlightViewportID = viewport->ID;
|
||||||
|
if (open)
|
||||||
{
|
{
|
||||||
ImGuiWindowFlags flags = viewport->Flags;
|
ImGuiWindowFlags flags = viewport->Flags;
|
||||||
BulletText("Main Pos: (%.0f,%.0f), Size: (%.0f,%.0f)\nWorkArea Offset Left: %.0f Top: %.0f, Right: %.0f, Bottom: %.0f\nMonitor: %d, DpiScale: %.0f%%",
|
BulletText("Main Pos: (%.0f,%.0f), Size: (%.0f,%.0f)\nWorkArea Offset Left: %.0f Top: %.0f, Right: %.0f, Bottom: %.0f\nMonitor: %d, DpiScale: %.0f%%",
|
||||||
|
26
imgui.h
26
imgui.h
@ -1,4 +1,4 @@
|
|||||||
// dear imgui, v1.90.2 WIP
|
// dear imgui, v1.90.2
|
||||||
// (headers)
|
// (headers)
|
||||||
|
|
||||||
// Help:
|
// Help:
|
||||||
@ -23,8 +23,8 @@
|
|||||||
|
|
||||||
// Library Version
|
// Library Version
|
||||||
// (Integer encoded as XYYZZ for use in #if preprocessor conditionals, e.g. '#if IMGUI_VERSION_NUM >= 12345')
|
// (Integer encoded as XYYZZ for use in #if preprocessor conditionals, e.g. '#if IMGUI_VERSION_NUM >= 12345')
|
||||||
#define IMGUI_VERSION "1.90.2 WIP"
|
#define IMGUI_VERSION "1.90.2"
|
||||||
#define IMGUI_VERSION_NUM 19017
|
#define IMGUI_VERSION_NUM 19020
|
||||||
#define IMGUI_HAS_TABLE
|
#define IMGUI_HAS_TABLE
|
||||||
#define IMGUI_HAS_VIEWPORT // Viewport WIP branch
|
#define IMGUI_HAS_VIEWPORT // Viewport WIP branch
|
||||||
#define IMGUI_HAS_DOCK // Docking WIP branch
|
#define IMGUI_HAS_DOCK // Docking WIP branch
|
||||||
@ -350,7 +350,7 @@ namespace ImGui
|
|||||||
// - Use child windows to begin into a self-contained independent scrolling/clipping regions within a host window. Child windows can embed their own child.
|
// - Use child windows to begin into a self-contained independent scrolling/clipping regions within a host window. Child windows can embed their own child.
|
||||||
// - Before 1.90 (November 2023), the "ImGuiChildFlags child_flags = 0" parameter was "bool border = false".
|
// - Before 1.90 (November 2023), the "ImGuiChildFlags child_flags = 0" parameter was "bool border = false".
|
||||||
// This API is backward compatible with old code, as we guarantee that ImGuiChildFlags_Border == true.
|
// This API is backward compatible with old code, as we guarantee that ImGuiChildFlags_Border == true.
|
||||||
// Consider updating your old call sites:
|
// Consider updating your old code:
|
||||||
// BeginChild("Name", size, false) -> Begin("Name", size, 0); or Begin("Name", size, ImGuiChildFlags_None);
|
// BeginChild("Name", size, false) -> Begin("Name", size, 0); or Begin("Name", size, ImGuiChildFlags_None);
|
||||||
// BeginChild("Name", size, true) -> Begin("Name", size, ImGuiChildFlags_Border);
|
// BeginChild("Name", size, true) -> Begin("Name", size, ImGuiChildFlags_Border);
|
||||||
// - Manual sizing (each axis can use a different setting e.g. ImVec2(0.0f, 400.0f)):
|
// - Manual sizing (each axis can use a different setting e.g. ImVec2(0.0f, 400.0f)):
|
||||||
@ -1070,7 +1070,7 @@ enum ImGuiWindowFlags_
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Flags for ImGui::BeginChild()
|
// Flags for ImGui::BeginChild()
|
||||||
// (Legacy: bot 0 must always correspond to ImGuiChildFlags_Border to be backward compatible with old API using 'bool border = false'.
|
// (Legacy: bit 0 must always correspond to ImGuiChildFlags_Border to be backward compatible with old API using 'bool border = false'.
|
||||||
// About using AutoResizeX/AutoResizeY flags:
|
// About using AutoResizeX/AutoResizeY flags:
|
||||||
// - May be combined with SetNextWindowSizeConstraints() to set a min/max size for each axis (see "Demo->Child->Auto-resize with Constraints").
|
// - May be combined with SetNextWindowSizeConstraints() to set a min/max size for each axis (see "Demo->Child->Auto-resize with Constraints").
|
||||||
// - Size measurement for a given axis is only performed when the child window is within visible boundaries, or is just appearing.
|
// - Size measurement for a given axis is only performed when the child window is within visible boundaries, or is just appearing.
|
||||||
@ -1081,7 +1081,7 @@ enum ImGuiWindowFlags_
|
|||||||
enum ImGuiChildFlags_
|
enum ImGuiChildFlags_
|
||||||
{
|
{
|
||||||
ImGuiChildFlags_None = 0,
|
ImGuiChildFlags_None = 0,
|
||||||
ImGuiChildFlags_Border = 1 << 0, // Show an outer border and enable WindowPadding. (Important: this is always == 1 == true for legacy reason)
|
ImGuiChildFlags_Border = 1 << 0, // Show an outer border and enable WindowPadding. (IMPORTANT: this is always == 1 == true for legacy reason)
|
||||||
ImGuiChildFlags_AlwaysUseWindowPadding = 1 << 1, // Pad with style.WindowPadding even if no border are drawn (no padding by default for non-bordered child windows because it makes more sense)
|
ImGuiChildFlags_AlwaysUseWindowPadding = 1 << 1, // Pad with style.WindowPadding even if no border are drawn (no padding by default for non-bordered child windows because it makes more sense)
|
||||||
ImGuiChildFlags_ResizeX = 1 << 2, // Allow resize from right border (layout direction). Enable .ini saving (unless ImGuiWindowFlags_NoSavedSettings passed to window flags)
|
ImGuiChildFlags_ResizeX = 1 << 2, // Allow resize from right border (layout direction). Enable .ini saving (unless ImGuiWindowFlags_NoSavedSettings passed to window flags)
|
||||||
ImGuiChildFlags_ResizeY = 1 << 3, // Allow resize from bottom border (layout direction). "
|
ImGuiChildFlags_ResizeY = 1 << 3, // Allow resize from bottom border (layout direction). "
|
||||||
@ -1150,8 +1150,8 @@ enum ImGuiTreeNodeFlags_
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Flags for OpenPopup*(), BeginPopupContext*(), IsPopupOpen() functions.
|
// Flags for OpenPopup*(), BeginPopupContext*(), IsPopupOpen() functions.
|
||||||
// - To be backward compatible with older API which took an 'int mouse_button = 1' argument, we need to treat
|
// - To be backward compatible with older API which took an 'int mouse_button = 1' argument instead of 'ImGuiPopupFlags flags',
|
||||||
// small flags values as a mouse button index, so we encode the mouse button in the first few bits of the flags.
|
// we need to treat small flags values as a mouse button index, so we encode the mouse button in the first few bits of the flags.
|
||||||
// It is therefore guaranteed to be legal to pass a mouse button index in ImGuiPopupFlags.
|
// It is therefore guaranteed to be legal to pass a mouse button index in ImGuiPopupFlags.
|
||||||
// - For the same reason, we exceptionally default the ImGuiPopupFlags argument of BeginPopupContextXXX functions to 1 instead of 0.
|
// - For the same reason, we exceptionally default the ImGuiPopupFlags argument of BeginPopupContextXXX functions to 1 instead of 0.
|
||||||
// IMPORTANT: because the default parameter is 1 (==ImGuiPopupFlags_MouseButtonRight), if you rely on the default parameter
|
// IMPORTANT: because the default parameter is 1 (==ImGuiPopupFlags_MouseButtonRight), if you rely on the default parameter
|
||||||
@ -1165,10 +1165,12 @@ enum ImGuiPopupFlags_
|
|||||||
ImGuiPopupFlags_MouseButtonMiddle = 2, // For BeginPopupContext*(): open on Middle Mouse release. Guaranteed to always be == 2 (same as ImGuiMouseButton_Middle)
|
ImGuiPopupFlags_MouseButtonMiddle = 2, // For BeginPopupContext*(): open on Middle Mouse release. Guaranteed to always be == 2 (same as ImGuiMouseButton_Middle)
|
||||||
ImGuiPopupFlags_MouseButtonMask_ = 0x1F,
|
ImGuiPopupFlags_MouseButtonMask_ = 0x1F,
|
||||||
ImGuiPopupFlags_MouseButtonDefault_ = 1,
|
ImGuiPopupFlags_MouseButtonDefault_ = 1,
|
||||||
ImGuiPopupFlags_NoOpenOverExistingPopup = 1 << 5, // For OpenPopup*(), BeginPopupContext*(): don't open if there's already a popup at the same level of the popup stack
|
ImGuiPopupFlags_NoReopen = 1 << 5, // For OpenPopup*(), BeginPopupContext*(): don't reopen same popup if already open (won't reposition, won't reinitialize navigation)
|
||||||
ImGuiPopupFlags_NoOpenOverItems = 1 << 6, // For BeginPopupContextWindow(): don't return true when hovering items, only when hovering empty space
|
//ImGuiPopupFlags_NoReopenAlwaysNavInit = 1 << 6, // For OpenPopup*(), BeginPopupContext*(): focus and initialize navigation even when not reopening.
|
||||||
ImGuiPopupFlags_AnyPopupId = 1 << 7, // For IsPopupOpen(): ignore the ImGuiID parameter and test for any popup.
|
ImGuiPopupFlags_NoOpenOverExistingPopup = 1 << 7, // For OpenPopup*(), BeginPopupContext*(): don't open if there's already a popup at the same level of the popup stack
|
||||||
ImGuiPopupFlags_AnyPopupLevel = 1 << 8, // For IsPopupOpen(): search/test at any level of the popup stack (default test in the current level)
|
ImGuiPopupFlags_NoOpenOverItems = 1 << 8, // For BeginPopupContextWindow(): don't return true when hovering items, only when hovering empty space
|
||||||
|
ImGuiPopupFlags_AnyPopupId = 1 << 10, // For IsPopupOpen(): ignore the ImGuiID parameter and test for any popup.
|
||||||
|
ImGuiPopupFlags_AnyPopupLevel = 1 << 11, // For IsPopupOpen(): search/test at any level of the popup stack (default test in the current level)
|
||||||
ImGuiPopupFlags_AnyPopup = ImGuiPopupFlags_AnyPopupId | ImGuiPopupFlags_AnyPopupLevel,
|
ImGuiPopupFlags_AnyPopup = ImGuiPopupFlags_AnyPopupId | ImGuiPopupFlags_AnyPopupLevel,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// dear imgui, v1.90.2 WIP
|
// dear imgui, v1.90.2
|
||||||
// (demo code)
|
// (demo code)
|
||||||
|
|
||||||
// Help:
|
// Help:
|
||||||
@ -7097,19 +7097,19 @@ struct ExampleAppConsole
|
|||||||
{
|
{
|
||||||
ClearLog();
|
ClearLog();
|
||||||
for (int i = 0; i < History.Size; i++)
|
for (int i = 0; i < History.Size; i++)
|
||||||
free(History[i]);
|
ImGui::MemFree(History[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Portable helpers
|
// Portable helpers
|
||||||
static int Stricmp(const char* s1, const char* s2) { int d; while ((d = toupper(*s2) - toupper(*s1)) == 0 && *s1) { s1++; s2++; } return d; }
|
static int Stricmp(const char* s1, const char* s2) { int d; while ((d = toupper(*s2) - toupper(*s1)) == 0 && *s1) { s1++; s2++; } return d; }
|
||||||
static int Strnicmp(const char* s1, const char* s2, int n) { int d = 0; while (n > 0 && (d = toupper(*s2) - toupper(*s1)) == 0 && *s1) { s1++; s2++; n--; } return d; }
|
static int Strnicmp(const char* s1, const char* s2, int n) { int d = 0; while (n > 0 && (d = toupper(*s2) - toupper(*s1)) == 0 && *s1) { s1++; s2++; n--; } return d; }
|
||||||
static char* Strdup(const char* s) { IM_ASSERT(s); size_t len = strlen(s) + 1; void* buf = malloc(len); IM_ASSERT(buf); return (char*)memcpy(buf, (const void*)s, len); }
|
static char* Strdup(const char* s) { IM_ASSERT(s); size_t len = strlen(s) + 1; void* buf = ImGui::MemAlloc(len); IM_ASSERT(buf); return (char*)memcpy(buf, (const void*)s, len); }
|
||||||
static void Strtrim(char* s) { char* str_end = s + strlen(s); while (str_end > s && str_end[-1] == ' ') str_end--; *str_end = 0; }
|
static void Strtrim(char* s) { char* str_end = s + strlen(s); while (str_end > s && str_end[-1] == ' ') str_end--; *str_end = 0; }
|
||||||
|
|
||||||
void ClearLog()
|
void ClearLog()
|
||||||
{
|
{
|
||||||
for (int i = 0; i < Items.Size; i++)
|
for (int i = 0; i < Items.Size; i++)
|
||||||
free(Items[i]);
|
ImGui::MemFree(Items[i]);
|
||||||
Items.clear();
|
Items.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7275,7 +7275,7 @@ struct ExampleAppConsole
|
|||||||
for (int i = History.Size - 1; i >= 0; i--)
|
for (int i = History.Size - 1; i >= 0; i--)
|
||||||
if (Stricmp(History[i], command_line) == 0)
|
if (Stricmp(History[i], command_line) == 0)
|
||||||
{
|
{
|
||||||
free(History[i]);
|
ImGui::MemFree(History[i]);
|
||||||
History.erase(History.begin() + i);
|
History.erase(History.begin() + i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// dear imgui, v1.90.2 WIP
|
// dear imgui, v1.90.2
|
||||||
// (drawing and font code)
|
// (drawing and font code)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// dear imgui, v1.90.2 WIP
|
// dear imgui, v1.90.2
|
||||||
// (internal structures/api)
|
// (internal structures/api)
|
||||||
|
|
||||||
// You may use this file to debug, understand or extend Dear ImGui features but we don't provide any guarantee of forward compatibility.
|
// You may use this file to debug, understand or extend Dear ImGui features but we don't provide any guarantee of forward compatibility.
|
||||||
@ -1079,7 +1079,7 @@ struct IMGUI_API ImGuiInputTextState
|
|||||||
int CurLenW, CurLenA; // we need to maintain our buffer length in both UTF-8 and wchar format. UTF-8 length is valid even if TextA is not.
|
int CurLenW, CurLenA; // we need to maintain our buffer length in both UTF-8 and wchar format. UTF-8 length is valid even if TextA is not.
|
||||||
ImVector<ImWchar> TextW; // edit buffer, we need to persist but can't guarantee the persistence of the user-provided buffer. so we copy into own buffer.
|
ImVector<ImWchar> TextW; // edit buffer, we need to persist but can't guarantee the persistence of the user-provided buffer. so we copy into own buffer.
|
||||||
ImVector<char> TextA; // temporary UTF8 buffer for callbacks and other operations. this is not updated in every code-path! size=capacity.
|
ImVector<char> TextA; // temporary UTF8 buffer for callbacks and other operations. this is not updated in every code-path! size=capacity.
|
||||||
ImVector<char> InitialTextA; // backup of end-user buffer at the time of focus (in UTF-8, unaltered)
|
ImVector<char> InitialTextA; // value to revert to when pressing Escape = backup of end-user buffer at the time of focus (in UTF-8, unaltered)
|
||||||
bool TextAIsValid; // temporary UTF8 buffer is not initially valid before we make the widget active (until then we pull the data from user argument)
|
bool TextAIsValid; // temporary UTF8 buffer is not initially valid before we make the widget active (until then we pull the data from user argument)
|
||||||
int BufCapacityA; // end-user buffer capacity
|
int BufCapacityA; // end-user buffer capacity
|
||||||
float ScrollX; // horizontal scrolling/offset
|
float ScrollX; // horizontal scrolling/offset
|
||||||
@ -1575,8 +1575,7 @@ enum ImGuiScrollFlags_
|
|||||||
enum ImGuiNavHighlightFlags_
|
enum ImGuiNavHighlightFlags_
|
||||||
{
|
{
|
||||||
ImGuiNavHighlightFlags_None = 0,
|
ImGuiNavHighlightFlags_None = 0,
|
||||||
ImGuiNavHighlightFlags_TypeDefault = 1 << 0,
|
ImGuiNavHighlightFlags_Compact = 1 << 1, // Compact highlight, no padding
|
||||||
ImGuiNavHighlightFlags_TypeThin = 1 << 1,
|
|
||||||
ImGuiNavHighlightFlags_AlwaysDraw = 1 << 2, // Draw rectangular highlight if (g.NavId == id) _even_ when using the mouse.
|
ImGuiNavHighlightFlags_AlwaysDraw = 1 << 2, // Draw rectangular highlight if (g.NavId == id) _even_ when using the mouse.
|
||||||
ImGuiNavHighlightFlags_NoRounding = 1 << 3,
|
ImGuiNavHighlightFlags_NoRounding = 1 << 3,
|
||||||
};
|
};
|
||||||
@ -2053,6 +2052,8 @@ struct ImGuiMetricsConfig
|
|||||||
bool ShowDockingNodes = false;
|
bool ShowDockingNodes = false;
|
||||||
int ShowWindowsRectsType = -1;
|
int ShowWindowsRectsType = -1;
|
||||||
int ShowTablesRectsType = -1;
|
int ShowTablesRectsType = -1;
|
||||||
|
int HighlightMonitorIdx = -1;
|
||||||
|
ImGuiID HighlightViewportID = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ImGuiStackLevelInfo
|
struct ImGuiStackLevelInfo
|
||||||
@ -2220,8 +2221,6 @@ struct ImGuiContext
|
|||||||
ImVector<ImGuiPopupData> BeginPopupStack; // Which level of BeginPopup() we are in (reset every frame)
|
ImVector<ImGuiPopupData> BeginPopupStack; // Which level of BeginPopup() we are in (reset every frame)
|
||||||
ImVector<ImGuiNavTreeNodeData> NavTreeNodeStack; // Stack for TreeNode() when a NavLeft requested is emitted.
|
ImVector<ImGuiNavTreeNodeData> NavTreeNodeStack; // Stack for TreeNode() when a NavLeft requested is emitted.
|
||||||
|
|
||||||
int BeginMenuCount;
|
|
||||||
|
|
||||||
// Viewports
|
// Viewports
|
||||||
ImVector<ImGuiViewportP*> Viewports; // Active viewports (always 1+, and generally 1 unless multi-viewports are enabled). Each viewports hold their copy of ImDrawData.
|
ImVector<ImGuiViewportP*> Viewports; // Active viewports (always 1+, and generally 1 unless multi-viewports are enabled). Each viewports hold their copy of ImDrawData.
|
||||||
float CurrentDpiScale; // == CurrentViewport->DpiScale
|
float CurrentDpiScale; // == CurrentViewport->DpiScale
|
||||||
@ -2356,6 +2355,8 @@ struct ImGuiContext
|
|||||||
ImGuiInputTextDeactivatedState InputTextDeactivatedState;
|
ImGuiInputTextDeactivatedState InputTextDeactivatedState;
|
||||||
ImFont InputTextPasswordFont;
|
ImFont InputTextPasswordFont;
|
||||||
ImGuiID TempInputId; // Temporary text input when CTRL+clicking on a slider, etc.
|
ImGuiID TempInputId; // Temporary text input when CTRL+clicking on a slider, etc.
|
||||||
|
int BeginMenuDepth;
|
||||||
|
int BeginComboDepth;
|
||||||
ImGuiColorEditFlags ColorEditOptions; // Store user options for color edit widgets
|
ImGuiColorEditFlags ColorEditOptions; // Store user options for color edit widgets
|
||||||
ImGuiID ColorEditCurrentID; // Set temporarily while inside of the parent-most ColorEdit4/ColorPicker4 (because they call each others).
|
ImGuiID ColorEditCurrentID; // Set temporarily while inside of the parent-most ColorEdit4/ColorPicker4 (because they call each others).
|
||||||
ImGuiID ColorEditSavedID; // ID we are saving/restoring HS for
|
ImGuiID ColorEditSavedID; // ID we are saving/restoring HS for
|
||||||
@ -2517,7 +2518,6 @@ struct ImGuiContext
|
|||||||
CurrentFocusScopeId = 0;
|
CurrentFocusScopeId = 0;
|
||||||
CurrentItemFlags = ImGuiItemFlags_None;
|
CurrentItemFlags = ImGuiItemFlags_None;
|
||||||
DebugShowGroupRects = false;
|
DebugShowGroupRects = false;
|
||||||
BeginMenuCount = 0;
|
|
||||||
|
|
||||||
CurrentDpiScale = 0.0f;
|
CurrentDpiScale = 0.0f;
|
||||||
CurrentViewport = NULL;
|
CurrentViewport = NULL;
|
||||||
@ -2588,6 +2588,7 @@ struct ImGuiContext
|
|||||||
MouseStationaryTimer = 0.0f;
|
MouseStationaryTimer = 0.0f;
|
||||||
|
|
||||||
TempInputId = 0;
|
TempInputId = 0;
|
||||||
|
BeginMenuDepth = BeginComboDepth = 0;
|
||||||
ColorEditOptions = ImGuiColorEditFlags_DefaultOptions_;
|
ColorEditOptions = ImGuiColorEditFlags_DefaultOptions_;
|
||||||
ColorEditCurrentID = ColorEditSavedID = 0;
|
ColorEditCurrentID = ColorEditSavedID = 0;
|
||||||
ColorEditSavedHue = ColorEditSavedSat = 0.0f;
|
ColorEditSavedHue = ColorEditSavedSat = 0.0f;
|
||||||
@ -3684,7 +3685,7 @@ namespace ImGui
|
|||||||
IMGUI_API void RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border = true, float rounding = 0.0f);
|
IMGUI_API void RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border = true, float rounding = 0.0f);
|
||||||
IMGUI_API void RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding = 0.0f);
|
IMGUI_API void RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding = 0.0f);
|
||||||
IMGUI_API void RenderColorRectWithAlphaCheckerboard(ImDrawList* draw_list, ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, float grid_step, ImVec2 grid_off, float rounding = 0.0f, ImDrawFlags flags = 0);
|
IMGUI_API void RenderColorRectWithAlphaCheckerboard(ImDrawList* draw_list, ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, float grid_step, ImVec2 grid_off, float rounding = 0.0f, ImDrawFlags flags = 0);
|
||||||
IMGUI_API void RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFlags flags = ImGuiNavHighlightFlags_TypeDefault); // Navigation highlight
|
IMGUI_API void RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFlags flags = ImGuiNavHighlightFlags_None); // Navigation highlight
|
||||||
IMGUI_API const char* FindRenderedTextEnd(const char* text, const char* text_end = NULL); // Find the optional ## from which we stop displaying text.
|
IMGUI_API const char* FindRenderedTextEnd(const char* text, const char* text_end = NULL); // Find the optional ## from which we stop displaying text.
|
||||||
IMGUI_API void RenderMouseCursor(ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow);
|
IMGUI_API void RenderMouseCursor(ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow);
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// dear imgui, v1.90.2 WIP
|
// dear imgui, v1.90.2
|
||||||
// (tables and columns code)
|
// (tables and columns code)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -3082,7 +3082,7 @@ void ImGui::TableHeader(const char* label)
|
|||||||
if ((table->RowFlags & ImGuiTableRowFlags_Headers) == 0)
|
if ((table->RowFlags & ImGuiTableRowFlags_Headers) == 0)
|
||||||
TableSetBgColor(ImGuiTableBgTarget_CellBg, GetColorU32(ImGuiCol_TableHeaderBg), table->CurrentColumn);
|
TableSetBgColor(ImGuiTableBgTarget_CellBg, GetColorU32(ImGuiCol_TableHeaderBg), table->CurrentColumn);
|
||||||
}
|
}
|
||||||
RenderNavHighlight(bb, id, ImGuiNavHighlightFlags_TypeThin | ImGuiNavHighlightFlags_NoRounding);
|
RenderNavHighlight(bb, id, ImGuiNavHighlightFlags_Compact | ImGuiNavHighlightFlags_NoRounding);
|
||||||
if (held)
|
if (held)
|
||||||
table->HeldHeaderColumn = (ImGuiTableColumnIdx)column_n;
|
table->HeldHeaderColumn = (ImGuiTableColumnIdx)column_n;
|
||||||
window->DC.CursorPos.y -= g.Style.ItemSpacing.y * 0.5f;
|
window->DC.CursorPos.y -= g.Style.ItemSpacing.y * 0.5f;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// dear imgui, v1.90.2 WIP
|
// dear imgui, v1.90.2
|
||||||
// (widgets code)
|
// (widgets code)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1790,7 +1790,7 @@ bool ImGui::BeginComboPopup(ImGuiID popup_id, const ImRect& bb, ImGuiComboFlags
|
|||||||
|
|
||||||
// This is essentially a specialized version of BeginPopupEx()
|
// This is essentially a specialized version of BeginPopupEx()
|
||||||
char name[16];
|
char name[16];
|
||||||
ImFormatString(name, IM_ARRAYSIZE(name), "##Combo_%02d", g.BeginPopupStack.Size); // Recycle windows based on depth
|
ImFormatString(name, IM_ARRAYSIZE(name), "##Combo_%02d", g.BeginComboDepth); // Recycle windows based on depth
|
||||||
|
|
||||||
// Set position given a custom constraint (peak into expected window size so we can position it)
|
// Set position given a custom constraint (peak into expected window size so we can position it)
|
||||||
// FIXME: This might be easier to express with an hypothetical SetNextWindowPosConstraints() function?
|
// FIXME: This might be easier to express with an hypothetical SetNextWindowPosConstraints() function?
|
||||||
@ -1817,12 +1817,15 @@ bool ImGui::BeginComboPopup(ImGuiID popup_id, const ImRect& bb, ImGuiComboFlags
|
|||||||
IM_ASSERT(0); // This should never happen as we tested for IsPopupOpen() above
|
IM_ASSERT(0); // This should never happen as we tested for IsPopupOpen() above
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
g.BeginComboDepth++;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGui::EndCombo()
|
void ImGui::EndCombo()
|
||||||
{
|
{
|
||||||
|
ImGuiContext& g = *GImGui;
|
||||||
EndPopup();
|
EndPopup();
|
||||||
|
g.BeginComboDepth--;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call directly after the BeginCombo/EndCombo block. The preview is designed to only host non-interactive elements
|
// Call directly after the BeginCombo/EndCombo block. The preview is designed to only host non-interactive elements
|
||||||
@ -4205,11 +4208,14 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|||||||
// Backup state of deactivating item so they'll have a chance to do a write to output buffer on the same frame they report IsItemDeactivatedAfterEdit (#4714)
|
// Backup state of deactivating item so they'll have a chance to do a write to output buffer on the same frame they report IsItemDeactivatedAfterEdit (#4714)
|
||||||
InputTextDeactivateHook(state->ID);
|
InputTextDeactivateHook(state->ID);
|
||||||
|
|
||||||
// Take a copy of the initial buffer value (both in original UTF-8 format and converted to wchar)
|
// From the moment we focused we are normally ignoring the content of 'buf' (unless we are in read-only mode)
|
||||||
// From the moment we focused we are ignoring the content of 'buf' (unless we are in read-only mode)
|
|
||||||
const int buf_len = (int)strlen(buf);
|
const int buf_len = (int)strlen(buf);
|
||||||
|
if (!init_reload_from_user_buf)
|
||||||
|
{
|
||||||
|
// Take a copy of the initial buffer value.
|
||||||
state->InitialTextA.resize(buf_len + 1); // UTF-8. we use +1 to make sure that .Data is always pointing to at least an empty string.
|
state->InitialTextA.resize(buf_len + 1); // UTF-8. we use +1 to make sure that .Data is always pointing to at least an empty string.
|
||||||
memcpy(state->InitialTextA.Data, buf, buf_len + 1);
|
memcpy(state->InitialTextA.Data, buf, buf_len + 1);
|
||||||
|
}
|
||||||
|
|
||||||
// Preserve cursor position and undo/redo stack if we come back to same widget
|
// Preserve cursor position and undo/redo stack if we come back to same widget
|
||||||
// FIXME: Since we reworked this on 2022/06, may want to differentiate recycle_cursor vs recycle_undostate?
|
// FIXME: Since we reworked this on 2022/06, may want to differentiate recycle_cursor vs recycle_undostate?
|
||||||
@ -6342,7 +6348,7 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l
|
|||||||
|
|
||||||
// Render
|
// Render
|
||||||
const ImU32 text_col = GetColorU32(ImGuiCol_Text);
|
const ImU32 text_col = GetColorU32(ImGuiCol_Text);
|
||||||
ImGuiNavHighlightFlags nav_highlight_flags = ImGuiNavHighlightFlags_TypeThin;
|
ImGuiNavHighlightFlags nav_highlight_flags = ImGuiNavHighlightFlags_Compact;
|
||||||
if (display_frame)
|
if (display_frame)
|
||||||
{
|
{
|
||||||
// Framed type
|
// Framed type
|
||||||
@ -6645,7 +6651,7 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl
|
|||||||
RenderFrame(bb.Min, bb.Max, col, false, 0.0f);
|
RenderFrame(bb.Min, bb.Max, col, false, 0.0f);
|
||||||
}
|
}
|
||||||
if (g.NavId == id)
|
if (g.NavId == id)
|
||||||
RenderNavHighlight(bb, id, ImGuiNavHighlightFlags_TypeThin | ImGuiNavHighlightFlags_NoRounding);
|
RenderNavHighlight(bb, id, ImGuiNavHighlightFlags_Compact | ImGuiNavHighlightFlags_NoRounding);
|
||||||
|
|
||||||
if (span_all_columns)
|
if (span_all_columns)
|
||||||
{
|
{
|
||||||
@ -7529,6 +7535,7 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled)
|
|||||||
PopItemFlag();
|
PopItemFlag();
|
||||||
|
|
||||||
bool want_open = false;
|
bool want_open = false;
|
||||||
|
bool want_open_nav_init = false;
|
||||||
bool want_close = false;
|
bool want_close = false;
|
||||||
if (window->DC.LayoutType == ImGuiLayoutType_Vertical) // (window->Flags & (ImGuiWindowFlags_Popup|ImGuiWindowFlags_ChildMenu))
|
if (window->DC.LayoutType == ImGuiLayoutType_Vertical) // (window->Flags & (ImGuiWindowFlags_Popup|ImGuiWindowFlags_ChildMenu))
|
||||||
{
|
{
|
||||||
@ -7571,8 +7578,9 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled)
|
|||||||
want_open = true;
|
want_open = true;
|
||||||
if (g.NavId == id && g.NavMoveDir == ImGuiDir_Right) // Nav-Right to open
|
if (g.NavId == id && g.NavMoveDir == ImGuiDir_Right) // Nav-Right to open
|
||||||
{
|
{
|
||||||
want_open = true;
|
want_open = want_open_nav_init = true;
|
||||||
NavMoveRequestCancel();
|
NavMoveRequestCancel();
|
||||||
|
NavRestoreHighlightAfterMove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -7604,13 +7612,13 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled)
|
|||||||
|
|
||||||
if (want_open && !menu_is_open && g.OpenPopupStack.Size > g.BeginPopupStack.Size)
|
if (want_open && !menu_is_open && g.OpenPopupStack.Size > g.BeginPopupStack.Size)
|
||||||
{
|
{
|
||||||
// Don't reopen/recycle same menu level in the same frame, first close the other menu and yield for a frame.
|
// Don't reopen/recycle same menu level in the same frame if it is a different menu ID, first close the other menu and yield for a frame.
|
||||||
OpenPopup(label);
|
OpenPopup(label);
|
||||||
}
|
}
|
||||||
else if (want_open)
|
else if (want_open)
|
||||||
{
|
{
|
||||||
menu_is_open = true;
|
menu_is_open = true;
|
||||||
OpenPopup(label);
|
OpenPopup(label, ImGuiPopupFlags_NoReopen);// | (want_open_nav_init ? ImGuiPopupFlags_NoReopenAlwaysNavInit : 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (menu_is_open)
|
if (menu_is_open)
|
||||||
@ -7622,6 +7630,14 @@ bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled)
|
|||||||
PopStyleVar();
|
PopStyleVar();
|
||||||
if (menu_is_open)
|
if (menu_is_open)
|
||||||
{
|
{
|
||||||
|
// Implement what ImGuiPopupFlags_NoReopenAlwaysNavInit would do:
|
||||||
|
// Perform an init request in the case the popup was already open (via a previous mouse hover)
|
||||||
|
if (want_open && want_open_nav_init && !g.NavInitRequest)
|
||||||
|
{
|
||||||
|
FocusWindow(g.CurrentWindow, ImGuiFocusRequestFlags_UnlessBelowModal);
|
||||||
|
NavInitWindow(g.CurrentWindow, false);
|
||||||
|
}
|
||||||
|
|
||||||
// Restore LastItemData so IsItemXXXX functions can work after BeginMenu()/EndMenu()
|
// Restore LastItemData so IsItemXXXX functions can work after BeginMenu()/EndMenu()
|
||||||
// (This fixes using IsItemClicked() and IsItemHovered(), but IsItemHovered() also relies on its support for ImGuiItemFlags_NoWindowHoverableCheck)
|
// (This fixes using IsItemClicked() and IsItemHovered(), but IsItemHovered() also relies on its support for ImGuiItemFlags_NoWindowHoverableCheck)
|
||||||
g.LastItemData = last_item_in_parent;
|
g.LastItemData = last_item_in_parent;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user