mirror of
https://github.com/ocornut/imgui.git
synced 2024-12-11 11:29:02 +08:00
NewFrame(): update activeid data and keyboard before mouse. Should have no side-effects! (So that later we can update Nav between Keyboard and Mouse) (#323)
This commit is contained in:
parent
272745bd93
commit
267e54cf06
33
imgui.cpp
33
imgui.cpp
@ -2095,7 +2095,22 @@ void ImGui::NewFrame()
|
|||||||
g.RenderDrawData.CmdLists = NULL;
|
g.RenderDrawData.CmdLists = NULL;
|
||||||
g.RenderDrawData.CmdListsCount = g.RenderDrawData.TotalVtxCount = g.RenderDrawData.TotalIdxCount = 0;
|
g.RenderDrawData.CmdListsCount = g.RenderDrawData.TotalVtxCount = g.RenderDrawData.TotalIdxCount = 0;
|
||||||
|
|
||||||
// Update inputs state
|
// Clear reference to active widget if the widget isn't alive anymore
|
||||||
|
g.HoveredIdPreviousFrame = g.HoveredId;
|
||||||
|
g.HoveredId = 0;
|
||||||
|
g.HoveredIdAllowOverlap = false;
|
||||||
|
if (!g.ActiveIdIsAlive && g.ActiveIdPreviousFrame == g.ActiveId && g.ActiveId != 0)
|
||||||
|
SetActiveID(0);
|
||||||
|
g.ActiveIdPreviousFrame = g.ActiveId;
|
||||||
|
g.ActiveIdIsAlive = false;
|
||||||
|
g.ActiveIdIsJustActivated = false;
|
||||||
|
|
||||||
|
// Update keyboard input state
|
||||||
|
memcpy(g.IO.KeysDownDurationPrev, g.IO.KeysDownDuration, sizeof(g.IO.KeysDownDuration));
|
||||||
|
for (int i = 0; i < IM_ARRAYSIZE(g.IO.KeysDown); i++)
|
||||||
|
g.IO.KeysDownDuration[i] = g.IO.KeysDown[i] ? (g.IO.KeysDownDuration[i] < 0.0f ? 0.0f : g.IO.KeysDownDuration[i] + g.IO.DeltaTime) : -1.0f;
|
||||||
|
|
||||||
|
// Update mouse input state
|
||||||
if (g.IO.MousePos.x < 0 && g.IO.MousePos.y < 0)
|
if (g.IO.MousePos.x < 0 && g.IO.MousePos.y < 0)
|
||||||
g.IO.MousePos = ImVec2(-9999.0f, -9999.0f);
|
g.IO.MousePos = ImVec2(-9999.0f, -9999.0f);
|
||||||
if ((g.IO.MousePos.x < 0 && g.IO.MousePos.y < 0) || (g.IO.MousePosPrev.x < 0 && g.IO.MousePosPrev.y < 0)) // if mouse just appeared or disappeared (negative coordinate) we cancel out movement in MouseDelta
|
if ((g.IO.MousePos.x < 0 && g.IO.MousePos.y < 0) || (g.IO.MousePosPrev.x < 0 && g.IO.MousePosPrev.y < 0)) // if mouse just appeared or disappeared (negative coordinate) we cancel out movement in MouseDelta
|
||||||
@ -2130,9 +2145,6 @@ void ImGui::NewFrame()
|
|||||||
g.IO.MouseDragMaxDistanceSqr[i] = ImMax(g.IO.MouseDragMaxDistanceSqr[i], ImLengthSqr(g.IO.MousePos - g.IO.MouseClickedPos[i]));
|
g.IO.MouseDragMaxDistanceSqr[i] = ImMax(g.IO.MouseDragMaxDistanceSqr[i], ImLengthSqr(g.IO.MousePos - g.IO.MouseClickedPos[i]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
memcpy(g.IO.KeysDownDurationPrev, g.IO.KeysDownDuration, sizeof(g.IO.KeysDownDuration));
|
|
||||||
for (int i = 0; i < IM_ARRAYSIZE(g.IO.KeysDown); i++)
|
|
||||||
g.IO.KeysDownDuration[i] = g.IO.KeysDown[i] ? (g.IO.KeysDownDuration[i] < 0.0f ? 0.0f : g.IO.KeysDownDuration[i] + g.IO.DeltaTime) : -1.0f;
|
|
||||||
|
|
||||||
// Calculate frame-rate for the user, as a purely luxurious feature
|
// Calculate frame-rate for the user, as a purely luxurious feature
|
||||||
g.FramerateSecPerFrameAccum += g.IO.DeltaTime - g.FramerateSecPerFrame[g.FramerateSecPerFrameIdx];
|
g.FramerateSecPerFrameAccum += g.IO.DeltaTime - g.FramerateSecPerFrame[g.FramerateSecPerFrameIdx];
|
||||||
@ -2140,16 +2152,6 @@ void ImGui::NewFrame()
|
|||||||
g.FramerateSecPerFrameIdx = (g.FramerateSecPerFrameIdx + 1) % IM_ARRAYSIZE(g.FramerateSecPerFrame);
|
g.FramerateSecPerFrameIdx = (g.FramerateSecPerFrameIdx + 1) % IM_ARRAYSIZE(g.FramerateSecPerFrame);
|
||||||
g.IO.Framerate = 1.0f / (g.FramerateSecPerFrameAccum / (float)IM_ARRAYSIZE(g.FramerateSecPerFrame));
|
g.IO.Framerate = 1.0f / (g.FramerateSecPerFrameAccum / (float)IM_ARRAYSIZE(g.FramerateSecPerFrame));
|
||||||
|
|
||||||
// Clear reference to active widget if the widget isn't alive anymore
|
|
||||||
g.HoveredIdPreviousFrame = g.HoveredId;
|
|
||||||
g.HoveredId = 0;
|
|
||||||
g.HoveredIdAllowOverlap = false;
|
|
||||||
if (!g.ActiveIdIsAlive && g.ActiveIdPreviousFrame == g.ActiveId && g.ActiveId != 0)
|
|
||||||
SetActiveID(0);
|
|
||||||
g.ActiveIdPreviousFrame = g.ActiveId;
|
|
||||||
g.ActiveIdIsAlive = false;
|
|
||||||
g.ActiveIdIsJustActivated = false;
|
|
||||||
|
|
||||||
// Handle user moving window (at the beginning of the frame to avoid input lag or sheering). Only valid for root windows.
|
// Handle user moving window (at the beginning of the frame to avoid input lag or sheering). Only valid for root windows.
|
||||||
if (g.MovedWindowMoveId && g.MovedWindowMoveId == g.ActiveId)
|
if (g.MovedWindowMoveId && g.MovedWindowMoveId == g.ActiveId)
|
||||||
{
|
{
|
||||||
@ -3276,8 +3278,7 @@ bool ImGui::IsAnyItemActive()
|
|||||||
bool ImGui::IsItemVisible()
|
bool ImGui::IsItemVisible()
|
||||||
{
|
{
|
||||||
ImGuiWindow* window = GetCurrentWindowRead();
|
ImGuiWindow* window = GetCurrentWindowRead();
|
||||||
ImRect r(window->ClipRect);
|
return window->ClipRect.Overlaps(window->DC.LastItemRect);
|
||||||
return r.Overlaps(window->DC.LastItemRect);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allow last item to be overlapped by a subsequent item. Both may be activated during the same frame before the later one takes priority.
|
// Allow last item to be overlapped by a subsequent item. Both may be activated during the same frame before the later one takes priority.
|
||||||
|
Loading…
Reference in New Issue
Block a user