@@ -432,6 +432,9 @@ local Draggable = beClass.class({
432
432
_draggingPosition = nil ,
433
433
_dragging = false ,
434
434
_dragOffset = nil ,
435
+ _draggingX = 0 , _draggingY = 0 ,
436
+ _draggingEvent = nil ,
437
+ _draggingTimeout = false ,
435
438
436
439
-- Constructs a Draggable.
437
440
ctor = function (self )
@@ -448,6 +451,10 @@ local Draggable = beClass.class({
448
451
return ' children'
449
452
end ,
450
453
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
+
451
458
_update = function (self , theme , delta , dx , dy , event )
452
459
if not self .visibility then
453
460
return
@@ -464,25 +471,57 @@ local Draggable = beClass.class({
464
471
else
465
472
down = event .mouseDown and intersects
466
473
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.
468
481
event .context .dragging = self
469
482
self ._draggedTimestamp = DateTime .ticks ()
470
483
self ._draggedPosition = event .mousePosition
471
484
self ._draggingPosition = event .mousePosition
472
485
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.
474
501
event .context .dragging = nil
475
502
self ._draggedTimestamp = nil
476
503
self ._draggedPosition = nil
477
504
self ._draggingPosition = nil
478
505
self ._dragging = false
479
506
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.
481
511
if self ._draggedTimestamp ~= nil then
482
512
local diff = DateTime .toSeconds (DateTime .ticks () - self ._draggedTimestamp )
483
513
if diff < 0.3 and self ._draggedPosition ~= self ._draggingPosition then
484
514
self ._dragging = true
485
515
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
486
525
end
487
526
end
488
527
end
@@ -493,25 +532,24 @@ local Draggable = beClass.class({
493
532
end
494
533
self ._draggingPosition = event .mousePosition
495
534
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
512
547
end
513
548
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
515
553
end
516
554
}, beWidget .Widget )
517
555
0 commit comments