mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-06-23 15:30:45 -04:00
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:
parent
9e9a863e19
commit
a8bd8f806d
@ -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
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user