From d9c1eb14d7812aeb5e6b0b31943b06d98b280ad0 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 13 Aug 2019 19:51:22 +0530 Subject: [PATCH] Implement preference to restore window geometry --- src/calibre/gui2/viewer/ui.py | 28 +++++++++++++++++++++------- src/calibre/gui2/viewer/web_view.py | 8 ++++++++ src/pyj/read_book/prefs/misc.pyj | 8 ++------ 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/calibre/gui2/viewer/ui.py b/src/calibre/gui2/viewer/ui.py index ea0d58b7e2..3ea8d6747a 100644 --- a/src/calibre/gui2/viewer/ui.py +++ b/src/calibre/gui2/viewer/ui.py @@ -25,7 +25,9 @@ from calibre.gui2.viewer.annotations import ( from calibre.gui2.viewer.bookmarks import BookmarkManager from calibre.gui2.viewer.convert_book import prepare_book, update_book from calibre.gui2.viewer.toc import TOC, TOCSearch, TOCView -from calibre.gui2.viewer.web_view import WebView, set_book_path, vprefs +from calibre.gui2.viewer.web_view import ( + WebView, get_session_pref, set_book_path, vprefs +) from calibre.utils.date import utcnow from calibre.utils.ipc.simple_worker import WorkerError from calibre.utils.serialize import json_loads @@ -89,9 +91,7 @@ class EbookViewer(MainWindow): self.web_view.update_current_toc_nodes.connect(self.toc.update_current_toc_nodes) self.web_view.toggle_full_screen.connect(self.toggle_full_screen) self.setCentralWidget(self.web_view) - state = vprefs['main_window_state'] - if state: - self.restoreState(state, self.MAIN_WINDOW_STATE_VERSION) + self.restore_state() # IPC {{{ def handle_commandline_arg(self, arg): @@ -252,10 +252,24 @@ class EbookViewer(MainWindow): update_book(path, before_stat, {'calibre-book-annotations.json': annots}) def save_state(self): - vprefs['main_window_state'] = bytearray(self.saveState(self.MAIN_WINDOW_STATE_VERSION)) + with vprefs: + vprefs['main_window_state'] = bytearray(self.saveState(self.MAIN_WINDOW_STATE_VERSION)) + vprefs['main_window_geometry'] = bytearray(self.saveGeometry()) + + def restore_state(self): + state = vprefs['main_window_state'] + geom = vprefs['main_window_geometry'] + if geom and get_session_pref('remember_window_geometry'): + self.restoreGeometry(geom) + if state: + self.restoreState(state, self.MAIN_WINDOW_STATE_VERSION) def closeEvent(self, ev): - self.save_annotations() - self.save_state() + try: + self.save_annotations() + self.save_state() + except Exception: + import traceback + traceback.print_exc() return MainWindow.closeEvent(self, ev) # }}} diff --git a/src/calibre/gui2/viewer/web_view.py b/src/calibre/gui2/viewer/web_view.py index e002d210ed..63984cf453 100644 --- a/src/calibre/gui2/viewer/web_view.py +++ b/src/calibre/gui2/viewer/web_view.py @@ -39,6 +39,7 @@ except ImportError: vprefs = JSONConfig('viewer-webengine') vprefs.defaults['session_data'] = {} vprefs.defaults['main_window_state'] = None +vprefs.defaults['main_window_geometry'] = None # Override network access to load data from the book {{{ @@ -147,6 +148,12 @@ class UrlSchemeHandler(QWebEngineUrlSchemeHandler): # }}} +def get_session_pref(name, default=None, group='standalone_misc_settings'): + sd = vprefs['session_data'] + g = sd.get(group, {}) + return g.get(name, default) + + def create_profile(): ans = getattr(create_profile, 'ans', None) if ans is None: @@ -340,6 +347,7 @@ class WebView(RestartingWebEngineView): return ans def change_zoom_by(self, steps=1): + # TODO: Add UI for this ss = vprefs['session_data'].get('zoom_step_size') or 20 amt = (ss / 100) * steps self._page.setZoomFactor(self._page.zoomFactor() + amt) diff --git a/src/pyj/read_book/prefs/misc.pyj b/src/pyj/read_book/prefs/misc.pyj index c0fd72a5ed..0912bd8639 100644 --- a/src/pyj/read_book/prefs/misc.pyj +++ b/src/pyj/read_book/prefs/misc.pyj @@ -32,19 +32,15 @@ def create_misc_panel(container): container = container.lastChild sd = get_session_data() settings = sd.get('standalone_misc_settings') - settings def cb(name, text): ans = E.input(type='checkbox', name=name) - if jstype(settings[name]) is 'boolean': - ans.checked = v'!!settings[name]' - else: - ans.checked = DEFAULTS[name] + ans.checked = settings[name] if jstype(settings[name]) is 'boolean' else DEFAULTS[name] return E.div(style='margin-top:1ex', E.label(ans, '\xa0' + text)) container.append(cb('remember_window_geometry', _('Remember last used window size and position'))) container.append(cb('remember_last_read', _('Remember current page when quitting'))) - container.append(cb('save_annotations_in_ebook', _('Keep a copy of annotations/bookmarks inside the e-book file, for easy sharing'))) + container.append(cb('save_annotations_in_ebook', _('Keep a copy of annotations/bookmarks in the e-book file, for easy sharing'))) container.appendChild(E.div( style='margin-top: 1rem', create_button(_('Restore defaults'), action=restore_defaults)