From 4a41f77eb32fa7f9ecd0273b763e2f4b48251d95 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 21 Dec 2010 17:51:46 -0700 Subject: [PATCH] Preliminary code for touchscreen swipe based page flipping --- src/calibre/gui2/viewer/documentview.py | 25 ++++++++++ src/calibre/gui2/viewer/gestures.py | 61 +++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 src/calibre/gui2/viewer/gestures.py diff --git a/src/calibre/gui2/viewer/documentview.py b/src/calibre/gui2/viewer/documentview.py index 683951400c..343d85e63e 100644 --- a/src/calibre/gui2/viewer/documentview.py +++ b/src/calibre/gui2/viewer/documentview.py @@ -18,6 +18,7 @@ from calibre.utils.config import Config, StringConfig from calibre.utils.localization import get_language from calibre.gui2.viewer.config_ui import Ui_Dialog from calibre.gui2.viewer.flip import SlideFlip +from calibre.gui2.viewer.gestures import Gestures from calibre.gui2.shortcuts import Shortcuts, ShortcutConfig from calibre.constants import iswindows from calibre import prints, guess_type @@ -474,6 +475,7 @@ class DocumentView(QWebView): # {{{ def __init__(self, *args): QWebView.__init__(self, *args) self.flipper = SlideFlip(self) + self.gestures = Gestures() self.is_auto_repeat_event = False self.debug_javascript = False self.shortcuts = Shortcuts(SHORTCUTS, 'shortcuts/viewer') @@ -959,6 +961,29 @@ class DocumentView(QWebView): # {{{ self.manager.viewport_resized(self.scroll_fraction) return ret + def event(self, ev): + typ = ev.type() + if typ == ev.TouchBegin: + try: + self.gestures.start_gesture('touch', ev) + except: + import traceback + traceback.print_exc() + elif typ == ev.TouchEnd: + try: + gesture = self.gestures.end_gesture('touch', ev, self.rect()) + except: + import traceback + traceback.print_exc() + if gesture is not None: + ev.accept() + if gesture == 'lineleft': + self.next_page() + elif gesture == 'lineright': + self.previous_page() + return True + return QWebView.event(self, ev) + def mouseReleaseEvent(self, ev): opos = self.document.ypos ret = QWebView.mouseReleaseEvent(self, ev) diff --git a/src/calibre/gui2/viewer/gestures.py b/src/calibre/gui2/viewer/gestures.py new file mode 100644 index 0000000000..86d2f842b9 --- /dev/null +++ b/src/calibre/gui2/viewer/gestures.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python +# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai + +__license__ = 'GPL v3' +__copyright__ = '2010, Kovid Goyal ' +__docformat__ = 'restructuredtext en' + +import time + +class Gestures(object): + + def __init__(self): + self.in_progress = {} + + def get_boundary_point(self, event): + t = time.time() + id_ = None + if hasattr(event, 'touchPoints'): + tps = list(event.touchPoints()) + tp = None + for t in tps: + if t.isPrimary(): + tp = t + break + if tp is None: + tp = tps[0] + gp, p = tp.screenPos(), tp.pos() + id_ = tp.id() + else: + gp, p = event.globalPos(), event.pos() + return (t, gp, p, id_) + + def start_gesture(self, typ, event): + self.in_progress[typ] = self.get_boundary_point(event) + + def is_in_progress(self, typ): + return typ in self.in_progress + + def end_gesture(self, typ, event, widget_rect): + if not self.is_in_progress(typ): + return + start = self.in_progress[typ] + end = self.get_boundary_point(event) + if start[3] != end[3]: + return + timespan = end[0] - start[0] + start_pos, end_pos = start[1], end[1] + xspan = end_pos.x() - start_pos.x() + yspan = end_pos.y() - start_pos.y() + + width = widget_rect.width() + + if timespan < 1.1 and abs(xspan) >= width/5. and \ + abs(yspan) < abs(xspan)/5.: + # Quick horizontal gesture + return 'line'+('left' if xspan < 0 else 'right') + + return None + + +