mirror of
https://github.com/ocornut/imgui.git
synced 2024-11-12 10:11:00 +01:00
Internals: Moved some of NewFrame() into UpdateMovingWindow().
This commit is contained in:
parent
7cc1bc7635
commit
64e0666803
76
imgui.cpp
76
imgui.cpp
@ -732,6 +732,7 @@ static void NavUpdate();
|
||||
static void NavUpdateWindowing();
|
||||
static void NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, const ImGuiID id);
|
||||
|
||||
static void UpdateMovingWindow();
|
||||
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);
|
||||
}
|
||||
@ -3219,6 +3220,45 @@ static void ImGui::NavUpdate()
|
||||
#endif
|
||||
}
|
||||
|
||||
static void ImGui::UpdateMovingWindow()
|
||||
{
|
||||
ImGuiContext& g = *GImGui;
|
||||
if (g.MovingWindow && g.MovingWindow->MoveId == g.ActiveId && g.ActiveIdSource == ImGuiInputSource_Mouse)
|
||||
{
|
||||
// We actually want to move the root window. g.MovingWindow == window we clicked on (could be a child window).
|
||||
// We track it to preserve Focus and so that ActiveIdWindow == MovingWindow and ActiveId == MovingWindow->MoveId for consistency.
|
||||
KeepAliveID(g.ActiveId);
|
||||
IM_ASSERT(g.MovingWindow && g.MovingWindow->RootWindow);
|
||||
ImGuiWindow* moving_window = g.MovingWindow->RootWindow;
|
||||
if (g.IO.MouseDown[0])
|
||||
{
|
||||
ImVec2 pos = g.IO.MousePos - g.ActiveIdClickOffset;
|
||||
if (moving_window->PosFloat.x != pos.x || moving_window->PosFloat.y != pos.y)
|
||||
{
|
||||
MarkIniSettingsDirty(moving_window);
|
||||
moving_window->PosFloat = pos;
|
||||
}
|
||||
FocusWindow(g.MovingWindow);
|
||||
}
|
||||
else
|
||||
{
|
||||
ClearActiveID();
|
||||
g.MovingWindow = NULL;
|
||||
}
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
void ImGui::NewFrame()
|
||||
{
|
||||
IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() or ImGui::SetCurrentContext()?");
|
||||
@ -3347,40 +3387,8 @@ 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).
|
||||
if (g.MovingWindow && g.MovingWindow->MoveId == g.ActiveId && g.ActiveIdSource == ImGuiInputSource_Mouse)
|
||||
{
|
||||
KeepAliveID(g.ActiveId);
|
||||
IM_ASSERT(g.MovingWindow && g.MovingWindow->RootWindow);
|
||||
if (g.IO.MouseDown[0])
|
||||
{
|
||||
// MovingWindow = window we clicked on, could be a child window. We track it to preserve Focus and so that ActiveIdWindow == MovingWindow and ActiveId == MovingWindow->MoveId for consistency.
|
||||
ImGuiWindow* actually_moving_window = g.MovingWindow->RootWindow;
|
||||
ImVec2 pos = g.IO.MousePos - g.ActiveIdClickOffset;
|
||||
if (actually_moving_window->PosFloat.x != pos.x || actually_moving_window->PosFloat.y != pos.y)
|
||||
{
|
||||
MarkIniSettingsDirty(actually_moving_window);
|
||||
actually_moving_window->PosFloat = pos;
|
||||
}
|
||||
FocusWindow(g.MovingWindow);
|
||||
}
|
||||
else
|
||||
{
|
||||
ClearActiveID();
|
||||
g.MovingWindow = NULL;
|
||||
}
|
||||
}
|
||||
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;
|
||||
}
|
||||
// Handle user moving window with mouse (at the beginning of the frame to avoid input lag or sheering)
|
||||
UpdateMovingWindow();
|
||||
|
||||
// Delay saving settings so we don't spam disk too much
|
||||
if (g.SettingsDirtyTimer > 0.0f)
|
||||
|
Loading…
Reference in New Issue
Block a user