|
|
@@ -213,6 +213,8 @@
|
|
|
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.
|
|
|
|
|
|
+ - 2018/01/11 (1.54) - obsoleted IsAnyWindowHovered() in favor of IsWindowHovered(ImGuiHoveredFlags_AnyWindow). Kept redirection function (will obsolete).
|
|
|
+ - 2018/01/11 (1.54) - obsoleted IsAnyWindowFocused() in favor of IsWindowFocused(ImGuiFocusedFlags_AnyWindow). Kept redirection function (will obsolete).
|
|
|
- 2018/01/03 (1.54) - renamed ImGuiSizeConstraintCallback to ImGuiSizeCallback, ImGuiSizeConstraintCallbackData to ImGuiSizeCallbackData.
|
|
|
- 2017/12/29 (1.54) - removed CalcItemRectClosestPoint() which was weird and not really used by anyone except demo code. If you need it it's easy to replicate on your side.
|
|
|
- 2017/12/24 (1.53) - renamed the emblematic ShowTestWindow() function to ShowDemoWindow(). Kept redirection function (will obsolete).
|
|
|
@@ -678,7 +680,7 @@ static bool DataTypeApplyOpFromText(const char* buf, const char* ini
|
|
|
|
|
|
namespace ImGui
|
|
|
{
|
|
|
-static void UpdateManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, ImU32 resize_grip_col[4]);
|
|
|
+static void UpdateManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4]);
|
|
|
static void FocusFrontMostActiveWindow(ImGuiWindow* ignore_window);
|
|
|
}
|
|
|
|
|
|
@@ -2379,10 +2381,10 @@ void ImGui::NewFrame()
|
|
|
g.FramerateSecPerFrameIdx = (g.FramerateSecPerFrameIdx + 1) % IM_ARRAYSIZE(g.FramerateSecPerFrame);
|
|
|
g.IO.Framerate = 1.0f / (g.FramerateSecPerFrameAccum / (float)IM_ARRAYSIZE(g.FramerateSecPerFrame));
|
|
|
|
|
|
- // Handle user moving window with mouse (at the beginning of the frame to avoid input lag or sheering). Only valid for root windows.
|
|
|
+ // Handle user moving window with mouse (at the beginning of the frame to avoid input lag or sheering).
|
|
|
if (g.MovingWindowMoveId && g.MovingWindowMoveId == g.ActiveId)
|
|
|
{
|
|
|
- KeepAliveID(g.MovingWindowMoveId);
|
|
|
+ KeepAliveID(g.ActiveId);
|
|
|
IM_ASSERT(g.MovingWindow && g.MovingWindow->RootWindow);
|
|
|
IM_ASSERT(g.MovingWindow->MoveId == g.MovingWindowMoveId);
|
|
|
if (g.IO.MouseDown[0])
|
|
|
@@ -2402,6 +2404,13 @@ void ImGui::NewFrame()
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
+ // When clicking/dragging from a window that has the _NoMove flag, we still set the ActiveId in order to prevent hovering others.
|
|
|
+ if (g.ActiveIdWindow && g.ActiveIdWindow->MoveId == g.ActiveId)
|
|
|
+ {
|
|
|
+ KeepAliveID(g.ActiveId);
|
|
|
+ if (!g.IO.MouseDown[0])
|
|
|
+ ClearActiveID();
|
|
|
+ }
|
|
|
g.MovingWindow = NULL;
|
|
|
g.MovingWindowMoveId = 0;
|
|
|
}
|
|
|
@@ -2935,13 +2944,14 @@ void ImGui::EndFrame()
|
|
|
{
|
|
|
if (g.HoveredRootWindow != NULL)
|
|
|
{
|
|
|
+ // Set ActiveId even if the _NoMove flag is set, without it dragging away from a window with _NoMove would activate hover on other windows.
|
|
|
FocusWindow(g.HoveredWindow);
|
|
|
+ SetActiveID(g.HoveredWindow->MoveId, g.HoveredWindow);
|
|
|
+ g.ActiveIdClickOffset = g.IO.MousePos - g.HoveredRootWindow->Pos;
|
|
|
if (!(g.HoveredWindow->Flags & ImGuiWindowFlags_NoMove) && !(g.HoveredRootWindow->Flags & ImGuiWindowFlags_NoMove))
|
|
|
{
|
|
|
g.MovingWindow = g.HoveredWindow;
|
|
|
g.MovingWindowMoveId = g.MovingWindow->MoveId;
|
|
|
- SetActiveID(g.MovingWindowMoveId, g.HoveredRootWindow);
|
|
|
- g.ActiveIdClickOffset = g.IO.MousePos - g.MovingWindow->RootWindow->Pos;
|
|
|
}
|
|
|
}
|
|
|
else if (g.NavWindow != NULL && GetFrontMostModalRootWindow() == NULL)
|
|
|
@@ -3420,18 +3430,6 @@ bool ImGui::IsMouseHoveringRect(const ImVec2& r_min, const ImVec2& r_max, bool c
|
|
|
return rect_for_touch.Contains(g.IO.MousePos);
|
|
|
}
|
|
|
|
|
|
-bool ImGui::IsAnyWindowHovered()
|
|
|
-{
|
|
|
- ImGuiContext& g = *GImGui;
|
|
|
- return g.HoveredWindow != NULL;
|
|
|
-}
|
|
|
-
|
|
|
-bool ImGui::IsAnyWindowFocused()
|
|
|
-{
|
|
|
- ImGuiContext& g = *GImGui;
|
|
|
- return g.NavWindow != NULL;
|
|
|
-}
|
|
|
-
|
|
|
static bool IsKeyPressedMap(ImGuiKey key, bool repeat)
|
|
|
{
|
|
|
const int key_index = GImGui->IO.KeyMap[key];
|
|
|
@@ -3962,7 +3960,7 @@ bool ImGui::BeginPopupContextVoid(const char* str_id, int mouse_button)
|
|
|
if (!str_id)
|
|
|
str_id = "void_context";
|
|
|
ImGuiID id = GImGui->CurrentWindow->GetID(str_id);
|
|
|
- if (IsMouseReleased(mouse_button) && !IsAnyWindowHovered())
|
|
|
+ if (IsMouseReleased(mouse_button) && !IsWindowHovered(ImGuiHoveredFlags_AnyWindow))
|
|
|
OpenPopupEx(id);
|
|
|
return BeginPopupEx(id, ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoSavedSettings);
|
|
|
}
|
|
|
@@ -4343,14 +4341,13 @@ static ImRect GetBorderRect(ImGuiWindow* window, int border_n, float perp_paddin
|
|
|
}
|
|
|
|
|
|
// Handle resize for: Resize Grips, Borders, Gamepad
|
|
|
-static void ImGui::UpdateManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, ImU32 resize_grip_col[4])
|
|
|
+static void ImGui::UpdateManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4])
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
ImGuiWindowFlags flags = window->Flags;
|
|
|
if ((flags & ImGuiWindowFlags_NoResize) || (flags & ImGuiWindowFlags_AlwaysAutoResize) || window->AutoFitFramesX > 0 || window->AutoFitFramesY > 0)
|
|
|
return;
|
|
|
|
|
|
- const int resize_grip_count = (flags & ImGuiWindowFlags_ResizeFromAnySide) ? 2 : 1; // 4
|
|
|
const int resize_border_count = (flags & ImGuiWindowFlags_ResizeFromAnySide) ? 4 : 0;
|
|
|
const float grip_draw_size = (float)(int)ImMax(g.FontSize * 1.35f, window->WindowRounding + 1.0f + g.FontSize * 0.2f);
|
|
|
const float grip_hover_size = (float)(int)(grip_draw_size * 0.75f);
|
|
|
@@ -4576,14 +4573,6 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & (ImGuiWindowFlags_AlwaysUseWindowPadding | ImGuiWindowFlags_Popup)) && window->WindowBorderSize == 0.0f)
|
|
|
window->WindowPadding = ImVec2(0.0f, (flags & ImGuiWindowFlags_MenuBar) ? style.WindowPadding.y : 0.0f);
|
|
|
|
|
|
- if (window_just_activated_by_user)
|
|
|
- {
|
|
|
- // Popup first latch mouse position, will position itself when it appears next frame
|
|
|
- window->AutoPosLastDirection = ImGuiDir_None;
|
|
|
- if ((flags & ImGuiWindowFlags_Popup) != 0 && !window_pos_set_by_api)
|
|
|
- window->Pos = window->PosFloat = g.CurrentPopupStack.back().OpenPopupPos;
|
|
|
- }
|
|
|
-
|
|
|
// Collapse window by double-clicking on title bar
|
|
|
// At this point we don't have a clipping rectangle setup yet, so we can use the title bar area for hit detection and drawing
|
|
|
if (!(flags & ImGuiWindowFlags_NoTitleBar) && !(flags & ImGuiWindowFlags_NoCollapse))
|
|
|
@@ -4671,14 +4660,23 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
|
|
|
// POSITION
|
|
|
|
|
|
+ // Popup latch its initial position, will position itself when it appears next frame
|
|
|
+ if (window_just_activated_by_user)
|
|
|
+ {
|
|
|
+ window->AutoPosLastDirection = ImGuiDir_None;
|
|
|
+ if ((flags & ImGuiWindowFlags_Popup) != 0 && !window_pos_set_by_api)
|
|
|
+ window->Pos = window->PosFloat = g.CurrentPopupStack.back().OpenPopupPos;
|
|
|
+ }
|
|
|
+
|
|
|
// Position child window
|
|
|
if (flags & ImGuiWindowFlags_ChildWindow)
|
|
|
{
|
|
|
window->BeginOrderWithinParent = parent_window->DC.ChildWindows.Size;
|
|
|
parent_window->DC.ChildWindows.push_back(window);
|
|
|
+
|
|
|
+ if (!(flags & ImGuiWindowFlags_Popup) && !window_pos_set_by_api)
|
|
|
+ window->Pos = window->PosFloat = parent_window->DC.CursorPos;
|
|
|
}
|
|
|
- if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Popup) && !window_pos_set_by_api)
|
|
|
- window->Pos = window->PosFloat = parent_window->DC.CursorPos;
|
|
|
|
|
|
const bool window_pos_with_pivot = (window->SetWindowPosVal.x != FLT_MAX && window->HiddenFrames == 0);
|
|
|
if (window_pos_with_pivot)
|
|
|
@@ -4750,6 +4748,14 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
if (!(flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Tooltip)) || (flags & ImGuiWindowFlags_Popup))
|
|
|
want_focus = true;
|
|
|
|
|
|
+ // Handle manual resize: Resize Grips, Borders, Gamepad
|
|
|
+ int border_held = -1;
|
|
|
+ ImU32 resize_grip_col[4] = { 0 };
|
|
|
+ const int resize_grip_count = (flags & ImGuiWindowFlags_ResizeFromAnySide) ? 2 : 1; // 4
|
|
|
+ const float grip_draw_size = (float)(int)ImMax(g.FontSize * 1.35f, window->WindowRounding + 1.0f + g.FontSize * 0.2f);
|
|
|
+ if (!window->Collapsed)
|
|
|
+ UpdateManualResize(window, size_auto_fit, &border_held, resize_grip_count, &resize_grip_col[0]);
|
|
|
+
|
|
|
// DRAWING
|
|
|
|
|
|
// Setup draw list and outer clipping rectangle
|
|
|
@@ -4780,14 +4786,6 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- // Handle resize for: Resize Grips, Borders, Gamepad
|
|
|
- int border_held = -1;
|
|
|
- ImU32 resize_grip_col[4] = { 0 };
|
|
|
- const int resize_grip_count = (flags & ImGuiWindowFlags_ResizeFromAnySide) ? 2 : 1; // 4
|
|
|
- const float grip_draw_size = (float)(int)ImMax(g.FontSize * 1.35f, window->WindowRounding + 1.0f + g.FontSize * 0.2f);
|
|
|
- UpdateManualResize(window, size_auto_fit, &border_held, &resize_grip_col[0]);
|
|
|
- title_bar_rect = window->TitleBarRect();
|
|
|
-
|
|
|
// Window background, Default Alpha
|
|
|
ImU32 bg_col = GetColorU32(GetWindowBgColorIdxFromFlags(flags));
|
|
|
window->DrawList->AddRectFilled(window->Pos+ImVec2(0,window->TitleBarHeight()), window->Pos+window->Size, bg_col, window_rounding, (flags & ImGuiWindowFlags_NoTitleBar) ? ImDrawCornerFlags_All : ImDrawCornerFlags_Bot);
|
|
|
@@ -5526,24 +5524,33 @@ bool ImGui::IsWindowHovered(ImGuiHoveredFlags flags)
|
|
|
{
|
|
|
IM_ASSERT((flags & ImGuiHoveredFlags_AllowWhenOverlapped) == 0); // Flags not supported by this function
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
- switch (flags & (ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows))
|
|
|
+
|
|
|
+ if (flags & ImGuiHoveredFlags_AnyWindow)
|
|
|
{
|
|
|
- case ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows:
|
|
|
- if (g.HoveredRootWindow != g.CurrentWindow->RootWindow)
|
|
|
+ if (g.HoveredWindow == NULL)
|
|
|
return false;
|
|
|
- break;
|
|
|
- case ImGuiHoveredFlags_RootWindow:
|
|
|
- if (g.HoveredWindow != g.CurrentWindow->RootWindow)
|
|
|
- return false;
|
|
|
- break;
|
|
|
- case ImGuiHoveredFlags_ChildWindows:
|
|
|
- if (g.HoveredWindow == NULL || !IsWindowChildOf(g.HoveredWindow, g.CurrentWindow))
|
|
|
- return false;
|
|
|
- break;
|
|
|
- default:
|
|
|
- if (g.HoveredWindow != g.CurrentWindow)
|
|
|
- return false;
|
|
|
- break;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ switch (flags & (ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows))
|
|
|
+ {
|
|
|
+ case ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows:
|
|
|
+ if (g.HoveredRootWindow != g.CurrentWindow->RootWindow)
|
|
|
+ return false;
|
|
|
+ break;
|
|
|
+ case ImGuiHoveredFlags_RootWindow:
|
|
|
+ if (g.HoveredWindow != g.CurrentWindow->RootWindow)
|
|
|
+ return false;
|
|
|
+ break;
|
|
|
+ case ImGuiHoveredFlags_ChildWindows:
|
|
|
+ if (g.HoveredWindow == NULL || !IsWindowChildOf(g.HoveredWindow, g.CurrentWindow))
|
|
|
+ return false;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ if (g.HoveredWindow != g.CurrentWindow)
|
|
|
+ return false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if (!IsWindowContentHoverable(g.HoveredRootWindow, flags))
|
|
|
@@ -5559,16 +5566,19 @@ bool ImGui::IsWindowFocused(ImGuiFocusedFlags flags)
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
IM_ASSERT(g.CurrentWindow); // Not inside a Begin()/End()
|
|
|
|
|
|
+ if (flags & ImGuiFocusedFlags_AnyWindow)
|
|
|
+ return g.NavWindow != NULL;
|
|
|
+
|
|
|
switch (flags & (ImGuiFocusedFlags_RootWindow | ImGuiFocusedFlags_ChildWindows))
|
|
|
{
|
|
|
case ImGuiFocusedFlags_RootWindow | ImGuiFocusedFlags_ChildWindows:
|
|
|
- return g.NavWindow && g.CurrentWindow->RootWindow == g.NavWindow->RootWindow;
|
|
|
+ return g.NavWindow && g.NavWindow->RootWindow == g.CurrentWindow->RootWindow;
|
|
|
case ImGuiFocusedFlags_RootWindow:
|
|
|
- return g.CurrentWindow->RootWindow == g.NavWindow;
|
|
|
+ return g.NavWindow == g.CurrentWindow->RootWindow;
|
|
|
case ImGuiFocusedFlags_ChildWindows:
|
|
|
return g.NavWindow && IsWindowChildOf(g.NavWindow, g.CurrentWindow);
|
|
|
default:
|
|
|
- return g.CurrentWindow == g.NavWindow;
|
|
|
+ return g.NavWindow == g.CurrentWindow;
|
|
|
}
|
|
|
}
|
|
|
|