diff --git a/src/calibre/gui2/viewer/gestures.py b/src/calibre/gui2/viewer/gestures.py
index 751f4383ed..55fa249960 100644
--- a/src/calibre/gui2/viewer/gestures.py
+++ b/src/calibre/gui2/viewer/gestures.py
@@ -62,7 +62,8 @@ class Help(QDialog): # {{{
Swipe
Swipe to the left to go to the next page and to the right to go to the previous page.
- This mimics turning pages in a paper book.
+ This mimics turning pages in a paper book. When the viewer is not in paged mode, swiping
+ scrolls the text line by line instead of page by page.
Pinch
Pinch in or out to decrease or increase the font size
@@ -115,6 +116,12 @@ class TouchPoint(object):
axis = (Left, Right) if xabs > yabs else (Up, Down)
return axis[0 if d < 0 else 1]
+ @property
+ def swipe_live(self):
+ x_movement = self.current_screen_position.x() - self.previous_screen_position.x()
+ y_movement = self.current_screen_position.y() - self.previous_screen_position.y()
+ return (x_movement, y_movement)
+
def get_pinch(p1, p2):
starts = [p1.start_screen_position, p2.start_screen_position]
ends = [p1.current_screen_position, p2.current_screen_position]
@@ -132,6 +139,7 @@ class State(QObject):
tapped = pyqtSignal(object)
swiped = pyqtSignal(object)
+ swiping = pyqtSignal(object, object)
pinched = pyqtSignal(object)
tap_hold_started = pyqtSignal(object)
tap_hold_updated = pyqtSignal(object)
@@ -175,6 +183,9 @@ class State(QObject):
self.clear()
else:
self.check_for_holds()
+ if {Swipe, SwipeAndHold} & self.possible_gestures:
+ tp = next(self.touch_points.itervalues())
+ self.swiping.emit(*tp.swipe_live)
def check_for_holds(self):
if not {SwipeAndHold, TapAndHold} & self.possible_gestures:
@@ -247,6 +258,7 @@ class GestureHandler(QObject):
self.last_swipe_hold_update = None
self.state.swiped.connect(self.handle_swipe)
self.state.tapped.connect(self.handle_tap)
+ self.state.swiping.connect(self.handle_swiping)
self.state.tap_hold_started.connect(partial(self.handle_tap_hold, 'start'))
self.state.tap_hold_updated.connect(partial(self.handle_tap_hold, 'update'))
self.state.tap_hold_finished.connect(partial(self.handle_tap_hold, 'end'))
@@ -314,9 +326,29 @@ class GestureHandler(QObject):
if self.close_open_menu():
return
view = self.parent()
+ if not view.document.in_paged_mode:
+ return
func = {Left:'next_page', Right: 'previous_page', Up:'goto_previous_section', Down:'goto_next_section'}[direction]
getattr(view, func)()
+ def handle_swiping(self, x, y):
+ if max(abs(x), abs(y)) < 1:
+ return
+ view = self.parent()
+ if view.document.in_paged_mode:
+ return
+ ydirection = Up if y < 0 else Down
+ if view.manager is not None and abs(y) > 0:
+ if ydirection is Up and view.document.at_bottom:
+ view.manager.next_document()
+ return
+ elif ydirection is Down and view.document.at_top:
+ view.manager.previous_document()
+ return
+ view.scroll_by(x=-x, y=-y)
+ if view.manager is not None:
+ view.manager.scrolled(view.scroll_fraction)
+
def current_position(self, tp):
return self.parent().mapFromGlobal(tp.current_screen_position.toPoint())
@@ -346,6 +378,8 @@ class GestureHandler(QObject):
def handle_swipe_hold(self, action, direction):
view = self.parent()
+ if not view.document.in_paged_mode:
+ return
if action == 'start':
self.last_swipe_hold_update = time.time()
try: