summaryrefslogtreecommitdiff
path: root/program
diff options
context:
space:
mode:
authorThomas Bruederli <thomas@roundcube.net>2013-08-14 23:32:34 +0200
committerThomas Bruederli <thomas@roundcube.net>2013-08-14 23:32:34 +0200
commitdc840082668fb1c99ad8f137abd460bcae7ac2da (patch)
tree9646e2127f104027891860e325ce2d77c47e938f /program
parent5793e7f81747714e0ed6cc7acff1e54c91c57136 (diff)
Optimize list events for touch devices
Diffstat (limited to 'program')
-rw-r--r--program/js/list.js24
1 files changed, 16 insertions, 8 deletions
diff --git a/program/js/list.js b/program/js/list.js
index 08e4444e1..c89c799b6 100644
--- a/program/js/list.js
+++ b/program/js/list.js
@@ -125,14 +125,22 @@ init_row: function(row)
if (bw.mobile) {
row.addEventListener('touchstart', function(e) {
if (e.touches.length == 1) {
- if (!self.drag_row(rcube_event.touchevent(e.touches[0]), this.uid))
- e.preventDefault();
+ self.touchmoved = false;
+ self.drag_row(rcube_event.touchevent(e.touches[0]), this.uid)
}
}, false);
row.addEventListener('touchend', function(e) {
- if (e.changedTouches.length == 1)
- if (!self.click_row(rcube_event.touchevent(e.changedTouches[0]), this.uid))
+ if (e.changedTouches.length == 1) {
+ if (!self.touchmoved && !self.click_row(rcube_event.touchevent(e.changedTouches[0]), this.uid))
e.preventDefault();
+ }
+ }, false);
+ row.addEventListener('touchmove', function(e) {
+ if (e.changedTouches.length == 1) {
+ self.touchmoved = true;
+ if (self.drag_active)
+ e.preventDefault();
+ }
}, false);
}
@@ -157,7 +165,7 @@ init_header: function()
$(this.list.tHead).replaceWith($(this.fixed_header).find('thead').clone());
$(this.list.tHead).find('tr td').attr('style', ''); // remove fixed widths
}
- else if (this.list.className.indexOf('fixedheader') >= 0) {
+ else if (!bw.mobile && this.list.className.indexOf('fixedheader') >= 0) {
this.init_fixed_header();
}
@@ -408,7 +416,7 @@ drag_row: function(e, id)
if (rcube_event.get_button(e) == 2)
return true;
- this.in_selection_before = this.in_selection(id) ? id : false;
+ this.in_selection_before = e.istouch || this.in_selection(id) ? id : false;
// selects currently unselected row
if (!this.in_selection_before) {
@@ -416,7 +424,7 @@ drag_row: function(e, id)
this.select_row(id, mod_key, false);
}
- if (this.draggable && this.selection.length) {
+ if (this.draggable && this.selection.length && this.in_selection(id)) {
this.drag_start = true;
this.drag_mouse_start = rcube_event.get_mouse_pos(e);
rcube_event.add_listener({event:'mousemove', object:this, method:'drag_mouse_move'});
@@ -1256,7 +1264,7 @@ drag_mouse_move: function(e)
{
// convert touch event
if (e.type == 'touchmove') {
- if (e.changedTouches.length == 1)
+ if (e.touches.length == 1 && e.changedTouches.length == 1)
e = rcube_event.touchevent(e.changedTouches[0]);
else
return rcube_event.cancel(e);