|
@@ -2112,9 +2112,9 @@ ImGuiWindow::ImGuiWindow(ImGuiContext* context, const char* name)
|
|
|
Appearing = false;
|
|
|
Hidden = false;
|
|
|
HasCloseButton = false;
|
|
|
+ BeginCount = 0;
|
|
|
BeginOrderWithinParent = -1;
|
|
|
BeginOrderWithinContext = -1;
|
|
|
- BeginCount = 0;
|
|
|
PopupId = 0;
|
|
|
AutoFitFramesX = AutoFitFramesY = -1;
|
|
|
AutoFitOnlyGrows = false;
|
|
@@ -2757,23 +2757,6 @@ void ImGui::UpdateMouseMovingWindow()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// If the back-end doesn't set MouseLastHoveredViewport or doesn't honor ImGuiViewportFlags_NoInputs, we do a search ourselves.
|
|
|
-// A) It won't take account of the possibility that non-imgui windows may be in-between our dragged window and our target window.
|
|
|
-// B) It requires Platform_GetWindowFocus to be implemented by back-end.
|
|
|
-static ImGuiViewportP* FindViewportHoveredFromPlatformWindowStack(const ImVec2 mouse_platform_pos)
|
|
|
-{
|
|
|
- ImGuiContext& g = *GImGui;
|
|
|
- ImGuiViewportP* best_candidate = NULL;
|
|
|
- for (int n = 0; n < g.Viewports.Size; n++)
|
|
|
- {
|
|
|
- ImGuiViewportP* viewport = g.Viewports[n];
|
|
|
- if (!(viewport->Flags & ImGuiViewportFlags_NoInputs) && viewport->GetRect().Contains(mouse_platform_pos))
|
|
|
- if (best_candidate == NULL || best_candidate->LastFrontMostStampCount < viewport->LastFrontMostStampCount)
|
|
|
- best_candidate = viewport;
|
|
|
- }
|
|
|
- return best_candidate;
|
|
|
-}
|
|
|
-
|
|
|
static void TranslateWindow(ImGuiWindow* window, const ImVec2& delta)
|
|
|
{
|
|
|
window->Pos += delta;
|
|
@@ -4556,42 +4539,6 @@ static void CalcResizePosSizeFromAnyCorner(ImGuiWindow* window, const ImVec2& co
|
|
|
*out_size = size_constrained;
|
|
|
}
|
|
|
|
|
|
-static int ImGui::FindPlatformMonitorForPos(const ImVec2& pos)
|
|
|
-{
|
|
|
- ImGuiContext& g = *GImGui;
|
|
|
- for (int monitor_n = 0; monitor_n < g.PlatformIO.Monitors.Size; monitor_n++)
|
|
|
- {
|
|
|
- const ImGuiPlatformMonitor& monitor = g.PlatformIO.Monitors[monitor_n];
|
|
|
- if (ImRect(monitor.MainPos, monitor.MainPos + monitor.MainSize).Contains(pos))
|
|
|
- return monitor_n;
|
|
|
- }
|
|
|
- return -1;
|
|
|
-}
|
|
|
-
|
|
|
-// Search for the monitor with the largest intersection area with the given rectangle
|
|
|
-// We generally try to avoid searching loops but the monitor count should be very small here
|
|
|
-static int ImGui::FindPlatformMonitorForRect(const ImRect& rect)
|
|
|
-{
|
|
|
- ImGuiContext& g = *GImGui;
|
|
|
- float surface_threshold = rect.GetWidth() * rect.GetHeight() * 0.5f;
|
|
|
- int best_monitor_n = -1;
|
|
|
- float best_monitor_surface = 0.001f;
|
|
|
- for (int monitor_n = 0; monitor_n < g.PlatformIO.Monitors.Size && best_monitor_surface < surface_threshold; monitor_n++)
|
|
|
- {
|
|
|
- const ImGuiPlatformMonitor& monitor = g.PlatformIO.Monitors[monitor_n];
|
|
|
- if (ImRect(monitor.MainPos, monitor.MainPos + monitor.MainSize).Contains(rect))
|
|
|
- return monitor_n;
|
|
|
- ImRect overlapping_rect = rect;
|
|
|
- overlapping_rect.ClipWithFull(ImRect(monitor.MainPos, monitor.MainPos + monitor.MainSize));
|
|
|
- float overlapping_surface = overlapping_rect.GetWidth() * overlapping_rect.GetHeight();
|
|
|
- if (overlapping_surface < best_monitor_surface)
|
|
|
- continue;
|
|
|
- best_monitor_surface = overlapping_surface;
|
|
|
- best_monitor_n = monitor_n;
|
|
|
- }
|
|
|
- return best_monitor_n;
|
|
|
-}
|
|
|
-
|
|
|
struct ImGuiResizeGripDef
|
|
|
{
|
|
|
ImVec2 CornerPos;
|
|
@@ -7333,6 +7280,23 @@ void ImGui::ScaleWindowsInViewport(ImGuiViewportP* viewport, float scale)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+// If the back-end doesn't set MouseLastHoveredViewport or doesn't honor ImGuiViewportFlags_NoInputs, we do a search ourselves.
|
|
|
+// A) It won't take account of the possibility that non-imgui windows may be in-between our dragged window and our target window.
|
|
|
+// B) It requires Platform_GetWindowFocus to be implemented by back-end.
|
|
|
+static ImGuiViewportP* FindViewportHoveredFromPlatformWindowStack(const ImVec2 mouse_platform_pos)
|
|
|
+{
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
+ ImGuiViewportP* best_candidate = NULL;
|
|
|
+ for (int n = 0; n < g.Viewports.Size; n++)
|
|
|
+ {
|
|
|
+ ImGuiViewportP* viewport = g.Viewports[n];
|
|
|
+ if (!(viewport->Flags & ImGuiViewportFlags_NoInputs) && viewport->GetRect().Contains(mouse_platform_pos))
|
|
|
+ if (best_candidate == NULL || best_candidate->LastFrontMostStampCount < viewport->LastFrontMostStampCount)
|
|
|
+ best_candidate = viewport;
|
|
|
+ }
|
|
|
+ return best_candidate;
|
|
|
+}
|
|
|
+
|
|
|
static void ImGui::UpdateViewports()
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
@@ -7747,6 +7711,42 @@ void ImGui::UpdatePlatformWindows()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static int ImGui::FindPlatformMonitorForPos(const ImVec2& pos)
|
|
|
+{
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
+ for (int monitor_n = 0; monitor_n < g.PlatformIO.Monitors.Size; monitor_n++)
|
|
|
+ {
|
|
|
+ const ImGuiPlatformMonitor& monitor = g.PlatformIO.Monitors[monitor_n];
|
|
|
+ if (ImRect(monitor.MainPos, monitor.MainPos + monitor.MainSize).Contains(pos))
|
|
|
+ return monitor_n;
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
+}
|
|
|
+
|
|
|
+// Search for the monitor with the largest intersection area with the given rectangle
|
|
|
+// We generally try to avoid searching loops but the monitor count should be very small here
|
|
|
+static int ImGui::FindPlatformMonitorForRect(const ImRect& rect)
|
|
|
+{
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
+ float surface_threshold = rect.GetWidth() * rect.GetHeight() * 0.5f;
|
|
|
+ int best_monitor_n = -1;
|
|
|
+ float best_monitor_surface = 0.001f;
|
|
|
+ for (int monitor_n = 0; monitor_n < g.PlatformIO.Monitors.Size && best_monitor_surface < surface_threshold; monitor_n++)
|
|
|
+ {
|
|
|
+ const ImGuiPlatformMonitor& monitor = g.PlatformIO.Monitors[monitor_n];
|
|
|
+ if (ImRect(monitor.MainPos, monitor.MainPos + monitor.MainSize).Contains(rect))
|
|
|
+ return monitor_n;
|
|
|
+ ImRect overlapping_rect = rect;
|
|
|
+ overlapping_rect.ClipWithFull(ImRect(monitor.MainPos, monitor.MainPos + monitor.MainSize));
|
|
|
+ float overlapping_surface = overlapping_rect.GetWidth() * overlapping_rect.GetHeight();
|
|
|
+ if (overlapping_surface < best_monitor_surface)
|
|
|
+ continue;
|
|
|
+ best_monitor_surface = overlapping_surface;
|
|
|
+ best_monitor_n = monitor_n;
|
|
|
+ }
|
|
|
+ return best_monitor_n;
|
|
|
+}
|
|
|
+
|
|
|
// This is a default/basic function for performing the rendering/swap of multiple platform windows.
|
|
|
// Custom renderers may prefer to not call this function at all, and instead iterate the publicly exposed platform data and handle rendering/sync themselves.
|
|
|
// The Render/Swap functions stored in ImGuiPlatformIO are merely here to allow for this helper to exist, but you can do it yourself:
|
|
@@ -9894,7 +9894,7 @@ static void SetClipboardTextFn_DefaultImpl(void*, const char* text)
|
|
|
#endif
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
-// HELP, METRICS
|
|
|
+// METRICS/DEBUG WINDOW
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
static void RenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP* viewport, const ImRect& bb)
|