uiscrollarea.lua

main 191 lines · 5.5 KB Raw
Alex Alex Commit Client Upload Part 2 19/10/2026 00:06
1-- @docclass
2UIScrollArea = extends(UIWidget, "UIScrollArea")
3
4-- public functions
5function UIScrollArea.create()
6 local scrollarea = UIScrollArea.internalCreate()
7 scrollarea:setClipping(true)
8 scrollarea.inverted = false
9 scrollarea.alwaysScrollMaximum = false
10 return scrollarea
11end
12
13function UIScrollArea:onStyleApply(styleName, styleNode)
14 for name,value in pairs(styleNode) do
15 if name == 'vertical-scrollbar' then
16 addEvent(function()
17 local parent = self:getParent()
18 if parent then
19 self:setVerticalScrollBar(parent:getChildById(value))
20 end
21 end)
22 elseif name == 'horizontal-scrollbar' then
23 addEvent(function()
24 local parent = self:getParent()
25 if parent then
26 self:setHorizontalScrollBar(self:getParent():getChildById(value))
27 end
28 end)
29 elseif name == 'inverted-scroll' then
30 self:setInverted(value)
31 elseif name == 'always-scroll-maximum' then
32 self:setAlwaysScrollMaximum(value)
33 end
34 end
35end
36
37function UIScrollArea:updateScrollBars()
38 local scrollWidth = math.max(self:getChildrenRect().width - self:getPaddingRect().width, 0)
39 local scrollHeight = math.max(self:getChildrenRect().height - self:getPaddingRect().height, 0)
40
41 local scrollbar = self.verticalScrollBar
42 if scrollbar then
43 if self.inverted then
44 scrollbar:setMinimum(-scrollHeight)
45 scrollbar:setMaximum(0)
46 else
47 scrollbar:setMinimum(0)
48 scrollbar:setMaximum(scrollHeight)
49 end
50 end
51
52 local scrollbar = self.horizontalScrollBar
53 if scrollbar then
54 if self.inverted then
55 scrollbar:setMinimum(-scrollWidth)
56 scrollbar:setMaximum(0)
57 else
58 scrollbar:setMinimum(0)
59 scrollbar:setMaximum(scrollWidth)
60 end
61 end
62
63 if self.lastScrollWidth ~= scrollWidth then
64 self:onScrollWidthChange()
65 end
66 if self.lastScrollHeight ~= scrollHeight then
67 self:onScrollHeightChange()
68 end
69
70 self.lastScrollWidth = scrollWidth
71 self.lastScrollHeight = scrollHeight
72end
73
74function UIScrollArea:setVerticalScrollBar(scrollbar)
75 self.verticalScrollBar = scrollbar
76 connect(self.verticalScrollBar, 'onValueChange', function(scrollbar, value)
77 local virtualOffset = self:getVirtualOffset()
78 virtualOffset.y = value
79 self:setVirtualOffset(virtualOffset)
80 signalcall(self.onScrollChange, self, virtualOffset)
81 end)
82 self:updateScrollBars()
83end
84
85function UIScrollArea:setHorizontalScrollBar(scrollbar)
86 self.horizontalScrollBar = scrollbar
87 connect(self.horizontalScrollBar, 'onValueChange', function(scrollbar, value)
88 local virtualOffset = self:getVirtualOffset()
89 virtualOffset.x = value
90 self:setVirtualOffset(virtualOffset)
91 signalcall(self.onScrollChange, self, virtualOffset)
92 end)
93 self:updateScrollBars()
94end
95
96function UIScrollArea:setInverted(inverted)
97 self.inverted = inverted
98end
99
100function UIScrollArea:setAlwaysScrollMaximum(value)
101 self.alwaysScrollMaximum = value
102end
103
104function UIScrollArea:onLayoutUpdate()
105 self:updateScrollBars()
106end
107
108function UIScrollArea:onMouseWheel(mousePos, mouseWheel)
109 if self.verticalScrollBar then
110 if not self.verticalScrollBar:isOn() then
111 return false
112 end
113 if mouseWheel == MouseWheelUp then
114 local minimum = self.verticalScrollBar:getMinimum()
115 if self.verticalScrollBar:getValue() <= minimum then
116 return false
117 end
118 self.verticalScrollBar:decrement()
119 else
120 local maximum = self.verticalScrollBar:getMaximum()
121 if self.verticalScrollBar:getValue() >= maximum then
122 return false
123 end
124 self.verticalScrollBar:increment()
125 end
126 elseif self.horizontalScrollBar then
127 if not self.horizontalScrollBar:isOn() then
128 return false
129 end
130 if mouseWheel == MouseWheelUp then
131 local maximum = self.horizontalScrollBar:getMaximum()
132 if self.horizontalScrollBar:getValue() >= maximum then
133 return false
134 end
135 self.horizontalScrollBar:increment()
136 else
137 local minimum = self.horizontalScrollBar:getMinimum()
138 if self.horizontalScrollBar:getValue() <= minimum then
139 return false
140 end
141 self.horizontalScrollBar:decrement()
142 end
143 end
144 return true
145end
146
147function UIScrollArea:ensureChildVisible(child)
148 if child then
149 local paddingRect = self:getPaddingRect()
150 if self.verticalScrollBar then
151 local deltaY = paddingRect.y - child:getY()
152 if deltaY > 0 then
153 self.verticalScrollBar:decrement(deltaY)
154 end
155
156 deltaY = (child:getY() + child:getHeight()) - (paddingRect.y + paddingRect.height)
157 if deltaY > 0 then
158 self.verticalScrollBar:increment(deltaY)
159 end
160 elseif self.horizontalScrollBar then
161 local deltaX = paddingRect.x - child:getX()
162 if deltaX > 0 then
163 self.horizontalScrollBar:decrement(deltaX)
164 end
165
166 deltaX = (child:getX() + child:getWidth()) - (paddingRect.x + paddingRect.width)
167 if deltaX > 0 then
168 self.horizontalScrollBar:increment(deltaX)
169 end
170 end
171 end
172end
173
174function UIScrollArea:onChildFocusChange(focusedChild, oldFocused, reason)
175 if focusedChild and (reason == MouseFocusReason or reason == KeyboardFocusReason) then
176 self:ensureChildVisible(focusedChild)
177 end
178end
179
180function UIScrollArea:onScrollWidthChange()
181 if self.alwaysScrollMaximum and self.horizontalScrollBar then
182 self.horizontalScrollBar:setValue(self.horizontalScrollBar:getMaximum())
183 end
184end
185
186function UIScrollArea:onScrollHeightChange()
187 if self.alwaysScrollMaximum and self.verticalScrollBar then
188 self.verticalScrollBar:setValue(self.verticalScrollBar:getMaximum())
189 end
190end
191
Top