E-book viewer: Allow setting the number of pages per screen separately for portrait and landscape modes. Fixes #1483313 [[Enhancement] Viewer: auto adjust number of columns when display orientation changes](https://bugs.launchpad.net/calibre/+bug/1483313)

This commit is contained in:
Kovid Goyal 2015-08-11 16:03:57 +05:30
parent 0a11860fd6
commit 3f11fae224
3 changed files with 96 additions and 30 deletions

View File

@ -78,6 +78,9 @@ def config(defaults=None):
c.add_opt('show_fullscreen_help', default=True, action='store_false',
help=_('Show full screen usage help'))
c.add_opt('cols_per_screen', default=1)
c.add_opt('cols_per_screen_portrait', default=1)
c.add_opt('cols_per_screen_landscape', default=1)
c.add_opt('cols_per_screen_migrated', default=False, action='store_true')
c.add_opt('use_book_margins', default=False, action='store_true')
c.add_opt('top_margin', default=20)
c.add_opt('side_margin', default=40)
@ -98,6 +101,15 @@ def config(defaults=None):
fonts('standard_font', default='serif', help=_('The standard font type'))
fonts('minimum_font_size', default=8, help=_('The minimum font size in px'))
oparse = c.parse
def parse():
ans = oparse()
if not ans.cols_per_screen_migrated:
ans.cols_per_screen_portrait = ans.cols_per_screen_landscape = ans.cols_per_screen
return ans
c.parse = parse
return c
def load_themes():
@ -322,7 +334,8 @@ class ConfigDialog(QDialog, Ui_Dialog):
self.opt_start_in_fullscreen.setChecked(opts.start_in_fullscreen)
self.opt_show_fullscreen_help.setChecked(opts.show_fullscreen_help)
self.opt_fullscreen_pos.setChecked(opts.fullscreen_pos)
self.opt_cols_per_screen.setValue(opts.cols_per_screen)
self.opt_cols_per_screen_portrait.setValue(opts.cols_per_screen_portrait)
self.opt_cols_per_screen_landscape.setValue(opts.cols_per_screen_landscape)
self.opt_override_book_margins.setChecked(not opts.use_book_margins)
for x in ('top', 'bottom', 'side'):
getattr(self, 'opt_%s_margin'%x).setValue(getattr(opts,
@ -405,7 +418,9 @@ class ConfigDialog(QDialog, Ui_Dialog):
c.set('fullscreen_pos', self.opt_fullscreen_pos.isChecked())
c.set('fullscreen_scrollbar', self.opt_fullscreen_scrollbar.isChecked())
c.set('show_fullscreen_help', self.opt_show_fullscreen_help.isChecked())
c.set('cols_per_screen', int(self.opt_cols_per_screen.value()))
c.set('cols_per_screen_migrated', True)
c.set('cols_per_screen_portrait', int(self.opt_cols_per_screen_portrait.value()))
c.set('cols_per_screen_landscape', int(self.opt_cols_per_screen_landscape.value()))
c.set('start_in_fullscreen', self.opt_start_in_fullscreen.isChecked())
c.set('use_book_margins', not
self.opt_override_book_margins.isChecked())

View File

@ -261,20 +261,27 @@ QToolBox::tab:hover {
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_13">
<property name="text">
<string>The number of &amp;pages of text to show on screen </string>
</property>
<property name="buddy">
<cstring>opt_cols_per_screen</cstring>
<item row="3" column="0" colspan="2">
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="opt_cols_per_screen">
<property name="suffix">
<string> page(s)</string>
<item row="5" column="0">
<widget class="QLabel" name="label_27">
<property name="text">
<string>In &amp;Portrait orientation:</string>
</property>
<property name="buddy">
<cstring>opt_cols_per_screen_portrait</cstring>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QSpinBox" name="opt_cols_per_screen_portrait">
<property name="toolTip">
<string>Controls the number of pages on the screen when the viewer window's width is less than its height</string>
</property>
<property name="minimum">
<number>1</number>
@ -284,7 +291,7 @@ QToolBox::tab:hover {
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<item row="8" column="0" colspan="2">
<widget class="QCheckBox" name="opt_override_book_margins">
<property name="text">
<string>&amp;Override the page margin settings specified in the book</string>
@ -294,7 +301,7 @@ QToolBox::tab:hover {
</property>
</widget>
</item>
<item row="3" column="0">
<item row="9" column="0">
<widget class="QLabel" name="label_18">
<property name="text">
<string>&amp;Top margin</string>
@ -304,7 +311,7 @@ QToolBox::tab:hover {
</property>
</widget>
</item>
<item row="3" column="1">
<item row="9" column="1">
<widget class="QSpinBox" name="opt_top_margin">
<property name="suffix">
<string> px</string>
@ -317,7 +324,7 @@ QToolBox::tab:hover {
</property>
</widget>
</item>
<item row="4" column="0">
<item row="10" column="0">
<widget class="QLabel" name="label_19">
<property name="text">
<string>&amp;Side margin</string>
@ -327,7 +334,7 @@ QToolBox::tab:hover {
</property>
</widget>
</item>
<item row="4" column="1">
<item row="10" column="1">
<widget class="QSpinBox" name="opt_side_margin">
<property name="suffix">
<string> px</string>
@ -340,7 +347,7 @@ QToolBox::tab:hover {
</property>
</widget>
</item>
<item row="5" column="0">
<item row="11" column="0">
<widget class="QLabel" name="label_17">
<property name="text">
<string>&amp;Bottom margin</string>
@ -350,7 +357,7 @@ QToolBox::tab:hover {
</property>
</widget>
</item>
<item row="5" column="1">
<item row="11" column="1">
<widget class="QSpinBox" name="opt_bottom_margin">
<property name="suffix">
<string> px</string>
@ -363,6 +370,43 @@ QToolBox::tab:hover {
</property>
</widget>
</item>
<item row="7" column="0" colspan="2">
<widget class="Line" name="line_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="4" column="0" colspan="2">
<widget class="QLabel" name="label_13">
<property name="text">
<string>The number of pages of text to show on screen </string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="label_28">
<property name="text">
<string>In &amp;Landscape orientation: </string>
</property>
<property name="buddy">
<cstring>opt_cols_per_screen_landscape</cstring>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QSpinBox" name="opt_cols_per_screen_landscape">
<property name="toolTip">
<string>Controls the number of pages on the screen when the viewer window's height is less than its width</string>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>5</number>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="page_2">
@ -370,8 +414,8 @@ QToolBox::tab:hover {
<rect>
<x>0</x>
<y>0</y>
<width>799</width>
<height>378</height>
<width>381</width>
<height>193</height>
</rect>
</property>
<attribute name="label">
@ -472,8 +516,8 @@ QToolBox::tab:hover {
<rect>
<x>0</x>
<y>0</y>
<width>799</width>
<height>378</height>
<width>340</width>
<height>70</height>
</rect>
</property>
<attribute name="label">
@ -551,8 +595,8 @@ QToolBox::tab:hover {
<rect>
<x>0</x>
<y>0</y>
<width>799</width>
<height>378</height>
<width>384</width>
<height>140</height>
</rect>
</property>
<attribute name="label">
@ -629,8 +673,8 @@ QToolBox::tab:hover {
<rect>
<x>0</x>
<y>0</y>
<width>799</width>
<height>378</height>
<width>479</width>
<height>226</height>
</rect>
</property>
<attribute name="label">

View File

@ -183,7 +183,8 @@ class Document(QWebPage): # {{{
self.start_in_fullscreen = opts.start_in_fullscreen
self.show_fullscreen_help = opts.show_fullscreen_help
self.use_book_margins = opts.use_book_margins
self.cols_per_screen = opts.cols_per_screen
self.cols_per_screen_portrait = opts.cols_per_screen_portrait
self.cols_per_screen_landscape = opts.cols_per_screen_landscape
self.side_margin = opts.side_margin
self.top_margin, self.bottom_margin = opts.top_margin, opts.bottom_margin
self.show_controls = opts.show_controls
@ -291,12 +292,14 @@ class Document(QWebPage): # {{{
def switch_to_paged_mode(self, onresize=False, last_loaded_path=None):
if onresize and not self.loaded_javascript:
return
cols_per_screen = self.cols_per_screen_portrait if self.is_portrait else self.cols_per_screen_landscape
cols_per_screen = max(1, min(5, cols_per_screen))
self.javascript('''
window.paged_display.use_document_margins = %s;
window.paged_display.set_geometry(%d, %d, %d, %d);
'''%(
('true' if self.use_book_margins else 'false'),
self.cols_per_screen, self.top_margin, self.side_margin,
cols_per_screen, self.top_margin, self.side_margin,
self.bottom_margin
))
force_fullscreen_layout = bool(getattr(last_loaded_path,
@ -448,6 +451,10 @@ class Document(QWebPage): # {{{
def window_width(self):
return self.javascript('window.innerWidth', 'int')
@property
def is_portrait(self):
return self.window_width < self.window_height
@property
def xpos(self):
return self.mainFrame().scrollPosition().x()