Advertisement
poopman123

UIScrollingSliderClass

Jun 26th, 2021
1,191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.93 KB | None | 0 0
  1. --- wafflecow321
  2. local uis = game:GetService("UserInputService")
  3. local slider = {}
  4. slider.__index = slider
  5. --[[
  6. All slide have their dragging frame named handle
  7. ]]--
  8. local DEFAULTXALIGN = 0.5
  9. ---- private functions
  10. local function getAbsoluteCanvasSize(sFrame)
  11.     local size = sFrame.Parent.AbsoluteSize and Vector2.new(sFrame.CanvasSize.X.Scale, sFrame.CanvasSize.Y.Scale) * sFrame.Parent.AbsoluteSize or Vector2.new(0, 0)
  12.     return size + Vector2.new(sFrame.CanvasSize.X.Offset, sFrame.CanvasSize.Y.Offset)
  13. end
  14. local function v2FromV3(v3)
  15.     return Vector2.new(v3.X, v3.Y)
  16. end
  17. ---- public/object functions
  18. function slider:startDrag(input, gp)
  19.     if gp then return end
  20.     if not self.dragging and input.UserInputType == Enum.UserInputType.MouseButton1 then
  21.         self.dragging = true
  22.     end
  23. end
  24. function slider:endDrag(input, gp)
  25.     if input.UserInputType == Enum.UserInputType.MouseButton1 then
  26.         self.dragging = false
  27.     end
  28. end
  29. function slider:updateDrag(input, gp)
  30.     local bar, handle, scrollingFrame = self.frame, self.frame.Handle, self.scrollingFrame
  31.     if self.dragging then
  32.         -- get y scale position
  33.         local inputPosition = v2FromV3(input.Position)
  34.         local objectSpace = inputPosition - handle.Parent.AbsolutePosition
  35.         local yScale = math.clamp(objectSpace.Y/bar.AbsoluteSize.Y,0,1)
  36.         --- apply position
  37.         handle.Position = UDim2.new(self.xAlign, 0, yScale, 0)
  38.         --- update scrolling frame
  39.         if scrollingFrame then
  40.             local absCanvasSize = getAbsoluteCanvasSize(scrollingFrame)
  41.             scrollingFrame.CanvasPosition = Vector2.new(0, yScale * (absCanvasSize.Y - scrollingFrame.AbsoluteWindowSize.Y))
  42.         end
  43.     end
  44. end
  45. function slider:scrollingFrameUpdate()
  46.     if not self.dragging and self.scrollingFrame then
  47.         local absCanvasSize = getAbsoluteCanvasSize(self.scrollingFrame)
  48.         local canvPosition = self.scrollingFrame.CanvasPosition
  49.         self.frame.Visible = absCanvasSize.Y > self.scrollingFrame.AbsoluteWindowSize.Y
  50.         self.frame.Handle.Position = UDim2.new(self.xAlign, 0, canvPosition.Y/(absCanvasSize.Y - self.scrollingFrame.AbsoluteWindowSize.Y), 0)
  51.     end
  52. end
  53. --- constructor
  54. function slider.new(sliderFrame, scrollingFrame, xAlign)
  55.     local s = setmetatable({}, slider)
  56.     s.frame = sliderFrame
  57.     s.scrollingFrame = scrollingFrame
  58.     s.xAlign = xAlign or DEFAULTXALIGN
  59.     --- handle sliding behavior
  60.     if s.frame:FindFirstChild("Handle") then
  61.         s.frame.Handle.InputBegan:Connect(function(...)
  62.             s:startDrag(...)
  63.         end)
  64.         s.frame.Handle.InputEnded:Connect(function(...)
  65.             s:endDrag(...)
  66.         end)
  67.         uis.InputChanged:Connect(function(...)
  68.             s:updateDrag(...)
  69.         end)
  70.     else
  71.         warn("No Handle Frame in sliding frame, can't create slider")
  72.     end
  73.     --- handle scrollingframe changes
  74.     if s.scrollingFrame then
  75.         local function a(...)
  76.             return s:scrollingFrameUpdate(...)
  77.         end
  78.         a()
  79.         scrollingFrame:GetPropertyChangedSignal("CanvasPosition"):Connect(a)
  80.         scrollingFrame:GetPropertyChangedSignal("CanvasSize"):Connect(a)
  81.     end
  82.     return s
  83. end
  84.  
  85. return slider
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement