mirror of
https://github.com/ocornut/imgui.git
synced 2026-01-31 03:20:05 +00:00
parent
a1b60fc1f5
commit
1d8e48c161
2 changed files with 43 additions and 55 deletions
96
imgui.cpp
96
imgui.cpp
|
|
@ -5208,9 +5208,8 @@ static void ImGui::RenderDimmedBackgrounds()
|
|||
}
|
||||
|
||||
// Draw dimming background on _other_ viewports than the ones our windows are in
|
||||
for (int viewport_n = 0; viewport_n < g.Viewports.Size; viewport_n++)
|
||||
for (ImGuiViewportP* viewport : g.Viewports)
|
||||
{
|
||||
ImGuiViewportP* viewport = g.Viewports[viewport_n];
|
||||
if (viewport == viewports_already_dimmed[0] || viewport == viewports_already_dimmed[1])
|
||||
continue;
|
||||
if (modal_window && viewport->Window && IsWindowAbove(viewport->Window, modal_window))
|
||||
|
|
@ -9860,9 +9859,8 @@ static void ImGui::ErrorCheckNewFrameSanityChecks()
|
|||
}
|
||||
|
||||
// Perform simple checks on platform monitor data + compute a total bounding box for quick early outs
|
||||
for (int monitor_n = 0; monitor_n < g.PlatformIO.Monitors.Size; monitor_n++)
|
||||
for (ImGuiPlatformMonitor& mon : g.PlatformIO.Monitors)
|
||||
{
|
||||
ImGuiPlatformMonitor& mon = g.PlatformIO.Monitors[monitor_n];
|
||||
IM_UNUSED(mon);
|
||||
IM_ASSERT(mon.MainSize.x > 0.0f && mon.MainSize.y > 0.0f && "Monitor main bounds not setup properly.");
|
||||
IM_ASSERT(ImRect(mon.MainPos, mon.MainPos + mon.MainSize).Contains(ImRect(mon.WorkPos, mon.WorkPos + mon.WorkSize)) && "Monitor work bounds not setup properly. If you don't have work area information, just copy MainPos/MainSize into them.");
|
||||
|
|
@ -10909,8 +10907,8 @@ bool ImGui::IsPopupOpen(ImGuiID id, ImGuiPopupFlags popup_flags)
|
|||
if (popup_flags & ImGuiPopupFlags_AnyPopupLevel)
|
||||
{
|
||||
// Return true if the popup is open anywhere in the popup stack
|
||||
for (int n = 0; n < g.OpenPopupStack.Size; n++)
|
||||
if (g.OpenPopupStack[n].PopupId == id)
|
||||
for (ImGuiPopupData& popup_data : g.OpenPopupStack)
|
||||
if (popup_data.PopupId == id)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
|
@ -13989,18 +13987,18 @@ ImGuiViewport* ImGui::GetMainViewport()
|
|||
ImGuiViewport* ImGui::FindViewportByID(ImGuiID id)
|
||||
{
|
||||
ImGuiContext& g = *GImGui;
|
||||
for (int n = 0; n < g.Viewports.Size; n++)
|
||||
if (g.Viewports[n]->ID == id)
|
||||
return g.Viewports[n];
|
||||
for (ImGuiViewportP* viewport : g.Viewports)
|
||||
if (viewport->ID == id)
|
||||
return viewport;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ImGuiViewport* ImGui::FindViewportByPlatformHandle(void* platform_handle)
|
||||
{
|
||||
ImGuiContext& g = *GImGui;
|
||||
for (int i = 0; i != g.Viewports.Size; i++)
|
||||
if (g.Viewports[i]->PlatformHandle == platform_handle)
|
||||
return g.Viewports[i];
|
||||
for (ImGuiViewportP* viewport : g.Viewports)
|
||||
if (viewport->PlatformHandle == platform_handle)
|
||||
return viewport;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
@ -14062,9 +14060,8 @@ static bool ImGui::UpdateTryMergeWindowIntoHostViewport(ImGuiWindow* window, ImG
|
|||
return false;
|
||||
|
||||
// FIXME: Can't use g.WindowsFocusOrder[] for root windows only as we care about Z order. If we maintained a DisplayOrder along with FocusOrder we could..
|
||||
for (int n = 0; n < g.Windows.Size; n++)
|
||||
for (ImGuiWindow* window_behind : g.Windows)
|
||||
{
|
||||
ImGuiWindow* window_behind = g.Windows[n];
|
||||
if (window_behind == window)
|
||||
break;
|
||||
if (window_behind->WasActive && window_behind->ViewportOwned && !(window_behind->Flags & ImGuiWindowFlags_ChildWindow))
|
||||
|
|
@ -14106,9 +14103,9 @@ void ImGui::TranslateWindowsInViewport(ImGuiViewportP* viewport, const ImVec2& o
|
|||
const bool translate_all_windows = (g.ConfigFlagsCurrFrame & ImGuiConfigFlags_ViewportsEnable) != (g.ConfigFlagsLastFrame & ImGuiConfigFlags_ViewportsEnable);
|
||||
ImRect test_still_fit_rect(old_pos, old_pos + viewport->Size);
|
||||
ImVec2 delta_pos = new_pos - old_pos;
|
||||
for (int window_n = 0; window_n < g.Windows.Size; window_n++) // FIXME-OPT
|
||||
if (translate_all_windows || (g.Windows[window_n]->Viewport == viewport && test_still_fit_rect.Contains(g.Windows[window_n]->Rect())))
|
||||
TranslateWindow(g.Windows[window_n], delta_pos);
|
||||
for (ImGuiWindow* window : g.Windows) // FIXME-OPT
|
||||
if (translate_all_windows || (window->Viewport == viewport && test_still_fit_rect.Contains(window->Rect())))
|
||||
TranslateWindow(window, delta_pos);
|
||||
}
|
||||
|
||||
// Scale all windows (position, size). Use when e.g. changing DPI. (This is a lossy operation!)
|
||||
|
|
@ -14121,9 +14118,9 @@ void ImGui::ScaleWindowsInViewport(ImGuiViewportP* viewport, float scale)
|
|||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i != g.Windows.Size; i++)
|
||||
if (g.Windows[i]->Viewport == viewport)
|
||||
ScaleWindow(g.Windows[i], scale);
|
||||
for (ImGuiWindow* window : g.Windows)
|
||||
if (window->Viewport == viewport)
|
||||
ScaleWindow(window, scale);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -14134,13 +14131,10 @@ ImGuiViewportP* ImGui::FindHoveredViewportFromPlatformWindowStack(const ImVec2&
|
|||
{
|
||||
ImGuiContext& g = *GImGui;
|
||||
ImGuiViewportP* best_candidate = NULL;
|
||||
for (int n = 0; n < g.Viewports.Size; n++)
|
||||
{
|
||||
ImGuiViewportP* viewport = g.Viewports[n];
|
||||
for (ImGuiViewportP* viewport : g.Viewports)
|
||||
if (!(viewport->Flags & (ImGuiViewportFlags_NoInputs | ImGuiViewportFlags_IsMinimized)) && viewport->GetMainRect().Contains(mouse_platform_pos))
|
||||
if (best_candidate == NULL || best_candidate->LastFocusedStampCount < viewport->LastFocusedStampCount)
|
||||
best_candidate = viewport;
|
||||
}
|
||||
return best_candidate;
|
||||
}
|
||||
|
||||
|
|
@ -14157,9 +14151,8 @@ static void ImGui::UpdateViewportsNewFrame()
|
|||
if (viewports_enabled)
|
||||
{
|
||||
ImGuiViewportP* focused_viewport = NULL;
|
||||
for (int n = 0; n < g.Viewports.Size; n++)
|
||||
for (ImGuiViewportP* viewport : g.Viewports)
|
||||
{
|
||||
ImGuiViewportP* viewport = g.Viewports[n];
|
||||
const bool platform_funcs_available = viewport->PlatformWindowCreated;
|
||||
if (g.PlatformIO.Platform_GetWindowMinimized && platform_funcs_available)
|
||||
{
|
||||
|
|
@ -14459,9 +14452,8 @@ static void ImGui::DestroyViewport(ImGuiViewportP* viewport)
|
|||
{
|
||||
// Clear references to this viewport in windows (window->ViewportId becomes the master data)
|
||||
ImGuiContext& g = *GImGui;
|
||||
for (int window_n = 0; window_n < g.Windows.Size; window_n++)
|
||||
for (ImGuiWindow* window : g.Windows)
|
||||
{
|
||||
ImGuiWindow* window = g.Windows[window_n];
|
||||
if (window->Viewport != viewport)
|
||||
continue;
|
||||
window->Viewport = NULL;
|
||||
|
|
@ -14939,8 +14931,8 @@ void ImGui::DestroyPlatformWindows()
|
|||
// It is expected that the backend can handle calls to Renderer_DestroyWindow/Platform_DestroyWindow without
|
||||
// crashing if it doesn't have data stored.
|
||||
ImGuiContext& g = *GImGui;
|
||||
for (int i = 0; i < g.Viewports.Size; i++)
|
||||
DestroyPlatformWindow(g.Viewports[i]);
|
||||
for (ImGuiViewportP* viewport : g.Viewports)
|
||||
DestroyPlatformWindow(viewport);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -15251,13 +15243,12 @@ void ImGui::DockContextNewFrameUpdateUndocking(ImGuiContext* ctx)
|
|||
}
|
||||
|
||||
// Process Undocking requests (we need to process them _before_ the UpdateMouseMovingWindowNewFrame call in NewFrame)
|
||||
for (int n = 0; n < dc->Requests.Size; n++)
|
||||
for (ImGuiDockRequest& req : dc->Requests)
|
||||
{
|
||||
ImGuiDockRequest* req = &dc->Requests[n];
|
||||
if (req->Type == ImGuiDockRequestType_Undock && req->UndockTargetWindow)
|
||||
DockContextProcessUndockWindow(ctx, req->UndockTargetWindow);
|
||||
else if (req->Type == ImGuiDockRequestType_Undock && req->UndockTargetNode)
|
||||
DockContextProcessUndockNode(ctx, req->UndockTargetNode);
|
||||
if (req.Type == ImGuiDockRequestType_Undock && req.UndockTargetWindow)
|
||||
DockContextProcessUndockWindow(ctx, req.UndockTargetWindow);
|
||||
else if (req.Type == ImGuiDockRequestType_Undock && req.UndockTargetNode)
|
||||
DockContextProcessUndockNode(ctx, req.UndockTargetNode);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -15282,9 +15273,9 @@ void ImGui::DockContextNewFrameUpdateDocking(ImGuiContext* ctx)
|
|||
}
|
||||
|
||||
// Process Docking requests
|
||||
for (int n = 0; n < dc->Requests.Size; n++)
|
||||
if (dc->Requests[n].Type == ImGuiDockRequestType_Dock)
|
||||
DockContextProcessDock(ctx, &dc->Requests[n]);
|
||||
for (ImGuiDockRequest& req : dc->Requests)
|
||||
if (req.Type == ImGuiDockRequestType_Dock)
|
||||
DockContextProcessDock(ctx, &req);
|
||||
dc->Requests.resize(0);
|
||||
|
||||
// Create windows for each automatic docking nodes
|
||||
|
|
@ -15488,9 +15479,8 @@ void ImGui::DockContextBuildAddWindowsToNodes(ImGuiContext* ctx, ImGuiID root_id
|
|||
{
|
||||
// Rebind all windows to nodes (they can also lazily rebind but we'll have a visible glitch during the first frame)
|
||||
ImGuiContext& g = *ctx;
|
||||
for (int n = 0; n < g.Windows.Size; n++)
|
||||
for (ImGuiWindow* window : g.Windows)
|
||||
{
|
||||
ImGuiWindow* window = g.Windows[n];
|
||||
if (window->DockId == 0 || window->LastFrameActive < g.FrameCount - 1)
|
||||
continue;
|
||||
if (window->DockNode != NULL)
|
||||
|
|
@ -15549,9 +15539,9 @@ void ImGui::DockContextQueueUndockNode(ImGuiContext* ctx, ImGuiDockNode* node)
|
|||
void ImGui::DockContextQueueNotifyRemovedNode(ImGuiContext* ctx, ImGuiDockNode* node)
|
||||
{
|
||||
ImGuiDockContext* dc = &ctx->DockContext;
|
||||
for (int n = 0; n < dc->Requests.Size; n++)
|
||||
if (dc->Requests[n].DockTargetNode == node)
|
||||
dc->Requests[n].Type = ImGuiDockRequestType_None;
|
||||
for (ImGuiDockRequest& req : dc->Requests)
|
||||
if (req.DockTargetNode == node)
|
||||
req.Type = ImGuiDockRequestType_None;
|
||||
}
|
||||
|
||||
void ImGui::DockContextProcessDock(ImGuiContext* ctx, ImGuiDockRequest* req)
|
||||
|
|
@ -15759,9 +15749,8 @@ void ImGui::DockContextProcessUndockNode(ImGuiContext* ctx, ImGuiDockNode* node)
|
|||
node->ParentNode->AuthorityForViewport = ImGuiDataAuthority_Window; // The node that stays in place keeps the viewport, so our newly dragged out node will create a new viewport
|
||||
node->ParentNode = NULL;
|
||||
}
|
||||
for (int n = 0; n < node->Windows.Size; n++)
|
||||
for (ImGuiWindow* window : node->Windows)
|
||||
{
|
||||
ImGuiWindow* window = node->Windows[n];
|
||||
window->Flags &= ~ImGuiWindowFlags_ChildWindow;
|
||||
if (window->ParentWindow)
|
||||
window->ParentWindow->DC.ChildWindows.find_erase(window);
|
||||
|
|
@ -16046,10 +16035,10 @@ static void ImGui::DockNodeMoveWindows(ImGuiDockNode* dst_node, ImGuiDockNode* s
|
|||
|
||||
static void ImGui::DockNodeApplyPosSizeToWindows(ImGuiDockNode* node)
|
||||
{
|
||||
for (int n = 0; n < node->Windows.Size; n++)
|
||||
for (ImGuiWindow* window : node->Windows)
|
||||
{
|
||||
SetWindowPos(node->Windows[n], node->Pos, ImGuiCond_Always); // We don't assign directly to Pos because it can break the calculation of SizeContents on next frame
|
||||
SetWindowSize(node->Windows[n], node->Size, ImGuiCond_Always);
|
||||
SetWindowPos(window, node->Pos, ImGuiCond_Always); // We don't assign directly to Pos because it can break the calculation of SizeContents on next frame
|
||||
SetWindowSize(window, node->Size, ImGuiCond_Always);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -16108,9 +16097,9 @@ static void DockNodeFindInfo(ImGuiDockNode* node, ImGuiDockNodeTreeInfo* info)
|
|||
static ImGuiWindow* ImGui::DockNodeFindWindowByID(ImGuiDockNode* node, ImGuiID id)
|
||||
{
|
||||
IM_ASSERT(id != 0);
|
||||
for (int n = 0; n < node->Windows.Size; n++)
|
||||
if (node->Windows[n]->ID == id)
|
||||
return node->Windows[n];
|
||||
for (ImGuiWindow* window : node->Windows)
|
||||
if (window->ID == id)
|
||||
return window;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
@ -16375,10 +16364,9 @@ static void ImGui::DockNodeUpdate(ImGuiDockNode* node)
|
|||
// Decide if the node will have a close button and a window menu button
|
||||
node->HasWindowMenuButton = (node->Windows.Size > 0) && (node_flags & ImGuiDockNodeFlags_NoWindowMenuButton) == 0;
|
||||
node->HasCloseButton = false;
|
||||
for (int window_n = 0; window_n < node->Windows.Size; window_n++)
|
||||
for (ImGuiWindow* window : node->Windows)
|
||||
{
|
||||
// FIXME-DOCK: Setting DockIsActive here means that for single active window in a leaf node, DockIsActive will be cleared until the next Begin() call.
|
||||
ImGuiWindow* window = node->Windows[window_n];
|
||||
node->HasCloseButton |= window->HasCloseButton;
|
||||
window->DockIsActive = (node->Windows.Size > 1);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4907,7 +4907,7 @@ static void ShowDemoWindowTables()
|
|||
ImGui::TableNextColumn();
|
||||
ImGui::Text("CellPadding.y = %.2f", style.CellPadding.y);
|
||||
if ((row % 3) == 2)
|
||||
ImGui::PopStyleVar();;
|
||||
ImGui::PopStyleVar();
|
||||
}
|
||||
ImGui::EndTable();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue