mirror of
git://github.com/kovidgoyal/calibre.git
synced 2025-12-23 00:26:13 +01:00
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.
This commit is contained in:
parent
ca9f58610d
commit
b677bb15c9
5 changed files with 46 additions and 4 deletions
BIN
resources/images/scroll.png
Normal file
BIN
resources/images/scroll.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 22 KiB |
|
|
@ -22,7 +22,6 @@
|
|||
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 @@ def do_config(self, parent=None):
|
|||
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 @@ def path(self):
|
|||
|
||||
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 @@ def callback(lu):
|
|||
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:
|
||||
|
|
|
|||
|
|
@ -152,6 +152,10 @@ def __init__(self, path, parent):
|
|||
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 @@ def __init__(self, pathtoebook=None, debug_javascript=False, open_at=None):
|
|||
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 @@ def __init__(self, pathtoebook=None, debug_javascript=False, open_at=None):
|
|||
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 @@ def save_state(self):
|
|||
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 @@ def restore_state(self):
|
|||
# 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('<html><body><p>'+ \
|
||||
|
|
@ -716,6 +742,8 @@ def load_finished(self, ok):
|
|||
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):
|
||||
|
|
|
|||
|
|
@ -143,6 +143,7 @@
|
|||
</attribute>
|
||||
<addaction name="action_find_next"/>
|
||||
<addaction name="action_find_previous"/>
|
||||
<addaction name="action_toggle_paged_mode"/>
|
||||
</widget>
|
||||
<action name="action_back">
|
||||
<property name="icon">
|
||||
|
|
@ -309,6 +310,18 @@
|
|||
<string>Shift+F3</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_toggle_paged_mode">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../../../resources/images.qrc">
|
||||
<normaloff>:/images/scroll.png</normaloff>:/images/scroll.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Toggle Paged mode</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
|
|
|
|||
|
|
@ -50,7 +50,8 @@ def __enter__(self):
|
|||
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):
|
||||
|
|
|
|||
Loading…
Reference in a new issue