Viewer: Fix search history not persisting between viewer restarts. Fixes #1847976 [feature request: viewer 4 search history as in viewer 3](https://bugs.launchpad.net/calibre/+bug/1847976)

This commit is contained in:
Kovid Goyal 2019-10-16 06:57:32 +05:30
parent 9e9a863e19
commit a8bd8f806d
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 39 additions and 5 deletions

View File

@ -43,6 +43,7 @@ except ImportError:
vprefs = JSONConfig('viewer-webengine') vprefs = JSONConfig('viewer-webengine')
viewer_config_dir = os.path.join(config_dir, 'viewer') viewer_config_dir = os.path.join(config_dir, 'viewer')
vprefs.defaults['session_data'] = {} vprefs.defaults['session_data'] = {}
vprefs.defaults['local_storage'] = {}
vprefs.defaults['main_window_state'] = None vprefs.defaults['main_window_state'] = None
vprefs.defaults['main_window_geometry'] = None vprefs.defaults['main_window_geometry'] = None
vprefs.defaults['old_prefs_migrated'] = False vprefs.defaults['old_prefs_migrated'] = False
@ -223,6 +224,7 @@ def create_profile():
class ViewerBridge(Bridge): class ViewerBridge(Bridge):
set_session_data = from_js(object, object) set_session_data = from_js(object, object)
set_local_storage = from_js(object, object)
reload_book = from_js() reload_book = from_js()
toggle_toc = from_js() toggle_toc = from_js()
toggle_bookmarks = from_js() toggle_bookmarks = from_js()
@ -399,6 +401,7 @@ class WebView(RestartingWebEngineView):
self._page = WebPage(self) self._page = WebPage(self)
self.bridge.bridge_ready.connect(self.on_bridge_ready) self.bridge.bridge_ready.connect(self.on_bridge_ready)
self.bridge.set_session_data.connect(self.set_session_data) self.bridge.set_session_data.connect(self.set_session_data)
self.bridge.set_local_storage.connect(self.set_local_storage)
self.bridge.reload_book.connect(self.reload_book) self.bridge.reload_book.connect(self.reload_book)
self.bridge.toggle_toc.connect(self.toggle_toc) self.bridge.toggle_toc.connect(self.toggle_toc)
self.bridge.toggle_bookmarks.connect(self.toggle_bookmarks) self.bridge.toggle_bookmarks.connect(self.toggle_bookmarks)
@ -482,7 +485,7 @@ class WebView(RestartingWebEngineView):
f = QApplication.instance().font() f = QApplication.instance().font()
fi = QFontInfo(f) fi = QFontInfo(f)
self.bridge.create_view( self.bridge.create_view(
vprefs['session_data'], QFontDatabase().families(), field_metadata.all_metadata(), vprefs['session_data'], vprefs['local_storage'], QFontDatabase().families(), field_metadata.all_metadata(),
f.family(), '{}px'.format(fi.pixelSize()), self.show_home_page_on_ready) f.family(), '{}px'.format(fi.pixelSize()), self.show_home_page_on_ready)
for func, args in iteritems(self.pending_bridge_ready_actions): for func, args in iteritems(self.pending_bridge_ready_actions):
getattr(self.bridge, func)(*args) getattr(self.bridge, func)(*args)
@ -517,6 +520,14 @@ class WebView(RestartingWebEngineView):
if key in ('standalone_font_settings', 'base_font_size'): if key in ('standalone_font_settings', 'base_font_size'):
apply_font_settings(self._page) apply_font_settings(self._page)
def set_local_storage(self, key, val):
if key == '*' and val is None:
vprefs['local_storage'] = {}
elif key != '*':
sd = vprefs['local_storage']
sd[key] = val
vprefs['local_storage'] = sd
def do_callback(self, func_name, callback): def do_callback(self, func_name, callback):
cid = next(self.callback_id_counter) cid = next(self.callback_id_counter)
self.callback_map[cid] = callback self.callback_map[cid] = callback

View File

@ -20,7 +20,7 @@ from read_book.globals import runtime, ui_operations
from read_book.iframe import main as iframe_main from read_book.iframe import main as iframe_main
from read_book.shortcuts import add_standalone_viewer_shortcuts from read_book.shortcuts import add_standalone_viewer_shortcuts
from read_book.view import View from read_book.view import View
from session import session_defaults from session import session_defaults, local_storage
from utils import encode_query_with_path, parse_url_params from utils import encode_query_with_path, parse_url_params
from viewer.constants import FAKE_HOST, FAKE_PROTOCOL, READER_BACKGROUND_URL from viewer.constants import FAKE_HOST, FAKE_PROTOCOL, READER_BACKGROUND_URL
@ -183,20 +183,43 @@ class SessionData:
to_python.set_session_data('*', None) to_python.set_session_data('*', None)
def create_session_data(prefs): class LocalStorage:
def __init__(self, data):
self.data = data
def get(self, key, defval):
ans = self.data[key]
if ans is undefined or ans is None:
if defval is undefined:
defval = None
return defval
return ans
def set(self, key, val):
self.data[key] = val
to_python.set_local_storage(key, val)
def clear(self):
self.data = {}
to_python.set_local_storage('*', None)
def create_session_data(prefs, local_storage_data):
sd = SessionData(prefs) sd = SessionData(prefs)
set_session_data(sd) set_session_data(sd)
local_storage.storage = LocalStorage(local_storage_data)
@from_python @from_python
def create_view(prefs, all_font_families, field_metadata, ui_font_family, ui_font_sz, show_home_page_on_ready): def create_view(prefs, local_storage, all_font_families, field_metadata, ui_font_family, ui_font_sz, show_home_page_on_ready):
nonlocal view nonlocal view
runtime.all_font_families = all_font_families runtime.all_font_families = all_font_families
library_data.field_metadata = field_metadata library_data.field_metadata = field_metadata
document.documentElement.style.fontFamily = f'"{ui_font_family}", sans-serif' document.documentElement.style.fontFamily = f'"{ui_font_family}", sans-serif'
document.documentElement.style.fontSize = ui_font_sz document.documentElement.style.fontSize = ui_font_sz
if view is None: if view is None:
create_session_data(prefs) create_session_data(prefs, local_storage)
view = View(document.getElementById('view')) view = View(document.getElementById('view'))
if show_home_page_on_ready: if show_home_page_on_ready:
view.overlay.open_book(False) view.overlay.open_book(False)