mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Preliminary code for touchscreen swipe based page flipping
This commit is contained in:
parent
e414c67486
commit
4a41f77eb3
@ -18,6 +18,7 @@ from calibre.utils.config import Config, StringConfig
|
|||||||
from calibre.utils.localization import get_language
|
from calibre.utils.localization import get_language
|
||||||
from calibre.gui2.viewer.config_ui import Ui_Dialog
|
from calibre.gui2.viewer.config_ui import Ui_Dialog
|
||||||
from calibre.gui2.viewer.flip import SlideFlip
|
from calibre.gui2.viewer.flip import SlideFlip
|
||||||
|
from calibre.gui2.viewer.gestures import Gestures
|
||||||
from calibre.gui2.shortcuts import Shortcuts, ShortcutConfig
|
from calibre.gui2.shortcuts import Shortcuts, ShortcutConfig
|
||||||
from calibre.constants import iswindows
|
from calibre.constants import iswindows
|
||||||
from calibre import prints, guess_type
|
from calibre import prints, guess_type
|
||||||
@ -474,6 +475,7 @@ class DocumentView(QWebView): # {{{
|
|||||||
def __init__(self, *args):
|
def __init__(self, *args):
|
||||||
QWebView.__init__(self, *args)
|
QWebView.__init__(self, *args)
|
||||||
self.flipper = SlideFlip(self)
|
self.flipper = SlideFlip(self)
|
||||||
|
self.gestures = Gestures()
|
||||||
self.is_auto_repeat_event = False
|
self.is_auto_repeat_event = False
|
||||||
self.debug_javascript = False
|
self.debug_javascript = False
|
||||||
self.shortcuts = Shortcuts(SHORTCUTS, 'shortcuts/viewer')
|
self.shortcuts = Shortcuts(SHORTCUTS, 'shortcuts/viewer')
|
||||||
@ -959,6 +961,29 @@ class DocumentView(QWebView): # {{{
|
|||||||
self.manager.viewport_resized(self.scroll_fraction)
|
self.manager.viewport_resized(self.scroll_fraction)
|
||||||
return ret
|
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):
|
def mouseReleaseEvent(self, ev):
|
||||||
opos = self.document.ypos
|
opos = self.document.ypos
|
||||||
ret = QWebView.mouseReleaseEvent(self, ev)
|
ret = QWebView.mouseReleaseEvent(self, ev)
|
||||||
|
61
src/calibre/gui2/viewer/gestures.py
Normal file
61
src/calibre/gui2/viewer/gestures.py
Normal file
@ -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 <kovid@kovidgoyal.net>'
|
||||||
|
__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
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user