myspace / CommonLua /X /XMoveControl.lua
sirnii's picture
Upload 1816 files
b6a38d7 verified
raw
history blame
2.1 kB
DefineClass.XMoveControl = {
__parents = { "XControl" },
properties = {
{ category = "Interaction", id = "ConstrainInParent", editor = "bool", default = false },
},
IdNode = false,
Target = "node",
HandleMouse = true,
box_at_drag_start = false,
pt_at_drag_start = false,
}
function XMoveControl:ApplyOffsetToTarget(target, offsetP)
if target.Dock == "ignore" then
local oldB = target.box
target:SetBox(offsetP:x(), offsetP:y(), oldB:sizex(), oldB:sizey())
else
local unscale = MulDivRoundPoint(offsetP, point(1000, 1000), target.scale)
target:SetMargins(box(unscale:x(), unscale:y(), 0, 0))
end
end
function XMoveControl:OnMouseButtonDown(pt, button)
if button == "L" then
local target = self:ResolveId(self.Target) or GetParentOfKind(self, self.Target)
local curB = target.box
self:ApplyOffsetToTarget(target, curB:min())
target:SetHAlign("left")
target:SetVAlign("top")
self:SetFocus()
self.desktop:SetMouseCapture(self)
self:OnDragStart()
self.box_at_drag_start = target.box
self.pt_at_drag_start = pt
self:OnMousePos(pt)
end
return "break"
end
function XMoveControl:OnMousePos(pt)
if self.desktop:GetMouseCapture() == self then
local old_box = self.box_at_drag_start
local diff = pt - self.pt_at_drag_start
local newbox = sizebox(old_box:min() + diff, old_box:size())
local target = self:ResolveId(self.Target) or GetParentOfKind(self, self.Target)
if self.ConstrainInParent then
local x1, y1, x2, y2 = target:GetEffectiveMargins()
local margins = box(-x1, -y1, x2, y2)
newbox = FitBoxInBox(newbox + margins, target.parent.box) - margins
end
self:OnDragDelta(newbox:min() - target.box:min())
self:ApplyOffsetToTarget(target, newbox:min())
end
return "break"
end
function XMoveControl:OnMouseButtonUp(pt, button)
if self.desktop:GetMouseCapture() == self and button == "L" then
self:OnMousePos(pt)
self.desktop:SetMouseCapture()
self:OnDragEnd()
end
return "break"
end
function XMoveControl:OnDragStart()
end
function XMoveControl:OnDragEnd()
end
function XMoveControl:OnDragDelta(delta)
end