Skip to content

Commit 0b20f86

Browse files
committed
improved insert behaviour during list dran&drop ...
... and fixed a swipe-area click-through bug for long-press
1 parent 5eee09d commit 0b20f86

File tree

2 files changed

+36
-15
lines changed

2 files changed

+36
-15
lines changed

www/scripts/sepiaFW.ui.dragDrop.js

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ function sepiaFW_build_ui_drag_and_drop(){
5959
}
6060
refreshDragContainers();
6161
var activeDummy;
62+
var lastDummyPosition; //top, left relative to viewport
6263
var lastHoverElement;
6364
var $newNeighbourElement;
6465
var $dropZone; //currently we only need this if the drop-zone has no children
@@ -124,16 +125,22 @@ function sepiaFW_build_ui_drag_and_drop(){
124125
}, 500);
125126
}
126127
//move element
127-
this.moveTo = function($neighbour, $dropzone, doAnimate){
128+
this.moveTo = function($neighbour, $dropzone, doAnimate, referencePosition){
128129
var targetAndObjectSame = ($neighbour && $neighbour[0].isSameNode($dragObject[0]));
129130
var moved = false;
130131
if (($dropzone || $neighbour) && !targetAndObjectSame){
131132
//detach
132133
$dragObject.detach();
133134
//insert after neighbour
134135
if ($neighbour){
135-
//TODO: choose between insert-after and insert-before
136-
$dragObject.insertAfter($neighbour);
136+
//TODO: this only works for vertical list logic ... what if we want icons like drag and drop (e.g homescreen)?
137+
//choose between insert-after and insert-before:
138+
var isAbove = (referencePosition.top - $neighbour.get(0).getBoundingClientRect().top) < 0;
139+
if (isAbove){
140+
$dragObject.insertBefore($neighbour);
141+
}else{
142+
$dragObject.insertAfter($neighbour);
143+
}
137144
}else{
138145
$dragObject.appendTo($dropzone);
139146
}
@@ -298,6 +305,7 @@ function sepiaFW_build_ui_drag_and_drop(){
298305
//console.log(e.type);
299306

300307
//clean-up some
308+
lastDummyPosition = activeDummy.getBoundingClientRect();
301309
$(activeDummy).remove();
302310
activeDummy = undefined;
303311
lastHoverElement = undefined;
@@ -307,7 +315,7 @@ function sepiaFW_build_ui_drag_and_drop(){
307315
//move (if makes sense)
308316
var doAnimate = true;
309317
var dragOriginContainer = $dragObjectContainerOwner.get(0); //store this before it gets refreshed
310-
var positionChanged = self.moveTo($newNeighbourElement, $dropZone, doAnimate);
318+
var positionChanged = self.moveTo($newNeighbourElement, $dropZone, doAnimate, lastDummyPosition);
311319

312320
//auto-disable drag afterwards?
313321
if (options.autoDisableAfterDrop){
@@ -324,6 +332,7 @@ function sepiaFW_build_ui_drag_and_drop(){
324332
$dragObject.removeClass('dragging');
325333
$newNeighbourElement = undefined;
326334
$dropZone = undefined;
335+
lastDummyPosition = undefined;
327336
});
328337
}
329338

www/scripts/sepiaFW.ui.js

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -765,6 +765,9 @@ function sepiaFW_build_ui(){
765765
var lastDomEventTS = new Date().getTime();
766766
//listener
767767
UI.trackIdleTime = function(){
768+
function resetTimer() {
769+
lastDomEventTS = new Date().getTime();
770+
}
768771
//DOM Events
769772
document.addEventListener("keypress", resetTimer);
770773
document.addEventListener("mousemove", resetTimer);
@@ -775,9 +778,6 @@ function sepiaFW_build_ui(){
775778
document.onload = resetTimer;
776779
document.onscroll = resetTimer; // scrolling with arrow keys
777780
*/
778-
function resetTimer() {
779-
lastDomEventTS = new Date().getTime();
780-
}
781781
}
782782
//state
783783
UI.getIdleTime = function(){
@@ -1143,12 +1143,16 @@ function sepiaFW_build_ui(){
11431143
var xDown = 0; var xUp = 0;
11441144
var yDown = 0; var yUp = 0;
11451145
var timeDown = 0;
1146+
var longPressTime = 625;
1147+
var timeDownTimer;
1148+
var resetTimer;
11461149
$swipeArea.mouseup(function(event){ up(this, event);
11471150
}).mousedown(function(event){ down(this, event);
11481151
//}).on('touchstart', function(event){ console.log('touchstart'); down(this, event);
11491152
//}).on('touchend', function(event){ console.log('touchend'); up(this, event);
11501153
});
11511154
function down(that, ev){
1155+
//console.log('down');
11521156
if (!didDown){
11531157
didDown = true;
11541158
didUp = false;
@@ -1157,24 +1161,32 @@ function sepiaFW_build_ui(){
11571161
$(that).addClass('sepiaFW-fullSize');
11581162
timeDown = new Date().getTime();
11591163
//console.log(ev);
1164+
timeDownTimer = setTimeout(function(){
1165+
up(that, ev); //note: ev will not be up-to-date here
1166+
}, longPressTime);
11601167
}
11611168
}
11621169
function up(that, ev){
1170+
//console.log('up');
1171+
if (timeDownTimer) clearTimeout(timeDownTimer);
11631172
if (!didUp){
11641173
didUp = true;
1165-
xUp = (ev.center)? ev.center.x : ev.clientX;
1166-
yUp = (ev.center)? ev.center.y : ev.clientY;
11671174
$(that).removeClass('sepiaFW-fullSize');
1168-
var moved = (xDown-xUp)*(xDown-xUp) + (yDown-yUp)*(yDown-yUp);
1169-
//console.log(moved);
1170-
if (moved < 100){
1171-
click(ev);
1172-
}
1175+
checkClick(ev);
11731176
resetTimer = setTimeout(function(){
11741177
didDown = false;
11751178
}, 500);
11761179
}
11771180
}
1181+
function checkClick(ev){
1182+
xUp = (ev.center)? ev.center.x : ev.clientX;
1183+
yUp = (ev.center)? ev.center.y : ev.clientY;
1184+
var moved = (xDown-xUp)*(xDown-xUp) + (yDown-yUp)*(yDown-yUp);
1185+
//console.log(moved);
1186+
if (moved < 100){
1187+
click(ev);
1188+
}
1189+
}
11781190
function click(ev){
11791191
if (onClickCallback){
11801192
onClickCallback(ev);
@@ -1191,7 +1203,7 @@ function sepiaFW_build_ui(){
11911203
//supports sepiaFW-events?
11921204
if (UI.elementSupportsCustomTriggers(elementMouseIsOver)){
11931205
var durationDown = new Date().getTime() - timeDown;
1194-
if (timeDown && (durationDown > 625)){
1206+
if (timeDown && (durationDown > longPressTime)){
11951207
$(elementMouseIsOver).trigger('sepiaFW-events', { name: 'longpress'});
11961208
}else{
11971209
$(elementMouseIsOver).trigger('sepiaFW-events', { name: 'shortpress'});

0 commit comments

Comments
 (0)