Skip to content

Commit f890ebb

Browse files
committed
*Improved drag&drop.
1 parent abc58c9 commit f890ebb

File tree

3 files changed

+75
-25
lines changed

3 files changed

+75
-25
lines changed

src/libs/beGUI/beGUI_Containers.lua

Lines changed: 58 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,9 @@ local Draggable = beClass.class({
432432
_draggingPosition = nil,
433433
_dragging = false,
434434
_dragOffset = nil,
435+
_draggingX = 0, _draggingY = 0,
436+
_draggingEvent = nil,
437+
_draggingTimeout = false,
435438

436439
-- Constructs a Draggable.
437440
ctor = function (self)
@@ -448,6 +451,10 @@ local Draggable = beClass.class({
448451
return 'children'
449452
end,
450453

454+
updateDragging = function (self, theme, delta, event)
455+
beWidget.Widget._update(self, theme, delta, self._draggingX, self._draggingY, self._draggingEvent or event)
456+
end,
457+
451458
_update = function (self, theme, delta, dx, dy, event)
452459
if not self.visibility then
453460
return
@@ -464,25 +471,57 @@ local Draggable = beClass.class({
464471
else
465472
down = event.mouseDown and intersects
466473
end
467-
if down and not event.context.dragging then
474+
local picking = false
475+
local dropping = false
476+
if self._draggingTimeout then
477+
if not down then
478+
self._draggingTimeout = false
479+
end
480+
elseif down and not event.context.dragging then -- Picked the current widget.
468481
event.context.dragging = self
469482
self._draggedTimestamp = DateTime.ticks()
470483
self._draggedPosition = event.mousePosition
471484
self._draggingPosition = event.mousePosition
472485
self._dragging = false
473-
elseif not down and event.context.dragging == self then
486+
picking = true
487+
self._draggingEvent = {
488+
mousePosition = event.mousePosition,
489+
mouseDown = false,
490+
mouseWheel = 0,
491+
canceled = false,
492+
context = {
493+
navigated = nil,
494+
focus = nil,
495+
active = nil,
496+
dragging = nil,
497+
popup = nil
498+
}
499+
}
500+
elseif not down and event.context.dragging == self then -- Dropped the current widget.
474501
event.context.dragging = nil
475502
self._draggedTimestamp = nil
476503
self._draggedPosition = nil
477504
self._draggingPosition = nil
478505
self._dragging = false
479506
self._dragOffset = Vec2.new(0, 0)
480-
elseif down and event.context.dragging == self then
507+
dropping = true
508+
self._draggingEvent = nil
509+
self._draggingTimeout = false
510+
elseif down and event.context.dragging == self then -- Is dragging the current widget.
481511
if self._draggedTimestamp ~= nil then
482512
local diff = DateTime.toSeconds(DateTime.ticks() - self._draggedTimestamp)
483513
if diff < 0.3 and self._draggedPosition ~= self._draggingPosition then
484514
self._dragging = true
485515
self._draggedTimestamp = nil
516+
elseif diff >= 0.3 and self._draggedPosition ~= self._draggingPosition then
517+
event.context.dragging = nil
518+
self._draggedTimestamp = nil
519+
self._draggedPosition = nil
520+
self._draggingPosition = nil
521+
self._dragging = false
522+
self._dragOffset = Vec2.new(0, 0)
523+
self._draggingEvent = nil
524+
self._draggingTimeout = true
486525
end
487526
end
488527
end
@@ -493,25 +532,24 @@ local Draggable = beClass.class({
493532
end
494533
self._draggingPosition = event.mousePosition
495534
end
496-
if not intersects then
497-
event = {
498-
mousePosition = event.mousePosition,
499-
mouseDown = false,
500-
mouseWheel = 0,
501-
canceled = false,
502-
context = event.context
503-
}
504-
elseif self._dragging then
505-
event = {
506-
mousePosition = event.mousePosition,
507-
mouseDown = false,
508-
mouseWheel = 0,
509-
canceled = event.canceled,
510-
context = event.context
511-
}
535+
if self._draggingEvent then
536+
if self._dragging then
537+
self._draggingEvent.mousePosition = nil
538+
self._draggingEvent.mouseDown = false
539+
self._draggingEvent.mouseWheel = 0
540+
self._draggingEvent.canceled = true
541+
else
542+
self._draggingEvent.mousePosition = event.mousePosition
543+
self._draggingEvent.mouseDown = event.mouseDown
544+
self._draggingEvent.mouseWheel = event.mouseWheel
545+
self._draggingEvent.canceled = event.canceled
546+
end
512547
end
513548

514-
beWidget.Widget._update(self, theme, delta, dx + self._dragOffset.x, dy + self._dragOffset.y, event)
549+
self._draggingX, self._draggingY = dx + self._dragOffset.x, dy + self._dragOffset.y
550+
if not picking and not dropping and not self._dragging then
551+
beWidget.Widget._update(self, theme, delta, self._draggingX, self._draggingY, self._draggingEvent or event)
552+
end
515553
end
516554
}, beWidget.Widget)
517555

src/libs/beGUI/beGUI_Widget.lua

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ local beStructures = require 'libs/beGUI/beGUI_Structures'
2929
Widgets.
3030
]]
3131

32-
local Widget = beClass.class({
32+
local Widget = nil
33+
Widget = beClass.class({
3334
DEBUG = false,
3435

3536
id = nil, -- String.
@@ -678,6 +679,13 @@ local Widget = beClass.class({
678679
if event.context and event.context.focus == self and (event.context.navigated ~= nil or self.focusIfHovering) then
679680
self:_updateFocus(delta, x, y)
680681
end
682+
683+
if once then
684+
local dragging = self.context and self.context.dragging
685+
if dragging then
686+
dragging:updateDragging(theme, delta, event)
687+
end
688+
end
681689
end,
682690
_updateChildren = function (self, theme, delta, dx, dy, event)
683691
if self.children == nil then

src/main.lua

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -298,11 +298,15 @@ function setup()
298298
:put(0, 0)
299299
:resize(P(100), P(100))
300300
:addChild(
301-
beGUI.Label.new('Drag me')
302-
:setId('label')
301+
beGUI.Button.new('Drag me')
302+
:setId('button_draggable')
303303
:anchor(0, 0)
304-
:put(2, 0)
305-
:resize(P(100), P(100))
304+
:put(P(1), P(6))
305+
:resize(P(99), P(94))
306+
:on('clicked', function (sender)
307+
local lbl = widgets:get(2, 'label')
308+
lbl:setValue('Clicked ' .. sender.id)
309+
end)
306310
)
307311
)
308312
)

0 commit comments

Comments
 (0)