Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --- wafflecow321
- local uis = game:GetService("UserInputService")
- local slider = {}
- slider.__index = slider
- --[[
- All slide have their dragging frame named handle
- ]]--
- local DEFAULTXALIGN = 0.5
- ---- private functions
- local function getAbsoluteCanvasSize(sFrame)
- local size = sFrame.Parent.AbsoluteSize and Vector2.new(sFrame.CanvasSize.X.Scale, sFrame.CanvasSize.Y.Scale) * sFrame.Parent.AbsoluteSize or Vector2.new(0, 0)
- return size + Vector2.new(sFrame.CanvasSize.X.Offset, sFrame.CanvasSize.Y.Offset)
- end
- local function v2FromV3(v3)
- return Vector2.new(v3.X, v3.Y)
- end
- ---- public/object functions
- function slider:startDrag(input, gp)
- if gp then return end
- if not self.dragging and input.UserInputType == Enum.UserInputType.MouseButton1 then
- self.dragging = true
- end
- end
- function slider:endDrag(input, gp)
- if input.UserInputType == Enum.UserInputType.MouseButton1 then
- self.dragging = false
- end
- end
- function slider:updateDrag(input, gp)
- local bar, handle, scrollingFrame = self.frame, self.frame.Handle, self.scrollingFrame
- if self.dragging then
- -- get y scale position
- local inputPosition = v2FromV3(input.Position)
- local objectSpace = inputPosition - handle.Parent.AbsolutePosition
- local yScale = math.clamp(objectSpace.Y/bar.AbsoluteSize.Y,0,1)
- --- apply position
- handle.Position = UDim2.new(self.xAlign, 0, yScale, 0)
- --- update scrolling frame
- if scrollingFrame then
- local absCanvasSize = getAbsoluteCanvasSize(scrollingFrame)
- scrollingFrame.CanvasPosition = Vector2.new(0, yScale * (absCanvasSize.Y - scrollingFrame.AbsoluteWindowSize.Y))
- end
- end
- end
- function slider:scrollingFrameUpdate()
- if not self.dragging and self.scrollingFrame then
- local absCanvasSize = getAbsoluteCanvasSize(self.scrollingFrame)
- local canvPosition = self.scrollingFrame.CanvasPosition
- self.frame.Visible = absCanvasSize.Y > self.scrollingFrame.AbsoluteWindowSize.Y
- self.frame.Handle.Position = UDim2.new(self.xAlign, 0, canvPosition.Y/(absCanvasSize.Y - self.scrollingFrame.AbsoluteWindowSize.Y), 0)
- end
- end
- --- constructor
- function slider.new(sliderFrame, scrollingFrame, xAlign)
- local s = setmetatable({}, slider)
- s.frame = sliderFrame
- s.scrollingFrame = scrollingFrame
- s.xAlign = xAlign or DEFAULTXALIGN
- --- handle sliding behavior
- if s.frame:FindFirstChild("Handle") then
- s.frame.Handle.InputBegan:Connect(function(...)
- s:startDrag(...)
- end)
- s.frame.Handle.InputEnded:Connect(function(...)
- s:endDrag(...)
- end)
- uis.InputChanged:Connect(function(...)
- s:updateDrag(...)
- end)
- else
- warn("No Handle Frame in sliding frame, can't create slider")
- end
- --- handle scrollingframe changes
- if s.scrollingFrame then
- local function a(...)
- return s:scrollingFrameUpdate(...)
- end
- a()
- scrollingFrame:GetPropertyChangedSignal("CanvasPosition"):Connect(a)
- scrollingFrame:GetPropertyChangedSignal("CanvasSize"):Connect(a)
- end
- return s
- end
- return slider
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement