|
@@ -755,7 +755,8 @@ static void NavUpdate();
|
|
|
static void NavUpdateWindowing();
|
|
|
static void NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, const ImGuiID id);
|
|
|
|
|
|
-static void UpdateMovingWindow();
|
|
|
+static void NewFrameUpdateMovingWindow();
|
|
|
+static void NewFrameUpdateMouseInputs();
|
|
|
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);
|
|
|
}
|
|
@@ -3249,7 +3250,7 @@ static void ImGui::NavUpdate()
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
-static void ImGui::UpdateMovingWindow()
|
|
|
+static void ImGui::NewFrameUpdateMovingWindow()
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
|
if (g.MovingWindow && g.MovingWindow->MoveId == g.ActiveId && g.ActiveIdSource == ImGuiInputSource_Mouse)
|
|
@@ -3288,6 +3289,59 @@ static void ImGui::UpdateMovingWindow()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void ImGui::NewFrameUpdateMouseInputs()
|
|
|
+{
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
+ if (g.IO.ConfigFlags & ImGuiConfigFlags_NoMouse)
|
|
|
+ {
|
|
|
+ g.IO.MousePos = ImVec2(-FLT_MAX, -FLT_MAX);
|
|
|
+ memset(g.IO.MouseDown, 0, sizeof(g.IO.MouseDown));
|
|
|
+ }
|
|
|
+
|
|
|
+ // If mouse just appeared or disappeared (usually denoted by -FLT_MAX component, but in reality we test for -256000.0f) we cancel out movement in MouseDelta
|
|
|
+ if (ImGui::IsMousePosValid(&g.IO.MousePos) && ImGui::IsMousePosValid(&g.IO.MousePosPrev))
|
|
|
+ g.IO.MouseDelta = g.IO.MousePos - g.IO.MousePosPrev;
|
|
|
+ else
|
|
|
+ g.IO.MouseDelta = ImVec2(0.0f, 0.0f);
|
|
|
+ if (g.IO.MouseDelta.x != 0.0f || g.IO.MouseDelta.y != 0.0f)
|
|
|
+ g.NavDisableMouseHover = false;
|
|
|
+
|
|
|
+ g.IO.MousePosPrev = g.IO.MousePos;
|
|
|
+ for (int i = 0; i < IM_ARRAYSIZE(g.IO.MouseDown); i++)
|
|
|
+ {
|
|
|
+ g.IO.MouseClicked[i] = g.IO.MouseDown[i] && g.IO.MouseDownDuration[i] < 0.0f;
|
|
|
+ g.IO.MouseReleased[i] = !g.IO.MouseDown[i] && g.IO.MouseDownDuration[i] >= 0.0f;
|
|
|
+ g.IO.MouseDownDurationPrev[i] = g.IO.MouseDownDuration[i];
|
|
|
+ g.IO.MouseDownDuration[i] = g.IO.MouseDown[i] ? (g.IO.MouseDownDuration[i] < 0.0f ? 0.0f : g.IO.MouseDownDuration[i] + g.IO.DeltaTime) : -1.0f;
|
|
|
+ g.IO.MouseDoubleClicked[i] = false;
|
|
|
+ if (g.IO.MouseClicked[i])
|
|
|
+ {
|
|
|
+ if (g.Time - g.IO.MouseClickedTime[i] < g.IO.MouseDoubleClickTime)
|
|
|
+ {
|
|
|
+ if (ImLengthSqr(g.IO.MousePos - g.IO.MouseClickedPos[i]) < g.IO.MouseDoubleClickMaxDist * g.IO.MouseDoubleClickMaxDist)
|
|
|
+ g.IO.MouseDoubleClicked[i] = true;
|
|
|
+ g.IO.MouseClickedTime[i] = -FLT_MAX; // so the third click isn't turned into a double-click
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ g.IO.MouseClickedTime[i] = g.Time;
|
|
|
+ }
|
|
|
+ g.IO.MouseClickedPos[i] = g.IO.MousePos;
|
|
|
+ g.IO.MouseDragMaxDistanceAbs[i] = ImVec2(0.0f, 0.0f);
|
|
|
+ g.IO.MouseDragMaxDistanceSqr[i] = 0.0f;
|
|
|
+ }
|
|
|
+ else if (g.IO.MouseDown[i])
|
|
|
+ {
|
|
|
+ ImVec2 mouse_delta = g.IO.MousePos - g.IO.MouseClickedPos[i];
|
|
|
+ g.IO.MouseDragMaxDistanceAbs[i].x = ImMax(g.IO.MouseDragMaxDistanceAbs[i].x, mouse_delta.x < 0.0f ? -mouse_delta.x : mouse_delta.x);
|
|
|
+ g.IO.MouseDragMaxDistanceAbs[i].y = ImMax(g.IO.MouseDragMaxDistanceAbs[i].y, mouse_delta.y < 0.0f ? -mouse_delta.y : mouse_delta.y);
|
|
|
+ g.IO.MouseDragMaxDistanceSqr[i] = ImMax(g.IO.MouseDragMaxDistanceSqr[i], ImLengthSqr(mouse_delta));
|
|
|
+ }
|
|
|
+ if (g.IO.MouseClicked[i]) // Clicking any mouse button reactivate mouse hovering which may have been deactivated by gamepad/keyboard navigation
|
|
|
+ g.NavDisableMouseHover = false;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void ImGui::NewFrame()
|
|
|
{
|
|
|
IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() or ImGui::SetCurrentContext()?");
|
|
@@ -3318,6 +3372,14 @@ void ImGui::NewFrame()
|
|
|
g.SettingsLoaded = true;
|
|
|
}
|
|
|
|
|
|
+ // Save settings (with a delay so we don't spam disk too much)
|
|
|
+ if (g.SettingsDirtyTimer > 0.0f)
|
|
|
+ {
|
|
|
+ g.SettingsDirtyTimer -= g.IO.DeltaTime;
|
|
|
+ if (g.SettingsDirtyTimer <= 0.0f)
|
|
|
+ SaveIniSettingsToDisk(g.IO.IniFilename);
|
|
|
+ }
|
|
|
+
|
|
|
g.Time += g.IO.DeltaTime;
|
|
|
g.FrameCount += 1;
|
|
|
g.TooltipOverrideCount = 0;
|
|
@@ -3372,53 +3434,7 @@ void ImGui::NewFrame()
|
|
|
NavUpdate();
|
|
|
|
|
|
// Update mouse input state
|
|
|
- // If mouse just appeared or disappeared (usually denoted by -FLT_MAX component, but in reality we test for -256000.0f) we cancel out movement in MouseDelta
|
|
|
- if (g.IO.ConfigFlags & ImGuiConfigFlags_NoMouse)
|
|
|
- {
|
|
|
- g.IO.MousePos = ImVec2(-FLT_MAX, -FLT_MAX);
|
|
|
- memset(g.IO.MouseDown, 0, sizeof(g.IO.MouseDown));
|
|
|
- }
|
|
|
- if (IsMousePosValid(&g.IO.MousePos) && IsMousePosValid(&g.IO.MousePosPrev))
|
|
|
- g.IO.MouseDelta = g.IO.MousePos - g.IO.MousePosPrev;
|
|
|
- else
|
|
|
- g.IO.MouseDelta = ImVec2(0.0f, 0.0f);
|
|
|
- if (g.IO.MouseDelta.x != 0.0f || g.IO.MouseDelta.y != 0.0f)
|
|
|
- g.NavDisableMouseHover = false;
|
|
|
-
|
|
|
- g.IO.MousePosPrev = g.IO.MousePos;
|
|
|
- for (int i = 0; i < IM_ARRAYSIZE(g.IO.MouseDown); i++)
|
|
|
- {
|
|
|
- g.IO.MouseClicked[i] = g.IO.MouseDown[i] && g.IO.MouseDownDuration[i] < 0.0f;
|
|
|
- g.IO.MouseReleased[i] = !g.IO.MouseDown[i] && g.IO.MouseDownDuration[i] >= 0.0f;
|
|
|
- g.IO.MouseDownDurationPrev[i] = g.IO.MouseDownDuration[i];
|
|
|
- g.IO.MouseDownDuration[i] = g.IO.MouseDown[i] ? (g.IO.MouseDownDuration[i] < 0.0f ? 0.0f : g.IO.MouseDownDuration[i] + g.IO.DeltaTime) : -1.0f;
|
|
|
- g.IO.MouseDoubleClicked[i] = false;
|
|
|
- if (g.IO.MouseClicked[i])
|
|
|
- {
|
|
|
- if (g.Time - g.IO.MouseClickedTime[i] < g.IO.MouseDoubleClickTime)
|
|
|
- {
|
|
|
- if (ImLengthSqr(g.IO.MousePos - g.IO.MouseClickedPos[i]) < g.IO.MouseDoubleClickMaxDist * g.IO.MouseDoubleClickMaxDist)
|
|
|
- g.IO.MouseDoubleClicked[i] = true;
|
|
|
- g.IO.MouseClickedTime[i] = -FLT_MAX; // so the third click isn't turned into a double-click
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- g.IO.MouseClickedTime[i] = g.Time;
|
|
|
- }
|
|
|
- g.IO.MouseClickedPos[i] = g.IO.MousePos;
|
|
|
- g.IO.MouseDragMaxDistanceAbs[i] = ImVec2(0.0f, 0.0f);
|
|
|
- g.IO.MouseDragMaxDistanceSqr[i] = 0.0f;
|
|
|
- }
|
|
|
- else if (g.IO.MouseDown[i])
|
|
|
- {
|
|
|
- ImVec2 mouse_delta = g.IO.MousePos - g.IO.MouseClickedPos[i];
|
|
|
- g.IO.MouseDragMaxDistanceAbs[i].x = ImMax(g.IO.MouseDragMaxDistanceAbs[i].x, mouse_delta.x < 0.0f ? -mouse_delta.x : mouse_delta.x);
|
|
|
- g.IO.MouseDragMaxDistanceAbs[i].y = ImMax(g.IO.MouseDragMaxDistanceAbs[i].y, mouse_delta.y < 0.0f ? -mouse_delta.y : mouse_delta.y);
|
|
|
- g.IO.MouseDragMaxDistanceSqr[i] = ImMax(g.IO.MouseDragMaxDistanceSqr[i], ImLengthSqr(mouse_delta));
|
|
|
- }
|
|
|
- if (g.IO.MouseClicked[i]) // Clicking any mouse button reactivate mouse hovering which may have been deactivated by gamepad/keyboard navigation
|
|
|
- g.NavDisableMouseHover = false;
|
|
|
- }
|
|
|
+ NewFrameUpdateMouseInputs();
|
|
|
|
|
|
// Calculate frame-rate for the user, as a purely luxurious feature
|
|
|
g.FramerateSecPerFrameAccum += g.IO.DeltaTime - g.FramerateSecPerFrame[g.FramerateSecPerFrameIdx];
|
|
@@ -3427,15 +3443,7 @@ void ImGui::NewFrame()
|
|
|
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)
|
|
|
- UpdateMovingWindow();
|
|
|
-
|
|
|
- // Delay saving settings so we don't spam disk too much
|
|
|
- if (g.SettingsDirtyTimer > 0.0f)
|
|
|
- {
|
|
|
- g.SettingsDirtyTimer -= g.IO.DeltaTime;
|
|
|
- if (g.SettingsDirtyTimer <= 0.0f)
|
|
|
- SaveIniSettingsToDisk(g.IO.IniFilename);
|
|
|
- }
|
|
|
+ NewFrameUpdateMovingWindow();
|
|
|
|
|
|
// Find the window we are hovering
|
|
|
// - Child windows can extend beyond the limit of their parent so we need to derive HoveredRootWindow from HoveredWindow.
|