|
@@ -1,4 +1,4 @@
|
|
|
-// dear imgui, v1.90.6
|
|
|
+// dear imgui, v1.90.7 WIP
|
|
|
// (main code and documentation)
|
|
|
|
|
|
// Help:
|
|
@@ -1088,7 +1088,6 @@ static const float DOCKING_TRANSPARENT_PAYLOAD_ALPHA = 0.50f; // For u
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
|
static void SetCurrentWindow(ImGuiWindow* window);
|
|
|
-static void FindHoveredWindow();
|
|
|
static ImGuiWindow* CreateNewWindow(const char* name, ImGuiWindowFlags flags);
|
|
|
static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window);
|
|
|
|
|
@@ -4657,6 +4656,9 @@ void ImGui::UpdateHoveredWindowAndCaptureFlags()
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
ImGuiIO& io = g.IO;
|
|
|
+
|
|
|
+ // FIXME-DPI: This storage was added on 2021/03/31 for test engine, but if we want to multiply WINDOWS_HOVER_PADDING
|
|
|
+ // by DpiScale, we need to make this window-agnostic anyhow, maybe need storing inside ImGuiWindow.
|
|
|
g.WindowsHoverPadding = ImMax(g.Style.TouchExtraPadding, ImVec2(WINDOWS_HOVER_PADDING, WINDOWS_HOVER_PADDING));
|
|
|
|
|
|
// Find the window hovered by mouse:
|
|
@@ -4664,7 +4666,7 @@ void ImGui::UpdateHoveredWindowAndCaptureFlags()
|
|
|
// - 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.
|
|
|
bool clear_hovered_windows = false;
|
|
|
- FindHoveredWindow();
|
|
|
+ FindHoveredWindowEx(g.IO.MousePos, false, &g.HoveredWindow, &g.HoveredWindowUnderMovingWindow);
|
|
|
IM_ASSERT(g.HoveredWindow == NULL || g.HoveredWindow == g.MovingWindow || g.HoveredWindow->Viewport == g.MouseViewport);
|
|
|
|
|
|
// Modal windows prevents mouse from hovering behind them.
|
|
@@ -5465,22 +5467,26 @@ ImVec2 ImGui::CalcTextSize(const char* text, const char* text_end, bool hide_tex
|
|
|
}
|
|
|
|
|
|
// Find window given position, search front-to-back
|
|
|
-// FIXME: Note that we have an inconsequential lag here: OuterRectClipped is updated in Begin(), so windows moved programmatically
|
|
|
-// with 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 isn't affected.
|
|
|
-static void FindHoveredWindow()
|
|
|
+// - Typically write output back to g.HoveredWindow and g.HoveredWindowUnderMovingWindow.
|
|
|
+// - FIXME: Note that we have an inconsequential lag here: OuterRectClipped is updated in Begin(), so windows moved programmatically
|
|
|
+// with 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 isn't affected.
|
|
|
+// - The 'find_first_and_in_any_viewport = true' mode is only used by TestEngine. It is simpler to maintain here.
|
|
|
+void ImGui::FindHoveredWindowEx(const ImVec2& pos, bool find_first_and_in_any_viewport, ImGuiWindow** out_hovered_window, ImGuiWindow** out_hovered_window_under_moving_window)
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
+ ImGuiWindow* hovered_window = NULL;
|
|
|
+ ImGuiWindow* hovered_window_under_moving_window = NULL;
|
|
|
|
|
|
// Special handling for the window being moved: Ignore the mouse viewport check (because it may reset/lose its viewport during the undocking frame)
|
|
|
- ImGuiViewportP* moving_window_viewport = g.MovingWindow ? g.MovingWindow->Viewport : NULL;
|
|
|
- if (g.MovingWindow)
|
|
|
+ ImGuiViewportP* backup_moving_window_viewport = NULL;
|
|
|
+ if (find_first_and_in_any_viewport == false && g.MovingWindow)
|
|
|
+ {
|
|
|
+ backup_moving_window_viewport = g.MovingWindow->Viewport;
|
|
|
g.MovingWindow->Viewport = g.MouseViewport;
|
|
|
-
|
|
|
- ImGuiWindow* hovered_window = NULL;
|
|
|
- ImGuiWindow* hovered_window_ignoring_moving_window = NULL;
|
|
|
- if (g.MovingWindow && !(g.MovingWindow->Flags & ImGuiWindowFlags_NoMouseInputs))
|
|
|
- hovered_window = g.MovingWindow;
|
|
|
+ if (!(g.MovingWindow->Flags & ImGuiWindowFlags_NoMouseInputs))
|
|
|
+ hovered_window = g.MovingWindow;
|
|
|
+ }
|
|
|
|
|
|
ImVec2 padding_regular = g.Style.TouchExtraPadding;
|
|
|
ImVec2 padding_for_resize = g.IO.ConfigWindowsResizeFromEdges ? g.WindowsHoverPadding : padding_regular;
|
|
@@ -5498,7 +5504,7 @@ static void FindHoveredWindow()
|
|
|
|
|
|
// Using the clipped AABB, a child window will typically be clipped by its parent (not always)
|
|
|
ImVec2 hit_padding = (window->Flags & (ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize)) ? padding_regular : padding_for_resize;
|
|
|
- if (!window->OuterRectClipped.ContainsWithPad(g.IO.MousePos, hit_padding))
|
|
|
+ if (!window->OuterRectClipped.ContainsWithPad(pos, hit_padding))
|
|
|
continue;
|
|
|
|
|
|
// Support for one rectangular hole in any given window
|
|
@@ -5507,24 +5513,32 @@ static void FindHoveredWindow()
|
|
|
{
|
|
|
ImVec2 hole_pos(window->Pos.x + (float)window->HitTestHoleOffset.x, window->Pos.y + (float)window->HitTestHoleOffset.y);
|
|
|
ImVec2 hole_size((float)window->HitTestHoleSize.x, (float)window->HitTestHoleSize.y);
|
|
|
- if (ImRect(hole_pos, hole_pos + hole_size).Contains(g.IO.MousePos))
|
|
|
+ if (ImRect(hole_pos, hole_pos + hole_size).Contains(pos))
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- if (hovered_window == NULL)
|
|
|
+ if (find_first_and_in_any_viewport)
|
|
|
+ {
|
|
|
hovered_window = window;
|
|
|
- IM_MSVC_WARNING_SUPPRESS(28182); // [Static Analyzer] Dereferencing NULL pointer.
|
|
|
- if (hovered_window_ignoring_moving_window == NULL && (!g.MovingWindow || window->RootWindowDockTree != g.MovingWindow->RootWindowDockTree))
|
|
|
- hovered_window_ignoring_moving_window = window;
|
|
|
- if (hovered_window && hovered_window_ignoring_moving_window)
|
|
|
break;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (hovered_window == NULL)
|
|
|
+ hovered_window = window;
|
|
|
+ IM_MSVC_WARNING_SUPPRESS(28182); // [Static Analyzer] Dereferencing NULL pointer.
|
|
|
+ if (hovered_window_under_moving_window == NULL && (!g.MovingWindow || window->RootWindowDockTree != g.MovingWindow->RootWindowDockTree))
|
|
|
+ hovered_window_under_moving_window = window;
|
|
|
+ if (hovered_window && hovered_window_under_moving_window)
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- g.HoveredWindow = hovered_window;
|
|
|
- g.HoveredWindowUnderMovingWindow = hovered_window_ignoring_moving_window;
|
|
|
-
|
|
|
- if (g.MovingWindow)
|
|
|
- g.MovingWindow->Viewport = moving_window_viewport;
|
|
|
+ *out_hovered_window = hovered_window;
|
|
|
+ if (out_hovered_window_under_moving_window != NULL)
|
|
|
+ *out_hovered_window_under_moving_window = hovered_window_under_moving_window;
|
|
|
+ if (find_first_and_in_any_viewport == false && g.MovingWindow)
|
|
|
+ g.MovingWindow->Viewport = backup_moving_window_viewport;
|
|
|
}
|
|
|
|
|
|
bool ImGui::IsItemActive()
|
|
@@ -10271,8 +10285,8 @@ bool ImGui::Shortcut(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiInputFlags
|
|
|
// [SECTION] ERROR CHECKING
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
-// Helper function to verify ABI compatibility between caller code and compiled version of Dear ImGui.
|
|
|
-// This is called by IMGUI_CHECKVERSION().
|
|
|
+// Verify ABI compatibility between caller code and compiled version of Dear ImGui. This helps detects some build issues.
|
|
|
+// Called by IMGUI_CHECKVERSION().
|
|
|
// Verify that the type sizes are matching between the calling file's compilation unit and imgui.cpp's compilation unit
|
|
|
// If this triggers you have mismatched headers and compiled code versions.
|
|
|
// - It could be because of a build issue (using new headers with old compiled code)
|
|
@@ -10285,12 +10299,12 @@ bool ImGui::DebugCheckVersionAndDataLayout(const char* version, size_t sz_io, si
|
|
|
{
|
|
|
bool error = false;
|
|
|
if (strcmp(version, IMGUI_VERSION) != 0) { error = true; IM_ASSERT(strcmp(version, IMGUI_VERSION) == 0 && "Mismatched version string!"); }
|
|
|
- if (sz_io != sizeof(ImGuiIO)) { error = true; IM_ASSERT(sz_io == sizeof(ImGuiIO) && "Mismatched struct layout!"); }
|
|
|
+ if (sz_io != sizeof(ImGuiIO)) { error = true; IM_ASSERT(sz_io == sizeof(ImGuiIO) && "Mismatched struct layout!"); }
|
|
|
if (sz_style != sizeof(ImGuiStyle)) { error = true; IM_ASSERT(sz_style == sizeof(ImGuiStyle) && "Mismatched struct layout!"); }
|
|
|
- if (sz_vec2 != sizeof(ImVec2)) { error = true; IM_ASSERT(sz_vec2 == sizeof(ImVec2) && "Mismatched struct layout!"); }
|
|
|
- if (sz_vec4 != sizeof(ImVec4)) { error = true; IM_ASSERT(sz_vec4 == sizeof(ImVec4) && "Mismatched struct layout!"); }
|
|
|
- if (sz_vert != sizeof(ImDrawVert)) { error = true; IM_ASSERT(sz_vert == sizeof(ImDrawVert) && "Mismatched struct layout!"); }
|
|
|
- if (sz_idx != sizeof(ImDrawIdx)) { error = true; IM_ASSERT(sz_idx == sizeof(ImDrawIdx) && "Mismatched struct layout!"); }
|
|
|
+ if (sz_vec2 != sizeof(ImVec2)) { error = true; IM_ASSERT(sz_vec2 == sizeof(ImVec2) && "Mismatched struct layout!"); }
|
|
|
+ if (sz_vec4 != sizeof(ImVec4)) { error = true; IM_ASSERT(sz_vec4 == sizeof(ImVec4) && "Mismatched struct layout!"); }
|
|
|
+ if (sz_vert != sizeof(ImDrawVert)) { error = true; IM_ASSERT(sz_vert == sizeof(ImDrawVert) && "Mismatched struct layout!"); }
|
|
|
+ if (sz_idx != sizeof(ImDrawIdx)) { error = true; IM_ASSERT(sz_idx == sizeof(ImDrawIdx) && "Mismatched struct layout!"); }
|
|
|
return !error;
|
|
|
}
|
|
|
|