|
|
@@ -305,6 +305,7 @@
|
|
|
When you are not sure about a old symbol or function name, try using the Search/Find function of your IDE to look for comments or references in all imgui files.
|
|
|
You can read releases logs https://github.com/ocornut/imgui/releases for more details.
|
|
|
|
|
|
+ - 2018/07/08 (1.63) - style: renamed ImGuiCol_ModalWindowDarkening to ImGuiCol_ModalWindowDimBg for consistency with other features. Kept redirection enum (will obsolete).
|
|
|
- 2018/07/06 (1.63) - removed per-window ImGuiWindowFlags_ResizeFromAnySide beta flag in favor of a global io.OptResizeWindowsFromEdges to enable the feature.
|
|
|
- 2018/06/06 (1.62) - renamed GetGlyphRangesChinese() to GetGlyphRangesChineseFull() to distinguish other variants and discourage using the full set.
|
|
|
- 2018/06/06 (1.62) - TreeNodeEx()/TreeNodeBehavior(): the ImGuiTreeNodeFlags_CollapsingHeader helper now include the ImGuiTreeNodeFlags_NoTreePushOnOpen flag. See Changelog for details.
|
|
|
@@ -389,7 +390,7 @@
|
|
|
- 2016/05/07 (1.49) - removed confusing set of GetInternalState(), GetInternalStateSize(), SetInternalState() functions. Now using CreateContext(), DestroyContext(), GetCurrentContext(), SetCurrentContext().
|
|
|
- 2016/05/02 (1.49) - renamed SetNextTreeNodeOpened() to SetNextTreeNodeOpen(), no redirection.
|
|
|
- 2016/05/01 (1.49) - obsoleted old signature of CollapsingHeader(const char* label, const char* str_id = NULL, bool display_frame = true, bool default_open = false) as extra parameters were badly designed and rarely used. You can replace the "default_open = true" flag in new API with CollapsingHeader(label, ImGuiTreeNodeFlags_DefaultOpen).
|
|
|
- - 2016/04/26 (1.49) - changed ImDrawList::PushClipRect(ImVec4 rect) to ImDraw::PushClipRect(Imvec2 min,ImVec2 max,bool intersect_with_current_clip_rect=false). Note that higher-level ImGui::PushClipRect() is preferable because it will clip at logic/widget level, whereas ImDrawList::PushClipRect() only affect your renderer.
|
|
|
+ - 2016/04/26 (1.49) - changed ImDrawList::PushClipRect(ImVec4 rect) to ImDrawList::PushClipRect(Imvec2 min,ImVec2 max,bool intersect_with_current_clip_rect=false). Note that higher-level ImGui::PushClipRect() is preferable because it will clip at logic/widget level, whereas ImDrawList::PushClipRect() only affect your renderer.
|
|
|
- 2016/04/03 (1.48) - removed style.WindowFillAlphaDefault setting which was redundant. Bake default BG alpha inside style.Colors[ImGuiCol_WindowBg] and all other Bg color values. (ref github issue #337).
|
|
|
- 2016/04/03 (1.48) - renamed ImGuiCol_TooltipBg to ImGuiCol_PopupBg, used by popups/menus and tooltips. popups/menus were previously using ImGuiCol_WindowBg. (ref github issue #337)
|
|
|
- 2016/03/21 (1.48) - renamed GetWindowFont() to GetFont(), GetWindowFontSize() to GetFontSize(). Kept inline redirection function (will obsolete).
|
|
|
@@ -841,13 +842,6 @@
|
|
|
#endif
|
|
|
#endif
|
|
|
|
|
|
-// Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall
|
|
|
-#ifdef _MSC_VER
|
|
|
-#define IMGUI_CDECL __cdecl
|
|
|
-#else
|
|
|
-#define IMGUI_CDECL
|
|
|
-#endif
|
|
|
-
|
|
|
static const ImS32 IM_S32_MIN = 0x80000000; // INT_MIN;
|
|
|
static const ImS32 IM_S32_MAX = 0x7FFFFFFF; // INT_MAX;
|
|
|
static const ImU32 IM_U32_MIN = 0;
|
|
|
@@ -870,7 +864,7 @@ static void SetWindowScrollY(ImGuiWindow* window, float new_scroll_y
|
|
|
static void SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond);
|
|
|
static void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond);
|
|
|
static void SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond);
|
|
|
-static ImGuiWindow* FindHoveredWindow();
|
|
|
+static void FindHoveredWindow();
|
|
|
static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFlags flags);
|
|
|
static void CheckStacksSize(ImGuiWindow* window, bool write);
|
|
|
static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window, bool snap_on_edges);
|
|
|
@@ -899,6 +893,7 @@ static bool BeginChildEx(const char* name, ImGuiID id, const ImVec2&
|
|
|
|
|
|
static void NavUpdate();
|
|
|
static void NavUpdateWindowing();
|
|
|
+static void NavUpdateWindowingList();
|
|
|
static void NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, const ImGuiID id);
|
|
|
|
|
|
static void UpdateMouseInputs();
|
|
|
@@ -2138,7 +2133,6 @@ ImGuiWindow::ImGuiWindow(ImGuiContext* context, const char* name)
|
|
|
ParentWindow = NULL;
|
|
|
RootWindow = NULL;
|
|
|
RootWindowForTitleBarHighlight = NULL;
|
|
|
- RootWindowForTabbing = NULL;
|
|
|
RootWindowForNav = NULL;
|
|
|
|
|
|
NavLastIds[0] = NavLastIds[1] = 0;
|
|
|
@@ -2709,7 +2703,7 @@ bool ImGui::IsItemHovered(ImGuiHoveredFlags flags)
|
|
|
return false;
|
|
|
|
|
|
// Test if the item is disabled
|
|
|
- if (window->DC.ItemFlags & ImGuiItemFlags_Disabled)
|
|
|
+ if ((window->DC.ItemFlags & ImGuiItemFlags_Disabled) && !(flags & ImGuiHoveredFlags_AllowWhenDisabled))
|
|
|
return false;
|
|
|
|
|
|
// Special handling for the 1st item after Begin() which represent the title bar. When the window is collapsed (SkipItems==true) that last item will never be overwritten so we need to detect tht case.
|
|
|
@@ -3056,7 +3050,8 @@ static void NavUpdateWindowingHighlightWindow(int focus_change_dir)
|
|
|
ImGuiWindow* window_target = FindWindowNavigable(i_current + focus_change_dir, -INT_MAX, focus_change_dir);
|
|
|
if (!window_target)
|
|
|
window_target = FindWindowNavigable((focus_change_dir < 0) ? (g.Windows.Size - 1) : 0, i_current, focus_change_dir);
|
|
|
- g.NavWindowingTarget = window_target;
|
|
|
+ if (window_target) // Don't reset windowing target if there's a single window in the list
|
|
|
+ g.NavWindowingTarget = window_target;
|
|
|
g.NavWindowingToggleLayer = false;
|
|
|
}
|
|
|
|
|
|
@@ -3067,12 +3062,19 @@ static void ImGui::NavUpdateWindowing()
|
|
|
ImGuiWindow* apply_focus_window = NULL;
|
|
|
bool apply_toggle_layer = false;
|
|
|
|
|
|
+ ImGuiWindow* modal_window = GetFrontMostPopupModal();
|
|
|
+ if (modal_window != NULL)
|
|
|
+ {
|
|
|
+ g.NavWindowingTarget = NULL;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
bool start_windowing_with_gamepad = !g.NavWindowingTarget && IsNavInputPressed(ImGuiNavInput_Menu, ImGuiInputReadMode_Pressed);
|
|
|
bool start_windowing_with_keyboard = !g.NavWindowingTarget && g.IO.KeyCtrl && IsKeyPressedMap(ImGuiKey_Tab) && (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard);
|
|
|
if (start_windowing_with_gamepad || start_windowing_with_keyboard)
|
|
|
if (ImGuiWindow* window = g.NavWindow ? g.NavWindow : FindWindowNavigable(g.Windows.Size - 1, -INT_MAX, -1))
|
|
|
{
|
|
|
- g.NavWindowingTarget = window->RootWindowForTabbing;
|
|
|
+ g.NavWindowingTarget = window;
|
|
|
g.NavWindowingHighlightTimer = g.NavWindowingHighlightAlpha = 0.0f;
|
|
|
g.NavWindowingToggleLayer = start_windowing_with_keyboard ? false : true;
|
|
|
g.NavInputSource = start_windowing_with_keyboard ? ImGuiInputSource_NavKeyboard : ImGuiInputSource_NavGamepad;
|
|
|
@@ -3134,14 +3136,14 @@ static void ImGui::NavUpdateWindowing()
|
|
|
{
|
|
|
const float NAV_MOVE_SPEED = 800.0f;
|
|
|
const float move_speed = ImFloor(NAV_MOVE_SPEED * g.IO.DeltaTime * ImMin(g.IO.DisplayFramebufferScale.x, g.IO.DisplayFramebufferScale.y)); // FIXME: Doesn't code variable framerate very well
|
|
|
- g.NavWindowingTarget->Pos += move_delta * move_speed;
|
|
|
+ g.NavWindowingTarget->RootWindow->Pos += move_delta * move_speed;
|
|
|
g.NavDisableMouseHover = true;
|
|
|
MarkIniSettingsDirty(g.NavWindowingTarget);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// Apply final focus
|
|
|
- if (apply_focus_window && (g.NavWindow == NULL || apply_focus_window != g.NavWindow->RootWindowForTabbing))
|
|
|
+ if (apply_focus_window && (g.NavWindow == NULL || apply_focus_window != g.NavWindow->RootWindow))
|
|
|
{
|
|
|
g.NavDisableHighlight = false;
|
|
|
g.NavDisableMouseHover = true;
|
|
|
@@ -3161,9 +3163,11 @@ static void ImGui::NavUpdateWindowing()
|
|
|
// Apply menu/layer toggle
|
|
|
if (apply_toggle_layer && g.NavWindow)
|
|
|
{
|
|
|
+ // Move to parent menu if necessary
|
|
|
ImGuiWindow* new_nav_window = g.NavWindow;
|
|
|
while ((new_nav_window->DC.NavLayerActiveMask & (1 << 1)) == 0 && (new_nav_window->Flags & ImGuiWindowFlags_ChildWindow) != 0 && (new_nav_window->Flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_ChildMenu)) == 0)
|
|
|
new_nav_window = new_nav_window->ParentWindow;
|
|
|
+
|
|
|
if (new_nav_window != g.NavWindow)
|
|
|
{
|
|
|
ImGuiWindow* old_nav_window = g.NavWindow;
|
|
|
@@ -3176,6 +3180,46 @@ static void ImGui::NavUpdateWindowing()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+// Window has already passed the IsWindowNavFocusable()
|
|
|
+static const char* GetFallbackWindowNameForWindowingList(ImGuiWindow* window)
|
|
|
+{
|
|
|
+ if (window->Flags & ImGuiWindowFlags_Popup)
|
|
|
+ return "(Popup)";
|
|
|
+ if ((window->Flags & ImGuiWindowFlags_MenuBar) && strcmp(window->Name, "##MainMenuBar") == 0)
|
|
|
+ return "(Main menu bar)";
|
|
|
+ return "(Untitled)";
|
|
|
+}
|
|
|
+
|
|
|
+// Overlay displayed when using CTRL+TAB. Called by EndFrame().
|
|
|
+void ImGui::NavUpdateWindowingList()
|
|
|
+{
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
+ if (!g.NavWindowingTarget)
|
|
|
+ {
|
|
|
+ g.NavWindowingList = NULL;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (g.NavWindowingList == NULL)
|
|
|
+ g.NavWindowingList = FindWindowByName("###NavWindowList");
|
|
|
+ SetNextWindowSizeConstraints(ImVec2(g.IO.DisplaySize.x * 0.20f, g.IO.DisplaySize.y * 0.20f), ImVec2(FLT_MAX, FLT_MAX));
|
|
|
+ SetNextWindowPos(g.IO.DisplaySize * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f));
|
|
|
+ PushStyleVar(ImGuiStyleVar_WindowPadding, g.Style.WindowPadding * 2.0f);
|
|
|
+ Begin("###NavWindowList", NULL, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_AlwaysAutoResize);
|
|
|
+ for (int n = g.Windows.Size - 1; n >= 0; n--)
|
|
|
+ {
|
|
|
+ ImGuiWindow* window = g.Windows[n];
|
|
|
+ if (!IsWindowNavFocusable(window))
|
|
|
+ continue;
|
|
|
+ const char* label = window->Name;
|
|
|
+ if (label == FindRenderedTextEnd(label))
|
|
|
+ label = GetFallbackWindowNameForWindowingList(window);
|
|
|
+ Selectable(label, g.NavWindowingTarget == window);
|
|
|
+ }
|
|
|
+ End();
|
|
|
+ PopStyleVar();
|
|
|
+}
|
|
|
+
|
|
|
// Scroll to keep newly navigated item fully into view
|
|
|
// NB: We modify rect_rel by the amount we scrolled for, so it is immediately updated.
|
|
|
static void NavScrollToBringItemIntoView(ImGuiWindow* window, const ImRect& item_rect)
|
|
|
@@ -3550,7 +3594,21 @@ static void ImGui::NavUpdate()
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
-void ImGui::UpdateMovingWindow()
|
|
|
+void ImGui::StartMouseMovingWindow(ImGuiWindow* window)
|
|
|
+{
|
|
|
+ // Set ActiveId even if the _NoMove flag is set. Without it, dragging away from a window with _NoMove would activate hover on other windows.
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
+ FocusWindow(window);
|
|
|
+ SetActiveID(window->MoveId, window);
|
|
|
+ g.NavDisableHighlight = true;
|
|
|
+ g.ActiveIdClickOffset = g.IO.MousePos - window->RootWindow->Pos;
|
|
|
+ if (!(window->Flags & ImGuiWindowFlags_NoMove) && !(window->RootWindow->Flags & ImGuiWindowFlags_NoMove))
|
|
|
+ g.MovingWindow = window;
|
|
|
+}
|
|
|
+
|
|
|
+// Handle mouse moving window
|
|
|
+// Note: moving window with the navigation keys (Square + d-pad / CTRL+TAB + Arrows) are processed in NavUpdateWindowing()
|
|
|
+void ImGui::UpdateMouseMovingWindow()
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
if (g.MovingWindow != NULL)
|
|
|
@@ -3588,6 +3646,11 @@ void ImGui::UpdateMovingWindow()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static bool IsWindowActiveAndVisible(ImGuiWindow* window)
|
|
|
+{
|
|
|
+ return (window->HiddenFrames == 0) && (window->Active);
|
|
|
+}
|
|
|
+
|
|
|
static void ImGui::UpdateMouseInputs()
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
@@ -3647,8 +3710,7 @@ void ImGui::UpdateHoveredWindowAndCaptureFlags()
|
|
|
// - Child windows can extend beyond the limit of their parent so we need to derive HoveredRootWindow from HoveredWindow.
|
|
|
// - When moving a window we can skip the search, which also conveniently bypasses the fact that window->WindowRectClipped is lagging as this point of the frame.
|
|
|
// - We also support the moved window toggling the NoInputs flag after moving has started in order to be able to detect windows below it, which is useful for e.g. docking mechanisms.
|
|
|
- g.HoveredWindow = (g.MovingWindow && !(g.MovingWindow->Flags & ImGuiWindowFlags_NoInputs)) ? g.MovingWindow : FindHoveredWindow();
|
|
|
- g.HoveredRootWindow = g.HoveredWindow ? g.HoveredWindow->RootWindow : NULL;
|
|
|
+ FindHoveredWindow();
|
|
|
|
|
|
// Modal windows prevents cursor from hovering behind them.
|
|
|
ImGuiWindow* modal_window = GetFrontMostPopupModal();
|
|
|
@@ -3814,13 +3876,14 @@ void ImGui::NewFrame()
|
|
|
g.IO.Framerate = (g.FramerateSecPerFrameAccum > 0.0f) ? (1.0f / (g.FramerateSecPerFrameAccum / (float)IM_ARRAYSIZE(g.FramerateSecPerFrame))) : FLT_MAX;
|
|
|
|
|
|
// Handle user moving window with mouse (at the beginning of the frame to avoid input lag or sheering)
|
|
|
- UpdateMovingWindow();
|
|
|
+ UpdateMouseMovingWindow();
|
|
|
UpdateHoveredWindowAndCaptureFlags();
|
|
|
|
|
|
- if (GetFrontMostPopupModal() != NULL)
|
|
|
- g.ModalWindowDarkeningRatio = ImMin(g.ModalWindowDarkeningRatio + g.IO.DeltaTime * 6.0f, 1.0f);
|
|
|
+ // Background darkening/whitening
|
|
|
+ if (GetFrontMostPopupModal() != NULL || g.NavWindowingTarget != NULL)
|
|
|
+ g.DimBgRatio = ImMin(g.DimBgRatio + g.IO.DeltaTime * 6.0f, 1.0f);
|
|
|
else
|
|
|
- g.ModalWindowDarkeningRatio = 0.0f;
|
|
|
+ g.DimBgRatio = 0.0f;
|
|
|
|
|
|
g.MouseCursor = ImGuiMouseCursor_Arrow;
|
|
|
g.WantCaptureMouseNextFrame = g.WantCaptureKeyboardNextFrame = g.WantTextInputNextFrame = -1;
|
|
|
@@ -4330,6 +4393,8 @@ void ImGui::EndFrame()
|
|
|
g.PlatformImeLastPos = g.PlatformImePos;
|
|
|
}
|
|
|
|
|
|
+ NavUpdateWindowingList();
|
|
|
+
|
|
|
// Hide implicit "Debug" window if it hasn't been used
|
|
|
IM_ASSERT(g.CurrentWindowStack.Size == 1); // Mismatched Begin()/End() calls, did you forget to call end on g.CurrentWindow->Name?
|
|
|
if (g.CurrentWindow && !g.CurrentWindow->WriteAccessed)
|
|
|
@@ -4344,20 +4409,9 @@ void ImGui::EndFrame()
|
|
|
if (g.IO.MouseClicked[0])
|
|
|
{
|
|
|
if (g.HoveredRootWindow != NULL)
|
|
|
- {
|
|
|
- // Set ActiveId even if the _NoMove flag is set, without it dragging away from a window with _NoMove would activate hover on other windows.
|
|
|
- FocusWindow(g.HoveredWindow);
|
|
|
- SetActiveID(g.HoveredWindow->MoveId, g.HoveredWindow);
|
|
|
- g.NavDisableHighlight = true;
|
|
|
- g.ActiveIdClickOffset = g.IO.MousePos - g.HoveredRootWindow->Pos;
|
|
|
- if (!(g.HoveredWindow->Flags & ImGuiWindowFlags_NoMove) && !(g.HoveredRootWindow->Flags & ImGuiWindowFlags_NoMove))
|
|
|
- g.MovingWindow = g.HoveredWindow;
|
|
|
- }
|
|
|
+ StartMouseMovingWindow(g.HoveredWindow);
|
|
|
else if (g.NavWindow != NULL && GetFrontMostPopupModal() == NULL)
|
|
|
- {
|
|
|
- // Clicking on void disable focus
|
|
|
- FocusWindow(NULL);
|
|
|
- }
|
|
|
+ FocusWindow(NULL); // Clicking on void disable focus
|
|
|
}
|
|
|
|
|
|
// With right mouse button we close popups without changing focus
|
|
|
@@ -4418,15 +4472,18 @@ void ImGui::Render()
|
|
|
// Gather windows to render
|
|
|
g.IO.MetricsRenderVertices = g.IO.MetricsRenderIndices = g.IO.MetricsActiveWindows = 0;
|
|
|
g.DrawDataBuilder.Clear();
|
|
|
- ImGuiWindow* window_to_render_front_most = (g.NavWindowingTarget && !(g.NavWindowingTarget->Flags & ImGuiWindowFlags_NoBringToFrontOnFocus)) ? g.NavWindowingTarget : NULL;
|
|
|
+ ImGuiWindow* windows_to_render_front_most[2];
|
|
|
+ windows_to_render_front_most[0] = (g.NavWindowingTarget && !(g.NavWindowingTarget->Flags & ImGuiWindowFlags_NoBringToFrontOnFocus)) ? g.NavWindowingTarget->RootWindow : NULL;
|
|
|
+ windows_to_render_front_most[1] = (g.NavWindowingList);
|
|
|
for (int n = 0; n != g.Windows.Size; n++)
|
|
|
{
|
|
|
ImGuiWindow* window = g.Windows[n];
|
|
|
- if (window->Active && window->HiddenFrames == 0 && (window->Flags & ImGuiWindowFlags_ChildWindow) == 0 && window != window_to_render_front_most)
|
|
|
+ if (IsWindowActiveAndVisible(window) && (window->Flags & ImGuiWindowFlags_ChildWindow) == 0 && window != windows_to_render_front_most[0] && window != windows_to_render_front_most[1])
|
|
|
AddWindowToDrawDataSelectLayer(window);
|
|
|
}
|
|
|
- if (window_to_render_front_most && window_to_render_front_most->Active && window_to_render_front_most->HiddenFrames == 0) // NavWindowingTarget is always temporarily displayed as the front-most window
|
|
|
- AddWindowToDrawDataSelectLayer(window_to_render_front_most);
|
|
|
+ for (int n = 0; n < IM_ARRAYSIZE(windows_to_render_front_most); n++)
|
|
|
+ if (windows_to_render_front_most[n] && IsWindowActiveAndVisible(windows_to_render_front_most[n])) // NavWindowingTarget is always temporarily displayed as the front-most window
|
|
|
+ AddWindowToDrawDataSelectLayer(windows_to_render_front_most[n]);
|
|
|
g.DrawDataBuilder.FlattenIntoSingleLayer();
|
|
|
|
|
|
// Draw software mouse cursor if requested
|
|
|
@@ -4814,10 +4871,15 @@ void ImGui::CalcListClipping(int items_count, float items_height, int* out_items
|
|
|
|
|
|
// Find window given position, search front-to-back
|
|
|
// FIXME: Note that we have a lag here because WindowRectClipped is updated in Begin() so windows moved by user via SetWindowPos() and not SetNextWindowPos() will have that rectangle lagging by a frame at the time FindHoveredWindow() is called, aka before the next Begin(). Moving window thankfully isn't affected.
|
|
|
-static ImGuiWindow* FindHoveredWindow()
|
|
|
+static void FindHoveredWindow()
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
- for (int i = g.Windows.Size - 1; i >= 0; i--)
|
|
|
+
|
|
|
+ ImGuiWindow* hovered_window = NULL;
|
|
|
+ if (g.MovingWindow && !(g.MovingWindow->Flags & ImGuiWindowFlags_NoInputs))
|
|
|
+ hovered_window = g.MovingWindow;
|
|
|
+
|
|
|
+ for (int i = g.Windows.Size - 1; i >= 0 && hovered_window == NULL; i--)
|
|
|
{
|
|
|
ImGuiWindow* window = g.Windows[i];
|
|
|
if (!window->Active)
|
|
|
@@ -4828,9 +4890,17 @@ static ImGuiWindow* FindHoveredWindow()
|
|
|
// Using the clipped AABB, a child window will typically be clipped by its parent (not always)
|
|
|
ImRect bb(window->OuterRectClipped.Min - g.Style.TouchExtraPadding, window->OuterRectClipped.Max + g.Style.TouchExtraPadding);
|
|
|
if (bb.Contains(g.IO.MousePos))
|
|
|
- return window;
|
|
|
+ {
|
|
|
+ if (hovered_window == NULL)
|
|
|
+ hovered_window = window;
|
|
|
+ if (hovered_window)
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
- return NULL;
|
|
|
+
|
|
|
+ g.HoveredWindow = hovered_window;
|
|
|
+ g.HoveredRootWindow = g.HoveredWindow ? g.HoveredWindow->RootWindow : NULL;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
// Test if mouse cursor is hovering given rectangle
|
|
|
@@ -5767,10 +5837,9 @@ static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFl
|
|
|
|
|
|
// User can disable loading and saving of settings. Tooltip and child windows also don't store settings.
|
|
|
if (!(flags & ImGuiWindowFlags_NoSavedSettings))
|
|
|
- {
|
|
|
- // Retrieve settings from .ini file
|
|
|
if (ImGuiWindowSettings* settings = ImGui::FindWindowSettings(window->ID))
|
|
|
{
|
|
|
+ // Retrieve settings from .ini file
|
|
|
window->SettingsIdx = g.SettingsWindows.index_from_pointer(settings);
|
|
|
SetWindowConditionAllowFlags(window, ImGuiCond_FirstUseEver, false);
|
|
|
window->Pos = ImFloor(settings->Pos);
|
|
|
@@ -5778,8 +5847,8 @@ static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFl
|
|
|
if (ImLengthSqr(settings->Size) > 0.00001f)
|
|
|
size = ImFloor(settings->Size);
|
|
|
}
|
|
|
- }
|
|
|
window->Size = window->SizeFull = window->SizeFullAtLastBegin = size;
|
|
|
+ window->DC.CursorMaxPos = window->Pos; // So first call to CalcSizeContents() doesn't return crazy values
|
|
|
|
|
|
if ((flags & ImGuiWindowFlags_AlwaysAutoResize) != 0)
|
|
|
{
|
|
|
@@ -6029,7 +6098,7 @@ static void ImGui::UpdateManualResize(ImGuiWindow* window, const ImVec2& size_au
|
|
|
PopID();
|
|
|
|
|
|
// Navigation resize (keyboard/gamepad)
|
|
|
- if (g.NavWindowingTarget == window)
|
|
|
+ if (g.NavWindowingTarget && g.NavWindowingTarget->RootWindow == window)
|
|
|
{
|
|
|
ImVec2 nav_resize_delta;
|
|
|
if (g.NavInputSource == ImGuiInputSource_NavKeyboard && g.IO.KeyShift)
|
|
|
@@ -6101,6 +6170,12 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
else
|
|
|
flags = window->Flags;
|
|
|
|
|
|
+ // Parent window is latched only on the first call to Begin() of the frame, so further append-calls can be done from a different window stack
|
|
|
+ ImGuiWindow* parent_window_in_stack = g.CurrentWindowStack.empty() ? NULL : g.CurrentWindowStack.back();
|
|
|
+ ImGuiWindow* parent_window = first_begin_of_the_frame ? ((flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Popup)) ? parent_window_in_stack : NULL) : window->ParentWindow;
|
|
|
+ IM_ASSERT(parent_window != NULL || !(flags & ImGuiWindowFlags_ChildWindow));
|
|
|
+ window->HasCloseButton = (p_open != NULL);
|
|
|
+
|
|
|
// Update the Appearing flag
|
|
|
bool window_just_activated_by_user = (window->LastFrameActive < current_frame - 1); // Not using !WasActive because the implicit "Debug" window would always toggle off->on
|
|
|
const bool window_just_appearing_after_hidden_for_resize = (window->HiddenFrames > 0);
|
|
|
@@ -6111,15 +6186,9 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
window_just_activated_by_user |= (window != popup_ref.Window);
|
|
|
}
|
|
|
window->Appearing = (window_just_activated_by_user || window_just_appearing_after_hidden_for_resize);
|
|
|
- window->HasCloseButton = (p_open != NULL);
|
|
|
if (window->Appearing)
|
|
|
SetWindowConditionAllowFlags(window, ImGuiCond_Appearing, true);
|
|
|
|
|
|
- // Parent window is latched only on the first call to Begin() of the frame, so further append-calls can be done from a different window stack
|
|
|
- ImGuiWindow* parent_window_in_stack = g.CurrentWindowStack.empty() ? NULL : g.CurrentWindowStack.back();
|
|
|
- ImGuiWindow* parent_window = first_begin_of_the_frame ? ((flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Popup)) ? parent_window_in_stack : NULL) : window->ParentWindow;
|
|
|
- IM_ASSERT(parent_window != NULL || !(flags & ImGuiWindowFlags_ChildWindow));
|
|
|
-
|
|
|
// Add to stack
|
|
|
g.CurrentWindowStack.push_back(window);
|
|
|
SetCurrentWindow(window);
|
|
|
@@ -6185,11 +6254,11 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
|
|
|
// Initialize
|
|
|
window->ParentWindow = parent_window;
|
|
|
- window->RootWindow = window->RootWindowForTitleBarHighlight = window->RootWindowForTabbing = window->RootWindowForNav = window;
|
|
|
+ window->RootWindow = window->RootWindowForTitleBarHighlight = window->RootWindowForNav = window;
|
|
|
if (parent_window && (flags & ImGuiWindowFlags_ChildWindow) && !window_is_child_tooltip)
|
|
|
window->RootWindow = parent_window->RootWindow;
|
|
|
if (parent_window && !(flags & ImGuiWindowFlags_Modal) && (flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Popup)))
|
|
|
- window->RootWindowForTitleBarHighlight = window->RootWindowForTabbing = parent_window->RootWindowForTitleBarHighlight; // Same value in master branch, will differ for docking
|
|
|
+ window->RootWindowForTitleBarHighlight = parent_window->RootWindowForTitleBarHighlight;
|
|
|
while (window->RootWindowForNav->Flags & ImGuiWindowFlags_NavFlattened)
|
|
|
window->RootWindowForNav = window->RootWindowForNav->ParentWindow;
|
|
|
|
|
|
@@ -6346,7 +6415,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
// Lock window rounding for the frame (so that altering them doesn't cause inconsistencies)
|
|
|
window->WindowRounding = (flags & ImGuiWindowFlags_ChildWindow) ? style.ChildRounding : ((flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiWindowFlags_Modal)) ? style.PopupRounding : style.WindowRounding;
|
|
|
|
|
|
- // Prepare for focus requests
|
|
|
+ // Prepare for item focus requests
|
|
|
window->FocusIdxAllRequestCurrent = (window->FocusIdxAllRequestNext == INT_MAX || window->FocusIdxAllCounter == -1) ? INT_MAX : (window->FocusIdxAllRequestNext + (window->FocusIdxAllCounter+1)) % (window->FocusIdxAllCounter+1);
|
|
|
window->FocusIdxTabRequestCurrent = (window->FocusIdxTabRequestNext == INT_MAX || window->FocusIdxTabCounter == -1) ? INT_MAX : (window->FocusIdxTabRequestNext + (window->FocusIdxTabCounter+1)) % (window->FocusIdxTabCounter+1);
|
|
|
window->FocusIdxAllCounter = window->FocusIdxTabCounter = -1;
|
|
|
@@ -6356,7 +6425,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
window->Scroll = CalcNextScrollFromScrollTargetAndClamp(window, true);
|
|
|
window->ScrollTarget = ImVec2(FLT_MAX, FLT_MAX);
|
|
|
|
|
|
- // Apply focus, new windows appears in front
|
|
|
+ // Apply window focus (new and reactivated windows are moved to front)
|
|
|
bool want_focus = false;
|
|
|
if (window_just_activated_by_user && !(flags & ImGuiWindowFlags_NoFocusOnAppearing))
|
|
|
if (!(flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Tooltip)) || (flags & ImGuiWindowFlags_Popup))
|
|
|
@@ -6388,23 +6457,29 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
else
|
|
|
PushClipRect(viewport_rect.Min, viewport_rect.Max, true);
|
|
|
|
|
|
- // Draw modal window background (darkens what is behind them)
|
|
|
- if ((flags & ImGuiWindowFlags_Modal) != 0 && window == GetFrontMostPopupModal())
|
|
|
- window->DrawList->AddRectFilled(viewport_rect.Min, viewport_rect.Max, GetColorU32(ImGuiCol_ModalWindowDarkening, g.ModalWindowDarkeningRatio));
|
|
|
+ // Draw modal window background (darkens what is behind them, all viewports)
|
|
|
+ const bool dim_bg_for_modal = (flags & ImGuiWindowFlags_Modal) && window == GetFrontMostPopupModal() && window->HiddenFrames <= 0;
|
|
|
+ const bool dim_bg_for_window_list = g.NavWindowingTarget && (window == g.NavWindowingTarget->RootWindow);
|
|
|
+ if (dim_bg_for_modal || dim_bg_for_window_list)
|
|
|
+ {
|
|
|
+ const ImU32 dim_bg_col = GetColorU32(dim_bg_for_modal ? ImGuiCol_ModalWindowDimBg : ImGuiCol_NavWindowListDimBg, g.DimBgRatio);
|
|
|
+ window->DrawList->AddRectFilled(viewport_rect.Min, viewport_rect.Max, dim_bg_col);
|
|
|
+ }
|
|
|
|
|
|
// Draw navigation selection/windowing rectangle background
|
|
|
- if (g.NavWindowingTarget == window)
|
|
|
+ if (dim_bg_for_window_list && window == g.NavWindowingTarget->RootWindow)
|
|
|
{
|
|
|
ImRect bb = window->Rect();
|
|
|
bb.Expand(g.FontSize);
|
|
|
if (!bb.Contains(viewport_rect)) // Avoid drawing if the window covers all the viewport anyway
|
|
|
- window->DrawList->AddRectFilled(bb.Min, bb.Max, GetColorU32(ImGuiCol_NavWindowingHighlight, g.NavWindowingHighlightAlpha * 0.25f), g.Style.WindowRounding);
|
|
|
+ window->DrawList->AddRectFilled(bb.Min, bb.Max, GetColorU32(ImGuiCol_NavWindowListHighlight, g.NavWindowingHighlightAlpha * 0.25f), g.Style.WindowRounding);
|
|
|
}
|
|
|
|
|
|
// Draw window + handle manual resize
|
|
|
const float window_rounding = window->WindowRounding;
|
|
|
const float window_border_size = window->WindowBorderSize;
|
|
|
- const bool title_bar_is_highlight = want_focus || (g.NavWindow && window->RootWindowForTitleBarHighlight == g.NavWindow->RootWindowForTitleBarHighlight);
|
|
|
+ const ImGuiWindow* window_to_highlight = g.NavWindowingTarget ? g.NavWindowingTarget : g.NavWindow;
|
|
|
+ const bool title_bar_is_highlight = want_focus || (window_to_highlight && window->RootWindowForTitleBarHighlight == window_to_highlight->RootWindowForTitleBarHighlight);
|
|
|
const ImRect title_bar_rect = window->TitleBarRect();
|
|
|
if (window->Collapsed)
|
|
|
{
|
|
|
@@ -6424,7 +6499,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
bg_col = (bg_col & ~IM_COL32_A_MASK) | (IM_F32_TO_INT8_SAT(g.NextWindowData.BgAlphaVal) << IM_COL32_A_SHIFT);
|
|
|
g.NextWindowData.BgAlphaCond = 0;
|
|
|
}
|
|
|
- window->DrawList->AddRectFilled(window->Pos+ImVec2(0,window->TitleBarHeight()), window->Pos+window->Size, bg_col, window_rounding, (flags & ImGuiWindowFlags_NoTitleBar) ? ImDrawCornerFlags_All : ImDrawCornerFlags_Bot);
|
|
|
+ window->DrawList->AddRectFilled(window->Pos + ImVec2(0, window->TitleBarHeight()), window->Pos + window->Size, bg_col, window_rounding, (flags & ImGuiWindowFlags_NoTitleBar) ? ImDrawCornerFlags_All : ImDrawCornerFlags_Bot);
|
|
|
|
|
|
// Title bar
|
|
|
ImU32 title_bar_col = GetColorU32(window->Collapsed ? ImGuiCol_TitleBgCollapsed : title_bar_is_highlight ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBg);
|
|
|
@@ -6470,7 +6545,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
window->DrawList->AddLine(border.Min, border.Max, GetColorU32(ImGuiCol_SeparatorActive), ImMax(1.0f, window_border_size));
|
|
|
}
|
|
|
if (style.FrameBorderSize > 0 && !(flags & ImGuiWindowFlags_NoTitleBar))
|
|
|
- window->DrawList->AddLine(title_bar_rect.GetBL() + ImVec2(style.WindowBorderSize, -1), title_bar_rect.GetBR() + ImVec2(-style.WindowBorderSize,-1), GetColorU32(ImGuiCol_Border), style.FrameBorderSize);
|
|
|
+ window->DrawList->AddLine(title_bar_rect.GetBL() + ImVec2(style.WindowBorderSize, -1), title_bar_rect.GetBR() + ImVec2(-style.WindowBorderSize, -1), GetColorU32(ImGuiCol_Border), style.FrameBorderSize);
|
|
|
}
|
|
|
|
|
|
// Draw navigation selection/windowing rectangle border
|
|
|
@@ -6484,7 +6559,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
bb.Expand(-g.FontSize - 1.0f);
|
|
|
rounding = window->WindowRounding;
|
|
|
}
|
|
|
- window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_NavWindowingHighlight, g.NavWindowingHighlightAlpha), rounding, ~0, 3.0f);
|
|
|
+ window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_NavWindowListHighlight, g.NavWindowingHighlightAlpha), rounding, ~0, 3.0f);
|
|
|
}
|
|
|
|
|
|
// Store a backup of SizeFull which we will use next frame to decide if we need scrollbars.
|
|
|
@@ -6640,10 +6715,11 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
window->BeginCount++;
|
|
|
g.NextWindowData.Clear();
|
|
|
|
|
|
- // Child window can be out of sight and have "negative" clip windows.
|
|
|
- // Mark them as collapsed so commands are skipped earlier (we can't manually collapse them because they have no title bar).
|
|
|
+
|
|
|
if (flags & ImGuiWindowFlags_ChildWindow)
|
|
|
{
|
|
|
+ // Child window can be out of sight and have "negative" clip windows.
|
|
|
+ // Mark them as collapsed so commands are skipped earlier (we can't manually collapse them because they have no title bar).
|
|
|
IM_ASSERT((flags & ImGuiWindowFlags_NoTitleBar) != 0);
|
|
|
window->Collapsed = parent_window && parent_window->Collapsed;
|
|
|
|
|
|
@@ -6655,6 +6731,8 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
if (window->Collapsed)
|
|
|
window->Active = false;
|
|
|
}
|
|
|
+
|
|
|
+ // Don't render if style alpha is 0.0 at the time of Begin(). This is arbitrary and inconsistent but has been there for a long while (may remove at some point)
|
|
|
if (style.Alpha <= 0.0f)
|
|
|
window->Active = false;
|
|
|
|
|
|
@@ -7178,10 +7256,11 @@ const char* ImGui::GetStyleColorName(ImGuiCol idx)
|
|
|
case ImGuiCol_PlotHistogram: return "PlotHistogram";
|
|
|
case ImGuiCol_PlotHistogramHovered: return "PlotHistogramHovered";
|
|
|
case ImGuiCol_TextSelectedBg: return "TextSelectedBg";
|
|
|
- case ImGuiCol_ModalWindowDarkening: return "ModalWindowDarkening";
|
|
|
case ImGuiCol_DragDropTarget: return "DragDropTarget";
|
|
|
case ImGuiCol_NavHighlight: return "NavHighlight";
|
|
|
- case ImGuiCol_NavWindowingHighlight: return "NavWindowingHighlight";
|
|
|
+ case ImGuiCol_NavWindowListHighlight: return "NavWindowListHighlight";
|
|
|
+ case ImGuiCol_NavWindowListDimBg: return "NavWindowListDimBg";
|
|
|
+ case ImGuiCol_ModalWindowDimBg: return "ModalWindowDimBg";
|
|
|
}
|
|
|
IM_ASSERT(0);
|
|
|
return "Unknown";
|
|
|
@@ -7266,7 +7345,7 @@ bool ImGui::IsWindowFocused(ImGuiFocusedFlags flags)
|
|
|
bool ImGui::IsWindowNavFocusable(ImGuiWindow* window)
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
- return window->Active && window == window->RootWindowForTabbing && (!(window->Flags & ImGuiWindowFlags_NoNavFocus) || window == g.NavWindow);
|
|
|
+ return window->Active && window == window->RootWindow && (!(window->Flags & ImGuiWindowFlags_NoNavFocus) || window == g.NavWindow);
|
|
|
}
|
|
|
|
|
|
float ImGui::GetWindowWidth()
|
|
|
@@ -13856,11 +13935,14 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|
|
if (ImGui::Begin("ImGui Metrics", p_open))
|
|
|
{
|
|
|
static bool show_draw_cmd_clip_rects = true;
|
|
|
+ static bool show_window_begin_order = false;
|
|
|
ImGui::Text("Dear ImGui %s", ImGui::GetVersion());
|
|
|
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
|
|
|
ImGui::Text("%d vertices, %d indices (%d triangles)", ImGui::GetIO().MetricsRenderVertices, ImGui::GetIO().MetricsRenderIndices, ImGui::GetIO().MetricsRenderIndices / 3);
|
|
|
ImGui::Text("%d allocations", (int)GImAllocatorActiveAllocationsCount);
|
|
|
ImGui::Checkbox("Show clipping rectangles when hovering draw commands", &show_draw_cmd_clip_rects);
|
|
|
+ ImGui::Checkbox("Ctrl shows window begin order", &show_window_begin_order);
|
|
|
+
|
|
|
ImGui::Separator();
|
|
|
|
|
|
struct Funcs
|
|
|
@@ -13950,12 +14032,12 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|
|
ImGuiWindowFlags flags = window->Flags;
|
|
|
NodeDrawList(window, window->DrawList, "DrawList");
|
|
|
ImGui::BulletText("Pos: (%.1f,%.1f), Size: (%.1f,%.1f), SizeContents (%.1f,%.1f)", window->Pos.x, window->Pos.y, window->Size.x, window->Size.y, window->SizeContents.x, window->SizeContents.y);
|
|
|
- ImGui::BulletText("Flags: 0x%08X (%s%s%s%s%s%s%s..)", flags,
|
|
|
+ ImGui::BulletText("Flags: 0x%08X (%s%s%s%s%s%s%s%s..)", flags,
|
|
|
(flags & ImGuiWindowFlags_ChildWindow) ? "Child " : "", (flags & ImGuiWindowFlags_Tooltip) ? "Tooltip " : "", (flags & ImGuiWindowFlags_Popup) ? "Popup " : "",
|
|
|
(flags & ImGuiWindowFlags_Modal) ? "Modal " : "", (flags & ImGuiWindowFlags_ChildMenu) ? "ChildMenu " : "", (flags & ImGuiWindowFlags_NoSavedSettings) ? "NoSavedSettings " : "",
|
|
|
- (flags & ImGuiWindowFlags_AlwaysAutoResize) ? "AlwaysAutoResize" : "");
|
|
|
+ (flags & ImGuiWindowFlags_NoInputs) ? "NoInputs":"", (flags & ImGuiWindowFlags_AlwaysAutoResize) ? "AlwaysAutoResize" : "");
|
|
|
ImGui::BulletText("Scroll: (%.2f/%.2f,%.2f/%.2f)", window->Scroll.x, GetScrollMaxX(window), window->Scroll.y, GetScrollMaxY(window));
|
|
|
- ImGui::BulletText("Active: %d, WriteAccessed: %d", window->Active || window->WasActive, window->WriteAccessed);
|
|
|
+ ImGui::BulletText("Active: %d/%d, WriteAccessed: %d, BeginOrderWithinContext: %d", window->Active, window->WasActive, window->WriteAccessed, (window->Active || window->WasActive) ? window->BeginOrderWithinContext : -1);
|
|
|
ImGui::BulletText("NavLastIds: 0x%08X,0x%08X, NavLayerActiveMask: %X", window->NavLastIds[0], window->NavLastIds[1], window->DC.NavLayerActiveMask);
|
|
|
ImGui::BulletText("NavLastChildNavWindow: %s", window->NavLastChildNavWindow ? window->NavLastChildNavWindow->Name : "NULL");
|
|
|
if (!window->NavRectRel[0].IsInverted())
|
|
|
@@ -13994,7 +14076,7 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|
|
Funcs::NodeDrawList(NULL, g.DrawDataBuilder.Layers[0][i], "DrawList");
|
|
|
ImGui::TreePop();
|
|
|
}
|
|
|
- if (ImGui::TreeNode("Popups", "Open Popups Stack (%d)", g.OpenPopupStack.Size))
|
|
|
+ if (ImGui::TreeNode("Popups", "Popups (%d)", g.OpenPopupStack.Size))
|
|
|
{
|
|
|
for (int i = 0; i < g.OpenPopupStack.Size; i++)
|
|
|
{
|
|
|
@@ -14018,9 +14100,27 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|
|
ImGui::Text("NavActive: %d, NavVisible: %d", g.IO.NavActive, g.IO.NavVisible);
|
|
|
ImGui::Text("NavActivateId: 0x%08X, NavInputId: 0x%08X", g.NavActivateId, g.NavInputId);
|
|
|
ImGui::Text("NavDisableHighlight: %d, NavDisableMouseHover: %d", g.NavDisableHighlight, g.NavDisableMouseHover);
|
|
|
+ ImGui::Text("NavWindowingTarget: '%s'", g.NavWindowingTarget ? g.NavWindowingTarget->Name : "NULL");
|
|
|
ImGui::Text("DragDrop: %d, SourceId = 0x%08X, Payload \"%s\" (%d bytes)", g.DragDropActive, g.DragDropPayload.SourceId, g.DragDropPayload.DataType, g.DragDropPayload.DataSize);
|
|
|
ImGui::TreePop();
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+ if (g.IO.KeyCtrl && show_window_begin_order)
|
|
|
+ {
|
|
|
+ for (int n = 0; n < g.Windows.Size; n++)
|
|
|
+ {
|
|
|
+ ImGuiWindow* window = g.Windows[n];
|
|
|
+ if ((window->Flags & ImGuiWindowFlags_ChildWindow) || !window->WasActive)
|
|
|
+ continue;
|
|
|
+ char buf[32];
|
|
|
+ ImFormatString(buf, IM_ARRAYSIZE(buf), "%d", window->BeginOrderWithinContext);
|
|
|
+ float font_size = ImGui::GetFontSize() * 2;
|
|
|
+ ImDrawList* overlay_draw_list = GetOverlayDrawList();
|
|
|
+ overlay_draw_list->AddRectFilled(window->Pos, window->Pos + ImVec2(font_size, font_size), IM_COL32(200, 100, 100, 255));
|
|
|
+ overlay_draw_list->AddText(NULL, font_size, window->Pos, IM_COL32(255, 255, 255, 255), buf);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
ImGui::End();
|
|
|
}
|