mirror of
https://github.com/ocornut/imgui.git
synced 2024-11-24 05:19:02 +08:00
NewFrame: Extract some code into a NewFrameUpdateMouseInputs function. Moved settings saving higher up in the function so it is next to its peers.
This commit is contained in:
parent
2464e62a1a
commit
ac2027c415
124
imgui.cpp
124
imgui.cpp
@ -755,7 +755,8 @@ static void NavUpdate();
|
|||||||
static void NavUpdateWindowing();
|
static void NavUpdateWindowing();
|
||||||
static void NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, const ImGuiID id);
|
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 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);
|
static void FocusFrontMostActiveWindow(ImGuiWindow* ignore_window);
|
||||||
}
|
}
|
||||||
@ -3249,7 +3250,7 @@ static void ImGui::NavUpdate()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ImGui::UpdateMovingWindow()
|
static void ImGui::NewFrameUpdateMovingWindow()
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
if (g.MovingWindow && g.MovingWindow->MoveId == g.ActiveId && g.ActiveIdSource == ImGuiInputSource_Mouse)
|
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()
|
void ImGui::NewFrame()
|
||||||
{
|
{
|
||||||
IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() or ImGui::SetCurrentContext()?");
|
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;
|
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.Time += g.IO.DeltaTime;
|
||||||
g.FrameCount += 1;
|
g.FrameCount += 1;
|
||||||
g.TooltipOverrideCount = 0;
|
g.TooltipOverrideCount = 0;
|
||||||
@ -3372,53 +3434,7 @@ void ImGui::NewFrame()
|
|||||||
NavUpdate();
|
NavUpdate();
|
||||||
|
|
||||||
// Update mouse input state
|
// 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
|
NewFrameUpdateMouseInputs();
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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];
|
||||||
@ -3427,15 +3443,7 @@ void ImGui::NewFrame()
|
|||||||
g.IO.Framerate = 1.0f / (g.FramerateSecPerFrameAccum / (float)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)
|
// Handle user moving window with mouse (at the beginning of the frame to avoid input lag or sheering)
|
||||||
UpdateMovingWindow();
|
NewFrameUpdateMovingWindow();
|
||||||
|
|
||||||
// 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find the window we are hovering
|
// Find the window we are hovering
|
||||||
// - Child windows can extend beyond the limit of their parent so we need to derive HoveredRootWindow from HoveredWindow.
|
// - Child windows can extend beyond the limit of their parent so we need to derive HoveredRootWindow from HoveredWindow.
|
||||||
|
@ -1118,7 +1118,7 @@ namespace ImGui
|
|||||||
IMGUI_API int ParseFormatPrecision(const char* fmt, int default_value);
|
IMGUI_API int ParseFormatPrecision(const char* fmt, int default_value);
|
||||||
IMGUI_API float RoundScalar(float value, int decimal_precision);
|
IMGUI_API float RoundScalar(float value, int decimal_precision);
|
||||||
|
|
||||||
// Shade functions
|
// Shade functions (write over already created vertices)
|
||||||
IMGUI_API void ShadeVertsLinearColorGradientKeepAlpha(ImDrawVert* vert_start, ImDrawVert* vert_end, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1);
|
IMGUI_API void ShadeVertsLinearColorGradientKeepAlpha(ImDrawVert* vert_start, ImDrawVert* vert_end, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1);
|
||||||
IMGUI_API void ShadeVertsLinearAlphaGradientForLeftToRightText(ImDrawVert* vert_start, ImDrawVert* vert_end, float gradient_p0_x, float gradient_p1_x);
|
IMGUI_API void ShadeVertsLinearAlphaGradientForLeftToRightText(ImDrawVert* vert_start, ImDrawVert* vert_end, float gradient_p0_x, float gradient_p1_x);
|
||||||
IMGUI_API void ShadeVertsLinearUV(ImDrawVert* vert_start, ImDrawVert* vert_end, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, bool clamp);
|
IMGUI_API void ShadeVertsLinearUV(ImDrawVert* vert_start, ImDrawVert* vert_end, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, bool clamp);
|
||||||
|
Loading…
Reference in New Issue
Block a user