mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Use the same code path for jumping to highlights as for editing/removing
This commit is contained in:
parent
501ee2252c
commit
f259e86cb3
@ -14,26 +14,9 @@ from PyQt5.Qt import (
|
|||||||
from calibre.constants import plugins
|
from calibre.constants import plugins
|
||||||
from calibre.gui2 import error_dialog
|
from calibre.gui2 import error_dialog
|
||||||
from calibre.gui2.viewer.search import SearchInput
|
from calibre.gui2.viewer.search import SearchInput
|
||||||
from calibre.gui2.viewer.web_view import get_manifest
|
|
||||||
from polyglot.builtins import range
|
from polyglot.builtins import range
|
||||||
|
|
||||||
|
|
||||||
def spine_index_for_highlight(highlight):
|
|
||||||
ans = highlight['spine_index']
|
|
||||||
manifest = get_manifest()
|
|
||||||
if manifest is not None:
|
|
||||||
spine = manifest['spine']
|
|
||||||
name = highlight.get('spine_name')
|
|
||||||
if name:
|
|
||||||
try:
|
|
||||||
idx = spine.index(name)
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
ans = idx
|
|
||||||
return ans
|
|
||||||
|
|
||||||
|
|
||||||
class Highlights(QListWidget):
|
class Highlights(QListWidget):
|
||||||
|
|
||||||
jump_to_highlight = pyqtSignal(object)
|
jump_to_highlight = pyqtSignal(object)
|
||||||
@ -100,7 +83,7 @@ class HighlightsPanel(QWidget):
|
|||||||
|
|
||||||
jump_to_cfi = pyqtSignal(object)
|
jump_to_cfi = pyqtSignal(object)
|
||||||
add_highlight = pyqtSignal()
|
add_highlight = pyqtSignal()
|
||||||
request_highlight_action = pyqtSignal(object, object, object)
|
request_highlight_action = pyqtSignal(object, object)
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
QWidget.__init__(self, parent)
|
QWidget.__init__(self, parent)
|
||||||
@ -145,10 +128,7 @@ class HighlightsPanel(QWidget):
|
|||||||
self.highlights.setFocus(Qt.OtherFocusReason)
|
self.highlights.setFocus(Qt.OtherFocusReason)
|
||||||
|
|
||||||
def jump_to_highlight(self, highlight):
|
def jump_to_highlight(self, highlight):
|
||||||
cfi = highlight['start_cfi']
|
self.request_highlight_action.emit(highlight['uuid'], 'goto')
|
||||||
idx = spine_index_for_highlight(highlight)
|
|
||||||
cfi = 'epubcfi(/{}{})'.format(2*(idx + 1), cfi)
|
|
||||||
self.jump_to_cfi.emit(cfi)
|
|
||||||
|
|
||||||
def no_selected_highlight(self):
|
def no_selected_highlight(self):
|
||||||
error_dialog(self, _('No selected highlight'), _(
|
error_dialog(self, _('No selected highlight'), _(
|
||||||
@ -158,10 +138,10 @@ class HighlightsPanel(QWidget):
|
|||||||
h = self.highlights.current_highlight
|
h = self.highlights.current_highlight
|
||||||
if h is None:
|
if h is None:
|
||||||
return self.no_selected_highlight()
|
return self.no_selected_highlight()
|
||||||
self.request_highlight_action.emit(h['uuid'], spine_index_for_highlight(h), 'edit')
|
self.request_highlight_action.emit(h['uuid'], 'edit')
|
||||||
|
|
||||||
def remove_highlight(self):
|
def remove_highlight(self):
|
||||||
h = self.highlights.current_highlight
|
h = self.highlights.current_highlight
|
||||||
if h is None:
|
if h is None:
|
||||||
return self.no_selected_highlight()
|
return self.no_selected_highlight()
|
||||||
self.request_highlight_action.emit(h['uuid'], spine_index_for_highlight(h), 'delete')
|
self.request_highlight_action.emit(h['uuid'], 'delete')
|
||||||
|
@ -193,7 +193,6 @@ class EbookViewer(MainWindow):
|
|||||||
self.restore_state()
|
self.restore_state()
|
||||||
self.actions_toolbar.update_visibility()
|
self.actions_toolbar.update_visibility()
|
||||||
self.dock_visibility_changed()
|
self.dock_visibility_changed()
|
||||||
self.highlights_widget.jump_to_cfi.connect(self.web_view.goto_cfi)
|
|
||||||
self.highlights_widget.request_highlight_action.connect(self.web_view.highlight_action)
|
self.highlights_widget.request_highlight_action.connect(self.web_view.highlight_action)
|
||||||
if continue_reading:
|
if continue_reading:
|
||||||
self.continue_reading()
|
self.continue_reading()
|
||||||
|
@ -695,8 +695,8 @@ class WebView(RestartingWebEngineView):
|
|||||||
def prepare_for_close(self):
|
def prepare_for_close(self):
|
||||||
self.execute_when_ready('prepare_for_close')
|
self.execute_when_ready('prepare_for_close')
|
||||||
|
|
||||||
def highlight_action(self, uuid, spine_index, which):
|
def highlight_action(self, uuid, which):
|
||||||
self.execute_when_ready('highlight_action', uuid, spine_index, which)
|
self.execute_when_ready('highlight_action', uuid, which)
|
||||||
|
|
||||||
def contextMenuEvent(self, ev):
|
def contextMenuEvent(self, ev):
|
||||||
ev.accept()
|
ev.accept()
|
||||||
|
@ -56,6 +56,24 @@ class AnnotationsManager:
|
|||||||
def data_for_highlight(self, uuid):
|
def data_for_highlight(self, uuid):
|
||||||
return self.highlights[uuid]
|
return self.highlights[uuid]
|
||||||
|
|
||||||
|
def spine_index_for_highlight(self, uuid, spine):
|
||||||
|
h = self.highlights[uuid]
|
||||||
|
if not h:
|
||||||
|
return -1
|
||||||
|
ans = h.spine_index
|
||||||
|
name = h.spine_name
|
||||||
|
if name:
|
||||||
|
idx = spine.indexOf(name)
|
||||||
|
if idx > -1:
|
||||||
|
ans = idx
|
||||||
|
return ans
|
||||||
|
|
||||||
|
def cfi_for_highlight(self, uuid, spine_index):
|
||||||
|
h = self.highlights[uuid]
|
||||||
|
if h:
|
||||||
|
x = 2 * (spine_index + 1)
|
||||||
|
return f'epubcfi(/{x}{h.start_cfi})'
|
||||||
|
|
||||||
def add_highlight(self, msg, style, notes):
|
def add_highlight(self, msg, style, notes):
|
||||||
now = Date().toISOString()
|
now = Date().toISOString()
|
||||||
for uuid in msg.removed_highlights:
|
for uuid in msg.removed_highlights:
|
||||||
|
@ -1190,12 +1190,19 @@ class View:
|
|||||||
else:
|
else:
|
||||||
self.show_name(sr.file_name, initial_position={'type':'search_result', 'search_result':sr, 'replace_history':True})
|
self.show_name(sr.file_name, initial_position={'type':'search_result', 'search_result':sr, 'replace_history':True})
|
||||||
|
|
||||||
def highlight_action(self, uuid, spine_index, which):
|
def highlight_action(self, uuid, which):
|
||||||
|
spine = self.book.manifest.spine
|
||||||
|
spine_index = self.annotations_manager.spine_index_for_highlight(uuid, spine)
|
||||||
|
if spine_index < 0 or spine_index >= spine.length:
|
||||||
|
return
|
||||||
if which is 'edit':
|
if which is 'edit':
|
||||||
if self.currently_showing.spine_index is spine_index:
|
if self.currently_showing.spine_index is spine_index:
|
||||||
self.create_annotation.edit_highlight(uuid)
|
self.create_annotation.edit_highlight(uuid)
|
||||||
else:
|
else:
|
||||||
name = self.book.manifest.spine[spine_index]
|
self.show_name(spine[spine_index], initial_position={'type':'edit_annotation', 'uuid': uuid, 'replace_history':True})
|
||||||
self.show_name(name, initial_position={'type':'edit_annotation', 'uuid': uuid, 'replace_history':True})
|
|
||||||
elif which is 'delete':
|
elif which is 'delete':
|
||||||
self.create_annotation.remove_highlight(uuid)
|
self.create_annotation.remove_highlight(uuid)
|
||||||
|
elif which is 'goto':
|
||||||
|
cfi = self.annotations_manager.cfi_for_highlight(uuid, spine_index)
|
||||||
|
if cfi:
|
||||||
|
self.goto_cfi(cfi)
|
||||||
|
@ -241,9 +241,9 @@ def set_system_palette(system_colors):
|
|||||||
|
|
||||||
|
|
||||||
@from_python
|
@from_python
|
||||||
def highlight_action(uuid, spine_index, which):
|
def highlight_action(uuid, which):
|
||||||
if view:
|
if view:
|
||||||
view.highlight_action(uuid, spine_index, which)
|
view.highlight_action(uuid, which)
|
||||||
|
|
||||||
|
|
||||||
@from_python
|
@from_python
|
||||||
|
Loading…
x
Reference in New Issue
Block a user