dep/imgui: Fix smooth scrolling on scrollbar drag

pull/3326/head
Stenzek 4 months ago
parent b4e509d090
commit 09a825720d
No known key found for this signature in database

@ -2255,6 +2255,7 @@ struct ImGuiContext
ImGuiComboPreviewData ComboPreviewData;
ImRect WindowResizeBorderExpectedRect; // Expected border rect, switch to relative edit if moving
bool WindowResizeRelativeMode;
unsigned char ScrollbarHeld; // Is the scrollbar scrolling the window?
short ScrollbarSeekMode; // 0: relative, -1/+1: prev/next page.
float ScrollbarClickDeltaToGrabCenter; // Distance between mouse and center of grab box, normalized in parent space. Use storage?
float SliderGrabClickOffset;
@ -2478,6 +2479,7 @@ struct ImGuiContext
ColorEditSavedHue = ColorEditSavedSat = 0.0f;
ColorEditSavedColor = 0;
WindowResizeRelativeMode = false;
ScrollbarHeld = false;
ScrollbarSeekMode = 0;
ScrollbarClickDeltaToGrabCenter = 0.0f;
SliderGrabClickOffset = 0.0f;

@ -4792,6 +4792,7 @@ void ImGui::NewFrame()
g.HoveredId = 0;
g.HoveredIdAllowOverlap = false;
g.HoveredIdIsDisabled = false;
g.ScrollbarHeld >>= 1;
// Clear ActiveID if the item is not alive anymore.
// In 1.87, the common most call to KeepAliveID() was moved from GetID() to ItemAdd().
@ -10802,7 +10803,7 @@ static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window)
else
scroll[axis] -= ImMin(-diff, (-diff / (style.ScrollSmooth * multiplier)));
scroll[axis] = window->Appearing ? window->ScrollExpected[axis] : scroll[axis];
scroll[axis] = (window->Appearing || g.ScrollbarHeld & 1) ? window->ScrollExpected[axis] : scroll[axis];
}
}
return scroll;

@ -1001,7 +1001,7 @@ bool ImGui::ScrollbarEx(const ImRect& bb_frame, ImGuiID id, ImGuiAxis axis, ImS6
{
// On initial click calculate the distance between mouse and the center of the grab
g.ScrollbarSeekMode = (short)held_dir;
g.ScrollbarClickDeltaToGrabCenter = (g.ScrollbarSeekMode == 0.0f) ? clicked_v_norm - grab_v_norm - grab_h_norm * 0.5f : 0.0f;
g.ScrollbarClickDeltaToGrabCenter = (g.ScrollbarSeekMode == 0) ? clicked_v_norm - grab_v_norm - grab_h_norm * 0.5f : 0.0f;
}
// Apply scroll (p_scroll_v will generally point on one member of window->Scroll)
@ -1025,6 +1025,7 @@ bool ImGui::ScrollbarEx(const ImRect& bb_frame, ImGuiID id, ImGuiAxis axis, ImS6
// Update values for rendering
scroll_ratio = ImSaturate((float)*p_scroll_v / (float)scroll_max);
grab_v_norm = scroll_ratio * (scrollbar_size_v - grab_h_pixels) / scrollbar_size_v;
g.ScrollbarHeld |= 2;
// Update distance to grab now that we have seek'ed and saturated
//if (seek_absolute)

Loading…
Cancel
Save