mirror of
https://github.com/centau/vide.git
synced 2026-08-20 14:41:37 +00:00
Add draggable functionality for GUI elements
-- DOES NOT USE DEPRECATED .DRAGGABLE!
This commit is contained in:
parent
341e321527
commit
3b2794c6d5
1 changed files with 81 additions and 0 deletions
81
src/draggable.luau
Normal file
81
src/draggable.luau
Normal file
|
|
@ -0,0 +1,81 @@
|
||||||
|
-- vide/draggable.luau
|
||||||
|
local UserInputService = game:GetService("UserInputService")
|
||||||
|
|
||||||
|
return function(action, cleanup)
|
||||||
|
return function(opts)
|
||||||
|
opts = opts or {}
|
||||||
|
local axis = opts.axis or "both" -- "x" | "y" | "both"
|
||||||
|
|
||||||
|
return action(function(gui)
|
||||||
|
local dragging = false
|
||||||
|
local dragInput
|
||||||
|
local dragStart
|
||||||
|
local startPos
|
||||||
|
|
||||||
|
local function update(input)
|
||||||
|
local delta = input.Position - dragStart
|
||||||
|
|
||||||
|
local xOff = startPos.X.Offset
|
||||||
|
local yOff = startPos.Y.Offset
|
||||||
|
|
||||||
|
if axis == "x" or axis == "both" then
|
||||||
|
xOff = startPos.X.Offset + delta.X
|
||||||
|
end
|
||||||
|
if axis == "y" or axis == "both" then
|
||||||
|
yOff = startPos.Y.Offset + delta.Y
|
||||||
|
end
|
||||||
|
|
||||||
|
gui.Position = UDim2.new(startPos.X.Scale, xOff, startPos.Y.Scale, yOff)
|
||||||
|
|
||||||
|
if opts.onDrag then
|
||||||
|
opts.onDrag(gui.Position)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local beganConn = gui.InputBegan:Connect(function(input)
|
||||||
|
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
|
||||||
|
dragging = true
|
||||||
|
dragStart = input.Position
|
||||||
|
startPos = gui.Position
|
||||||
|
|
||||||
|
if opts.onDragStart then
|
||||||
|
opts.onDragStart(startPos)
|
||||||
|
end
|
||||||
|
|
||||||
|
local changedConn
|
||||||
|
changedConn = input.Changed:Connect(function()
|
||||||
|
if input.UserInputState == Enum.UserInputState.End then
|
||||||
|
dragging = false
|
||||||
|
if changedConn then changedConn:Disconnect() end
|
||||||
|
if opts.onDragEnd then
|
||||||
|
opts.onDragEnd(gui.Position)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
cleanup(function()
|
||||||
|
if changedConn then changedConn:Disconnect() end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
local changedConn = gui.InputChanged:Connect(function(input)
|
||||||
|
if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then
|
||||||
|
dragInput = input
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
local uisConn = UserInputService.InputChanged:Connect(function(input)
|
||||||
|
if input == dragInput and dragging then
|
||||||
|
update(input)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
cleanup(function()
|
||||||
|
beganConn:Disconnect()
|
||||||
|
changedConn:Disconnect()
|
||||||
|
uisConn:Disconnect()
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
Add table
Add a link
Reference in a new issue