better controls over themed scrollbars

This commit is contained in:
Michael Freno
2025-12-06 11:11:15 -05:00
parent b18592f358
commit 986887c2cc
8 changed files with 135 additions and 4 deletions

View File

@@ -9,6 +9,7 @@
---@field scrollbarPadding number -- Padding around scrollbar
---@field scrollSpeed number -- Scroll speed for wheel events (pixels per wheel unit)
---@field scrollBarStyle string? -- Scrollbar style name from theme (selects from theme.scrollbars)
---@field scrollbarKnobOffset table -- {x: number, y: number, horizontal: number, vertical: number} -- Offset for scrollbar knob/handle position
---@field hideScrollbars table -- {vertical: boolean, horizontal: boolean}
---@field touchScrollEnabled boolean -- Enable touch scrolling
---@field momentumScrollEnabled boolean -- Enable momentum scrolling
@@ -84,6 +85,9 @@ function ScrollManager.new(config, deps)
self.scrollSpeed = config.scrollSpeed or 20
self.scrollBarStyle = config.scrollBarStyle -- Theme scrollbar style name (nil = use default)
-- scrollbarKnobOffset can be number or table {x, y} or {horizontal, vertical}
self.scrollbarKnobOffset = self._utils.normalizeOffsetTable(config.scrollbarKnobOffset, 0)
-- hideScrollbars can be boolean or table {vertical: boolean, horizontal: boolean}
self.hideScrollbars = self._utils.normalizeBooleanTable(config.hideScrollbars, false)
@@ -656,6 +660,7 @@ function ScrollManager:getState()
_scrollbarHoveredVertical = self._scrollbarHoveredVertical or false,
_scrollbarHoveredHorizontal = self._scrollbarHoveredHorizontal or false,
scrollBarStyle = self.scrollBarStyle,
scrollbarKnobOffset = self.scrollbarKnobOffset,
_overflowX = self._overflowX,
_overflowY = self._overflowY,
_contentWidth = self._contentWidth,
@@ -730,6 +735,10 @@ function ScrollManager:setState(state)
self.scrollBarStyle = state.scrollBarStyle
end
if state.scrollbarKnobOffset ~= nil then
self.scrollbarKnobOffset = self._utils.normalizeOffsetTable(state.scrollbarKnobOffset, 0)
end
if state._overflowX ~= nil then
self._overflowX = state._overflowX
end