| 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 | |