mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Move AnnotationsManager into the annotations module
This commit is contained in:
parent
2668212179
commit
948acd6a55
@ -3,6 +3,7 @@
|
||||
from __python__ import bound_methods, hash_literals
|
||||
|
||||
from read_book.cfi import create_cfi_cmp, cfi_sort_key
|
||||
from read_book.globals import ui_operations
|
||||
|
||||
|
||||
no_cfi = '/99999999'
|
||||
@ -93,3 +94,118 @@ def merge_annotation_maps(a, b):
|
||||
updated = True
|
||||
|
||||
return updated, ans
|
||||
|
||||
|
||||
|
||||
class AnnotationsManager: # {{{
|
||||
|
||||
def __init__(self, view):
|
||||
self.view = view
|
||||
self.set_highlights()
|
||||
|
||||
def set_highlights(self, highlights):
|
||||
highlights = highlights or v'[]'
|
||||
self.highlights = {h.uuid: h for h in highlights}
|
||||
|
||||
def merge_highlights(self, highlights):
|
||||
highlights = highlights or v'[]'
|
||||
updated = False
|
||||
if highlights.length:
|
||||
base = {'highlight': Object.values(self.highlights)}
|
||||
newvals = {'highlight': highlights}
|
||||
updated, ans = merge_annotation_maps(base, newvals)
|
||||
if updated:
|
||||
self.set_highlights(ans.highlight)
|
||||
return updated
|
||||
|
||||
def remove_highlight(self, uuid):
|
||||
h = self.highlights[uuid]
|
||||
if h:
|
||||
h.timestamp = Date().toISOString()
|
||||
h.removed = True
|
||||
v'delete h.style'
|
||||
v'delete h.highlighted_text'
|
||||
v'delete h.start_cfi'
|
||||
v'delete h.end_cfi'
|
||||
v'delete h.notes'
|
||||
v'delete h.spine_name'
|
||||
v'delete h.spine_index'
|
||||
return True
|
||||
|
||||
def delete_highlight(self, uuid):
|
||||
if self.remove_highlight(uuid):
|
||||
if ui_operations.highlights_changed:
|
||||
ui_operations.highlights_changed(Object.values(self.highlights))
|
||||
|
||||
def notes_for_highlight(self, uuid):
|
||||
h = self.highlights[uuid] if uuid else None
|
||||
if h:
|
||||
return h.notes
|
||||
|
||||
def set_notes_for_highlight(self, uuid, notes):
|
||||
h = self.highlights[uuid]
|
||||
if h:
|
||||
if notes:
|
||||
h.notes = notes
|
||||
else:
|
||||
v'delete h.notes'
|
||||
if ui_operations.highlights_changed:
|
||||
ui_operations.highlights_changed(Object.values(self.highlights))
|
||||
return True
|
||||
return False
|
||||
|
||||
def style_for_highlight(self, uuid):
|
||||
h = self.highlights[uuid]
|
||||
if h:
|
||||
return h.style
|
||||
|
||||
def data_for_highlight(self, 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):
|
||||
now = Date().toISOString()
|
||||
for uuid in msg.removed_highlights:
|
||||
self.remove_highlight(uuid)
|
||||
|
||||
annot = self.highlights[msg.uuid] = {
|
||||
'type': 'highlight',
|
||||
'timestamp': now,
|
||||
'uuid': msg.uuid,
|
||||
'highlighted_text': msg.highlighted_text,
|
||||
'start_cfi': msg.bounds.start,
|
||||
'end_cfi': msg.bounds.end,
|
||||
'style': style, # dict with color and background-color
|
||||
'spine_name': self.view.currently_showing.name,
|
||||
'spine_index': self.view.currently_showing.spine_index,
|
||||
}
|
||||
if notes:
|
||||
annot.notes = notes
|
||||
if ui_operations.highlights_changed:
|
||||
ui_operations.highlights_changed(Object.values(self.highlights))
|
||||
|
||||
def highlights_for_currently_showing(self):
|
||||
name = self.view.currently_showing.name
|
||||
ans = v'[]'
|
||||
for h in Object.values(self.highlights):
|
||||
if h.spine_name is name and not h.removed and h.start_cfi:
|
||||
ans.push(h)
|
||||
return ans
|
||||
# }}}
|
||||
|
@ -10,126 +10,11 @@ from book_list.globals import get_session_data
|
||||
from book_list.theme import cached_color_to_rgba, get_color
|
||||
from dom import clear, ensure_id, svgicon, unique_id
|
||||
from modals import error_dialog, question_dialog
|
||||
from read_book.annotations import merge_annotation_maps
|
||||
from read_book.globals import ui_operations
|
||||
from read_book.shortcuts import shortcut_for_key_event
|
||||
from widgets import create_button
|
||||
|
||||
|
||||
class AnnotationsManager: # {{{
|
||||
|
||||
def __init__(self, view):
|
||||
self.view = view
|
||||
self.set_highlights()
|
||||
|
||||
def set_highlights(self, highlights):
|
||||
highlights = highlights or v'[]'
|
||||
self.highlights = {h.uuid: h for h in highlights}
|
||||
|
||||
def merge_highlights(self, highlights):
|
||||
highlights = highlights or v'[]'
|
||||
updated = False
|
||||
if highlights.length:
|
||||
base = {'highlight': Object.values(self.highlights)}
|
||||
newvals = {'highlight': highlights}
|
||||
updated, ans = merge_annotation_maps(base, newvals)
|
||||
if updated:
|
||||
self.set_highlights(ans.highlight)
|
||||
return updated
|
||||
|
||||
def remove_highlight(self, uuid):
|
||||
h = self.highlights[uuid]
|
||||
if h:
|
||||
h.timestamp = Date().toISOString()
|
||||
h.removed = True
|
||||
v'delete h.style'
|
||||
v'delete h.highlighted_text'
|
||||
v'delete h.start_cfi'
|
||||
v'delete h.end_cfi'
|
||||
v'delete h.notes'
|
||||
v'delete h.spine_name'
|
||||
v'delete h.spine_index'
|
||||
return True
|
||||
|
||||
def delete_highlight(self, uuid):
|
||||
if self.remove_highlight(uuid):
|
||||
if ui_operations.highlights_changed:
|
||||
ui_operations.highlights_changed(Object.values(self.highlights))
|
||||
|
||||
def notes_for_highlight(self, uuid):
|
||||
h = self.highlights[uuid] if uuid else None
|
||||
if h:
|
||||
return h.notes
|
||||
|
||||
def set_notes_for_highlight(self, uuid, notes):
|
||||
h = self.highlights[uuid]
|
||||
if h:
|
||||
if notes:
|
||||
h.notes = notes
|
||||
else:
|
||||
v'delete h.notes'
|
||||
if ui_operations.highlights_changed:
|
||||
ui_operations.highlights_changed(Object.values(self.highlights))
|
||||
return True
|
||||
return False
|
||||
|
||||
def style_for_highlight(self, uuid):
|
||||
h = self.highlights[uuid]
|
||||
if h:
|
||||
return h.style
|
||||
|
||||
def data_for_highlight(self, 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):
|
||||
now = Date().toISOString()
|
||||
for uuid in msg.removed_highlights:
|
||||
self.remove_highlight(uuid)
|
||||
|
||||
annot = self.highlights[msg.uuid] = {
|
||||
'type': 'highlight',
|
||||
'timestamp': now,
|
||||
'uuid': msg.uuid,
|
||||
'highlighted_text': msg.highlighted_text,
|
||||
'start_cfi': msg.bounds.start,
|
||||
'end_cfi': msg.bounds.end,
|
||||
'style': style, # dict with color and background-color
|
||||
'spine_name': self.view.currently_showing.name,
|
||||
'spine_index': self.view.currently_showing.spine_index,
|
||||
}
|
||||
if notes:
|
||||
annot.notes = notes
|
||||
if ui_operations.highlights_changed:
|
||||
ui_operations.highlights_changed(Object.values(self.highlights))
|
||||
|
||||
def highlights_for_currently_showing(self):
|
||||
name = self.view.currently_showing.name
|
||||
ans = v'[]'
|
||||
for h in Object.values(self.highlights):
|
||||
if h.spine_name is name and not h.removed and h.start_cfi:
|
||||
ans.push(h)
|
||||
return ans
|
||||
# }}}
|
||||
|
||||
|
||||
WAITING_FOR_CLICK = 1
|
||||
WAITING_FOR_DRAG = 2
|
||||
DRAGGING_LEFT = 3
|
||||
|
@ -12,8 +12,9 @@ from book_list.theme import cached_color_to_rgba, get_color
|
||||
from dom import add_extra_css, build_rule, clear, set_css, svgicon, unique_id
|
||||
from iframe_comm import IframeWrapper
|
||||
from modals import error_dialog, warning_dialog
|
||||
from read_book.annotations import AnnotationsManager
|
||||
from read_book.content_popup import ContentPopupOverlay
|
||||
from read_book.create_annotation import AnnotationsManager, CreateAnnotation
|
||||
from read_book.create_annotation import CreateAnnotation
|
||||
from read_book.globals import (
|
||||
current_book, rtl_page_progression, runtime, set_current_spine_item,
|
||||
ui_operations
|
||||
|
Loading…
x
Reference in New Issue
Block a user