99 lines
3.1 KiB
Lua
99 lines
3.1 KiB
Lua
local max,min,sub,rep = math.max,math.min,string.sub,string.rep
|
|
|
|
return function(name, basalt)
|
|
local base = basalt.getObject("Frame")(name, basalt)
|
|
local objectType = "MovableFrame"
|
|
local parent
|
|
|
|
local dragXOffset, dragYOffset, isDragging = 0, 0, false
|
|
|
|
local dragMap = {
|
|
{x1 = 1, x2 = "width", y1 = 1, y2 = 1}
|
|
}
|
|
|
|
local object = {
|
|
getType = function()
|
|
return objectType
|
|
end,
|
|
|
|
setDraggingMap = function(self, t)
|
|
dragMap = t
|
|
return self
|
|
end,
|
|
|
|
getDraggingMap = function(self)
|
|
return dragMap
|
|
end,
|
|
|
|
isType = function(self, t)
|
|
return objectType==t or (base.isType~=nil and base.isType(t)) or false
|
|
end,
|
|
|
|
getBase = function(self)
|
|
return base
|
|
end,
|
|
|
|
load = function(self)
|
|
base.load(self)
|
|
self:listenEvent("mouse_click")
|
|
self:listenEvent("mouse_up")
|
|
self:listenEvent("mouse_drag")
|
|
end,
|
|
|
|
removeChildren = function(self)
|
|
base.removeChildren(self)
|
|
self:listenEvent("mouse_click")
|
|
self:listenEvent("mouse_up")
|
|
self:listenEvent("mouse_drag")
|
|
end,
|
|
|
|
dragHandler = function(self, btn, x, y)
|
|
if(base.dragHandler(self, btn, x, y))then
|
|
if (isDragging) then
|
|
local xO, yO = parent:getOffset()
|
|
xO = xO < 0 and math.abs(xO) or -xO
|
|
yO = yO < 0 and math.abs(yO) or -yO
|
|
local parentX = 1
|
|
local parentY = 1
|
|
parentX, parentY = parent:getAbsolutePosition()
|
|
self:setPosition(x + dragXOffset - (parentX - 1) + xO, y + dragYOffset - (parentY - 1) + yO)
|
|
self:updateDraw()
|
|
end
|
|
return true
|
|
end
|
|
end,
|
|
|
|
mouseHandler = function(self, btn, x, y, ...)
|
|
if(base.mouseHandler(self, btn, x, y, ...))then
|
|
parent:setImportant(self)
|
|
local fx, fy = self:getAbsolutePosition()
|
|
local w, h = self:getSize()
|
|
for k,v in pairs(dragMap)do
|
|
local x1, x2 = v.x1=="width" and w or v.x1, v.x2=="width" and w or v.x2
|
|
local y1, y2= v.y1=="height" and h or v.y1, v.y2=="height" and h or v.y2
|
|
if(x>=fx+x1-1)and(x<=fx+x2-1)and(y>=fy+y1-1)and(y<=fy+y2-1)then
|
|
isDragging = true
|
|
dragXOffset = fx - x
|
|
dragYOffset = fy - y
|
|
return true
|
|
end
|
|
end
|
|
return true
|
|
end
|
|
end,
|
|
|
|
mouseUpHandler = function(self, ...)
|
|
isDragging = false
|
|
return base.mouseUpHandler(self, ...)
|
|
end,
|
|
|
|
setParent = function(self, p, ...)
|
|
base.setParent(self, p, ...)
|
|
parent = p
|
|
return self
|
|
end,
|
|
}
|
|
|
|
object.__index = object
|
|
return setmetatable(object, base)
|
|
end |