diff options
author | Thomas Bruederli <thomas@roundcube.net> | 2013-08-14 23:32:34 +0200 |
---|---|---|
committer | Thomas Bruederli <thomas@roundcube.net> | 2013-08-14 23:36:04 +0200 |
commit | 96c4b9098bec7191c708d4e4f96b80b2768a7ef0 (patch) | |
tree | 94caa74f595006ee6cdae1d5888a2c622f21b890 /program/js/list.js | |
parent | deacf16beed87fde254a419ad10bc5d4528aaa31 (diff) |
Optimize list events for touch devices
Diffstat (limited to 'program/js/list.js')
-rw-r--r-- | program/js/list.js | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/program/js/list.js b/program/js/list.js index 668d01917..a55f6db0c 100644 --- a/program/js/list.js +++ b/program/js/list.js @@ -113,14 +113,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); } @@ -299,7 +307,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) { @@ -307,7 +315,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'}); @@ -1115,7 +1123,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); |