mirror of
https://github.com/Drezil/imgui.git
synced 2025-07-05 20:48:46 +02:00
Added ImGuiFocusedFlags_NoPopupHierarchy and ImGuiHoveredFlags_NoPopupHierarchy (followup #4527)
This commit is contained in:
32
imgui.cpp
32
imgui.cpp
@ -3888,7 +3888,7 @@ void ImGui::UpdateHoveredWindowAndCaptureFlags()
|
||||
|
||||
// Modal windows prevents mouse from hovering behind them.
|
||||
ImGuiWindow* modal_window = GetTopMostPopupModal();
|
||||
if (modal_window && g.HoveredWindow && !IsWindowChildOf(g.HoveredWindow->RootWindow, modal_window))
|
||||
if (modal_window && g.HoveredWindow && !IsWindowChildOf(g.HoveredWindow->RootWindow, modal_window, true))
|
||||
clear_hovered_windows = true;
|
||||
|
||||
// Disabled mouse?
|
||||
@ -5778,9 +5778,11 @@ void ImGui::RenderWindowTitleBarContents(ImGuiWindow* window, const ImRect& titl
|
||||
void ImGui::UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window)
|
||||
{
|
||||
window->ParentWindow = parent_window;
|
||||
window->RootWindow = window->RootWindowForTitleBarHighlight = window->RootWindowForNav = window;
|
||||
window->RootWindow = window->RootWindowPopupTree = window->RootWindowForTitleBarHighlight = window->RootWindowForNav = window;
|
||||
if (parent_window && (flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Tooltip))
|
||||
window->RootWindow = parent_window->RootWindow;
|
||||
if (parent_window && (flags & ImGuiWindowFlags_Popup))
|
||||
window->RootWindowPopupTree = parent_window->RootWindowPopupTree;
|
||||
if (parent_window && !(flags & ImGuiWindowFlags_Modal) && (flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Popup)))
|
||||
window->RootWindowForTitleBarHighlight = parent_window->RootWindowForTitleBarHighlight;
|
||||
while (window->RootWindowForNav->Flags & ImGuiWindowFlags_NavFlattened)
|
||||
@ -6726,14 +6728,25 @@ void ImGui::PopTextWrapPos()
|
||||
window->DC.TextWrapPosStack.pop_back();
|
||||
}
|
||||
|
||||
bool ImGui::IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent)
|
||||
static ImGuiWindow* GetCombinedRootWindow(ImGuiWindow* window, bool popup_hierarchy)
|
||||
{
|
||||
if (window->RootWindow == potential_parent)
|
||||
window = window->RootWindow;
|
||||
if (popup_hierarchy)
|
||||
window = window->RootWindowPopupTree;
|
||||
return window;
|
||||
}
|
||||
|
||||
bool ImGui::IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent, bool popup_hierarchy)
|
||||
{
|
||||
ImGuiWindow* window_root = GetCombinedRootWindow(window, popup_hierarchy);
|
||||
if (window_root == potential_parent)
|
||||
return true;
|
||||
while (window != NULL)
|
||||
{
|
||||
if (window == potential_parent)
|
||||
return true;
|
||||
if (window == window_root) // end of chain
|
||||
return false;
|
||||
window = window->ParentWindow;
|
||||
}
|
||||
return false;
|
||||
@ -6765,13 +6778,13 @@ bool ImGui::IsWindowHovered(ImGuiHoveredFlags flags)
|
||||
if ((flags & ImGuiHoveredFlags_AnyWindow) == 0)
|
||||
{
|
||||
IM_ASSERT(cur_window); // Not inside a Begin()/End()
|
||||
|
||||
const bool popup_hierarchy = (flags & ImGuiHoveredFlags_NoPopupHierarchy) == 0;
|
||||
if (flags & ImGuiHoveredFlags_RootWindow)
|
||||
cur_window = cur_window->RootWindow;
|
||||
cur_window = GetCombinedRootWindow(cur_window, popup_hierarchy);
|
||||
|
||||
bool result;
|
||||
if (flags & ImGuiHoveredFlags_ChildWindows)
|
||||
result = IsWindowChildOf(ref_window, cur_window);
|
||||
result = IsWindowChildOf(ref_window, cur_window, popup_hierarchy);
|
||||
else
|
||||
result = (ref_window == cur_window);
|
||||
if (!result)
|
||||
@ -6798,11 +6811,12 @@ bool ImGui::IsWindowFocused(ImGuiFocusedFlags flags)
|
||||
return true;
|
||||
IM_ASSERT(cur_window); // Not inside a Begin()/End()
|
||||
|
||||
const bool popup_hierarchy = (flags & ImGuiFocusedFlags_NoPopupHierarchy) == 0;
|
||||
if (flags & ImGuiHoveredFlags_RootWindow)
|
||||
cur_window = cur_window->RootWindow;
|
||||
cur_window = GetCombinedRootWindow(cur_window, popup_hierarchy);
|
||||
|
||||
if (flags & ImGuiHoveredFlags_ChildWindows)
|
||||
return IsWindowChildOf(ref_window, cur_window);
|
||||
return IsWindowChildOf(ref_window, cur_window, popup_hierarchy);
|
||||
else
|
||||
return (ref_window == cur_window);
|
||||
}
|
||||
|
Reference in New Issue
Block a user