From b677bb15c97c85983550cedf909984d191d5df15 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 18 Jul 2012 16:15:12 +0530 Subject: [PATCH] E-book viewer: Add a paged mode that splits up the text into pages, like in a paper book instead of presenting it as a single column. To activate click the button with the yellow scroll icon in the top right corner. --- resources/images/scroll.png | Bin 0 -> 22365 bytes src/calibre/gui2/viewer/documentview.py | 6 ++--- src/calibre/gui2/viewer/main.py | 28 ++++++++++++++++++++++++ src/calibre/gui2/viewer/main.ui | 13 +++++++++++ src/calibre/gui2/viewer/position.py | 3 ++- 5 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 resources/images/scroll.png diff --git a/resources/images/scroll.png b/resources/images/scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..9178e18b32bda661792cacddd0fce16cd5a2c265 GIT binary patch literal 22365 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 literal 0 HcmV?d00001 diff --git a/src/calibre/gui2/viewer/documentview.py b/src/calibre/gui2/viewer/documentview.py index 784887a18f..ec4584121e 100644 --- a/src/calibre/gui2/viewer/documentview.py +++ b/src/calibre/gui2/viewer/documentview.py @@ -22,7 +22,6 @@ from calibre.gui2.viewer.javascript import JavaScriptLoader from calibre.gui2.viewer.position import PagePosition from calibre.gui2.viewer.config import config, ConfigDialog from calibre.ebooks.oeb.display.webview import load_html -from calibre.utils.config import tweaks from calibre.constants import isxp # }}} @@ -60,7 +59,7 @@ class Document(QWebPage): # {{{ def __init__(self, shortcuts, parent=None, debug_javascript=False): QWebPage.__init__(self, parent) self.setObjectName("py_bridge") - self.in_paged_mode = tweaks.get('viewer_test_paged_mode', False) + self.in_paged_mode = False # Use this to pass arbitrary JSON encodable objects between python and # javascript. In python get/set the value as: self.bridge_value. In # javascript, get/set the value as: py_bridge.value @@ -647,6 +646,7 @@ class DocumentView(QWebView): # {{{ def load_path(self, path, pos=0.0): self.initial_pos = pos + self.last_loaded_path = path def callback(lu): self.loading_url = lu @@ -654,7 +654,7 @@ class DocumentView(QWebView): # {{{ self.manager.load_started() load_html(path, self, codec=getattr(path, 'encoding', 'utf-8'), mime_type=getattr(path, - 'mime_type', None), pre_load_callback=callback) + 'mime_type', 'text/html'), pre_load_callback=callback) entries = set() for ie in getattr(path, 'index_entries', []): if ie.start_anchor: diff --git a/src/calibre/gui2/viewer/main.py b/src/calibre/gui2/viewer/main.py index 3d76b08212..65be08343d 100644 --- a/src/calibre/gui2/viewer/main.py +++ b/src/calibre/gui2/viewer/main.py @@ -152,6 +152,10 @@ class RecentAction(QAction): class EbookViewer(MainWindow, Ui_EbookViewer): STATE_VERSION = 1 + FLOW_MODE_TT = _('Switch to paged mode - where the text is broken up ' + 'into pages like a paper book') + PAGED_MODE_TT = _('Switch to flow mode - where the text is not broken up ' + 'into pages') def __init__(self, pathtoebook=None, debug_javascript=False, open_at=None): MainWindow.__init__(self, None) @@ -168,6 +172,7 @@ class EbookViewer(MainWindow, Ui_EbookViewer): self.pending_anchor = None self.pending_reference = None self.pending_bookmark = None + self.pending_restore = False self.existing_bookmarks= [] self.selected_text = None self.read_settings() @@ -339,6 +344,22 @@ class EbookViewer(MainWindow, Ui_EbookViewer): self.addAction(action) self.restore_state() + self.action_toggle_paged_mode.toggled[bool].connect(self.toggle_paged_mode) + + def toggle_paged_mode(self, checked, at_start=False): + in_paged_mode = not self.action_toggle_paged_mode.isChecked() + self.view.document.in_paged_mode = in_paged_mode + self.action_toggle_paged_mode.setToolTip(self.FLOW_MODE_TT if + self.action_toggle_paged_mode.isChecked() else + self.PAGED_MODE_TT) + if at_start: return + self.reload() + + def reload(self): + if hasattr(self, 'current_index') and self.current_index > -1: + self.view.document.page_position.save(overwrite=False) + self.pending_restore = True + self.load_path(self.view.last_loaded_path) def set_toc_visible(self, yes): self.toc.setVisible(yes) @@ -394,6 +415,7 @@ class EbookViewer(MainWindow, Ui_EbookViewer): vprefs.set('viewer_splitter_state', bytearray(self.splitter.saveState())) vprefs['multiplier'] = self.view.multiplier + vprefs['in_paged_mode1'] = not self.action_toggle_paged_mode.isChecked() def restore_state(self): state = vprefs.get('viewer_toolbar_state', None) @@ -410,6 +432,10 @@ class EbookViewer(MainWindow, Ui_EbookViewer): # specific location, ensure they are visible. self.tool_bar.setVisible(True) self.tool_bar2.setVisible(True) + self.action_toggle_paged_mode.setChecked(not vprefs.get('in_paged_mode1', + False)) + self.toggle_paged_mode(self.action_toggle_paged_mode.isChecked(), + at_start=True) def lookup(self, word): self.dictionary_view.setHtml('

'+ \ @@ -716,6 +742,8 @@ class EbookViewer(MainWindow, Ui_EbookViewer): if self.pending_bookmark is not None: self.goto_bookmark(self.pending_bookmark) self.pending_bookmark = None + if self.pending_restore: + self.view.document.page_position.restore() return self.current_index def goto_next_section(self): diff --git a/src/calibre/gui2/viewer/main.ui b/src/calibre/gui2/viewer/main.ui index 5aae02877e..2d442fa223 100644 --- a/src/calibre/gui2/viewer/main.ui +++ b/src/calibre/gui2/viewer/main.ui @@ -143,6 +143,7 @@ + @@ -309,6 +310,18 @@ Shift+F3 + + + true + + + + :/images/scroll.png:/images/scroll.png + + + Toggle Paged mode + + diff --git a/src/calibre/gui2/viewer/position.py b/src/calibre/gui2/viewer/position.py index 3a617e29c8..ddff91794e 100644 --- a/src/calibre/gui2/viewer/position.py +++ b/src/calibre/gui2/viewer/position.py @@ -50,7 +50,8 @@ class PagePosition(object): def __exit__(self, *args): self.restore() - def save(self): + def save(self, overwrite=True): + if not overwrite and self._cpos is not None: return self._cpos = self.current_pos def restore(self):