|
@@ -216,11 +216,12 @@
|
|
|
Here is a change-log of API breaking changes, if you are using one of the functions listed, expect to have to fix some code.
|
|
|
Also read releases logs https://github.com/ocornut/imgui/releases for more details.
|
|
|
|
|
|
+ - 2017/10/20 (1.52) - removed the IsItemRectHovered()/IsWindowRectHovered() names introduced in 1.51, the new flags available for IsItemHovered() and IsWindowHovered() are providing much more details/options, and those legacy entry points were confusing/misleading.
|
|
|
- 2017/10/17 (1.52) - marked the old 5-parameters version of Begin() as obsolete (still available). Use SetNextWindowSize()+Begin() instead!
|
|
|
- 2017/10/11 (1.52) - renamed AlignFirstTextHeightToWidgets() to AlignTextToFramePadding(). Kept inline redirection function (will obsolete).
|
|
|
- 2017/09/25 (1.52) - removed SetNextWindowPosCenter() because SetNextWindowPos() now has the optional pivot information to do the same and more. Kept redirection function (will obsolete).
|
|
|
- 2017/08/25 (1.52) - io.MousePos needs to be set to ImVec2(-FLT_MAX,-FLT_MAX) when mouse is unavailable/missing. Previously ImVec2(-1,-1) was enough but we now accept negative mouse coordinates. In your binding if you need to support unavailable mouse, make sure to replace "io.MousePos = ImVec2(-1,-1)" with "io.MousePos = ImVec2(-FLT_MAX,-FLT_MAX)".
|
|
|
- - 2017/08/22 (1.51) - renamed IsItemHoveredRect() to IsItemRectHovered(). Kept inline redirection function (will obsolete).
|
|
|
+ - 2017/08/22 (1.51) - renamed IsItemHoveredRect() to IsItemRectHovered(). Kept inline redirection function (will obsolete). -> (1.52) use IsItemHovered(ImGuiHoveredFlags_RectOnly)!
|
|
|
- renamed IsMouseHoveringAnyWindow() to IsAnyWindowHovered() for consistency. Kept inline redirection function (will obsolete).
|
|
|
- renamed IsMouseHoveringWindow() to IsWindowRectHovered() for consistency. Kept inline redirection function (will obsolete).
|
|
|
- 2017/08/20 (1.51) - renamed GetStyleColName() to GetStyleColorName() for consistency.
|
|
@@ -1944,15 +1945,22 @@ void ImGui::KeepAliveID(ImGuiID id)
|
|
|
g.ActiveIdIsAlive = true;
|
|
|
}
|
|
|
|
|
|
-static inline bool IsWindowContentHoverable(ImGuiWindow* window)
|
|
|
+static inline bool IsWindowContentHoverable(ImGuiWindow* window, ImGuiHoveredFlags flags)
|
|
|
{
|
|
|
// An active popup disable hovering on other windows (apart from its own children)
|
|
|
// FIXME-OPT: This could be cached/stored within the window.
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
if (g.NavWindow)
|
|
|
if (ImGuiWindow* focused_root_window = g.NavWindow->RootWindow)
|
|
|
- if ((focused_root_window->Flags & ImGuiWindowFlags_Popup) != 0 && focused_root_window->WasActive && focused_root_window != window->RootWindow)
|
|
|
- return false;
|
|
|
+ if (focused_root_window->WasActive && focused_root_window != window->RootWindow)
|
|
|
+ {
|
|
|
+ // For the purpose of those flags we differentiate "standard popup" from "modal popup"
|
|
|
+ // NB: The order of those two tests is important because Modal windows are also Popups.
|
|
|
+ if (focused_root_window->Flags & ImGuiWindowFlags_Modal)
|
|
|
+ return false;
|
|
|
+ if ((focused_root_window->Flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiHoveredFlags_AllowWhenBlockedByPopup))
|
|
|
+ return false;
|
|
|
+ }
|
|
|
|
|
|
return true;
|
|
|
}
|
|
@@ -2012,7 +2020,7 @@ bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id)
|
|
|
// This is roughly matching the behavior of internal-facing ItemHoverable()
|
|
|
// - we allow hovering to be true when ActiveId==window->MoveID, so that clicking on non-interactive items such as a Text() item still returns true with IsItemHovered())
|
|
|
// - this should work even for non-interactive items that have no ID, so we cannot use LastItemId
|
|
|
-bool ImGui::IsItemHovered()
|
|
|
+bool ImGui::IsItemHovered(ImGuiHoveredFlags flags)
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
|
|
@@ -2023,21 +2031,16 @@ bool ImGui::IsItemHovered()
|
|
|
// Until a solution is found I believe reverting to the test from 2017/09/27 is safe since this was the test that has been running for a long while.
|
|
|
//if (g.HoveredWindow != window)
|
|
|
// return false;
|
|
|
- if (g.HoveredRootWindow != window->RootWindow)
|
|
|
- return false;
|
|
|
- if (g.ActiveId != 0 && g.ActiveId != window->DC.LastItemId && !g.ActiveIdAllowOverlap && g.ActiveId != window->MoveId)
|
|
|
+ if (g.HoveredRootWindow != window->RootWindow && !(flags & ImGuiHoveredFlags_AllowWhenOverlapped))
|
|
|
return false;
|
|
|
- if (!IsWindowContentHoverable(window))
|
|
|
+ if (!(flags & ImGuiHoveredFlags_AllowWhenBlockedByActiveItem))
|
|
|
+ if (g.ActiveId != 0 && g.ActiveId != window->DC.LastItemId && !g.ActiveIdAllowOverlap && g.ActiveId != window->MoveId)
|
|
|
+ return false;
|
|
|
+ if (!IsWindowContentHoverable(window, flags))
|
|
|
return false;
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
-bool ImGui::IsItemRectHovered()
|
|
|
-{
|
|
|
- ImGuiWindow* window = GetCurrentWindowRead();
|
|
|
- return window->DC.LastItemRectHoveredRect;
|
|
|
-}
|
|
|
-
|
|
|
// Internal facing ItemHoverable() used when submitting widgets. Differs slightly from IsItemHovered().
|
|
|
bool ImGui::ItemHoverable(const ImRect& bb, ImGuiID id)
|
|
|
{
|
|
@@ -2052,7 +2055,7 @@ bool ImGui::ItemHoverable(const ImRect& bb, ImGuiID id)
|
|
|
return false;
|
|
|
if (!IsMouseHoveringRect(bb.Min, bb.Max))
|
|
|
return false;
|
|
|
- if (!IsWindowContentHoverable(window))
|
|
|
+ if (!IsWindowContentHoverable(window, ImGuiHoveredFlags_Default))
|
|
|
return false;
|
|
|
|
|
|
SetHoveredID(id);
|
|
@@ -5086,16 +5089,11 @@ const char* ImGui::GetStyleColorName(ImGuiCol idx)
|
|
|
return "Unknown";
|
|
|
}
|
|
|
|
|
|
-bool ImGui::IsWindowHovered()
|
|
|
-{
|
|
|
- ImGuiContext& g = *GImGui;
|
|
|
- return g.HoveredWindow == g.CurrentWindow && IsWindowContentHoverable(g.HoveredRootWindow);
|
|
|
-}
|
|
|
-
|
|
|
-bool ImGui::IsWindowRectHovered()
|
|
|
+bool ImGui::IsWindowHovered(ImGuiHoveredFlags flags)
|
|
|
{
|
|
|
+ IM_ASSERT((flags & (ImGuiHoveredFlags_AllowWhenOverlapped | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem)) == 0); // Flags not supported by this function
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
- return g.HoveredWindow == g.CurrentWindow;
|
|
|
+ return g.HoveredWindow == g.CurrentWindow && IsWindowContentHoverable(g.HoveredRootWindow, flags);
|
|
|
}
|
|
|
|
|
|
bool ImGui::IsWindowFocused()
|
|
@@ -5116,10 +5114,11 @@ bool ImGui::IsRootWindowOrAnyChildFocused()
|
|
|
return g.NavWindow && g.NavWindow->RootWindow == g.CurrentWindow->RootWindow;
|
|
|
}
|
|
|
|
|
|
-bool ImGui::IsRootWindowOrAnyChildHovered()
|
|
|
+bool ImGui::IsRootWindowOrAnyChildHovered(ImGuiHoveredFlags flags)
|
|
|
{
|
|
|
+ IM_ASSERT((flags & (ImGuiHoveredFlags_AllowWhenOverlapped | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem)) == 0); // Flags not supported by this function
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
- return g.HoveredRootWindow && (g.HoveredRootWindow == g.CurrentWindow->RootWindow) && IsWindowContentHoverable(g.HoveredRootWindow);
|
|
|
+ return g.HoveredRootWindow && (g.HoveredRootWindow == g.CurrentWindow->RootWindow) && IsWindowContentHoverable(g.HoveredRootWindow, flags);
|
|
|
}
|
|
|
|
|
|
float ImGui::GetWindowWidth()
|