mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
More robust expanded tracking
This commit is contained in:
parent
fdf1fca556
commit
b37186d3a1
@ -31,6 +31,8 @@ from calibre.gui2.widgets2 import Dialog
|
|||||||
from calibre_extensions.progress_indicator import set_no_activate_on_click
|
from calibre_extensions.progress_indicator import set_no_activate_on_click
|
||||||
|
|
||||||
decoration_cache = {}
|
decoration_cache = {}
|
||||||
|
highlight_role = Qt.ItemDataRole.UserRole
|
||||||
|
section_role = highlight_role + 1
|
||||||
|
|
||||||
|
|
||||||
@lru_cache(maxsize=8)
|
@lru_cache(maxsize=8)
|
||||||
@ -188,7 +190,7 @@ class Highlights(QTreeWidget):
|
|||||||
|
|
||||||
def show_context_menu(self, point):
|
def show_context_menu(self, point):
|
||||||
index = self.indexAt(point)
|
index = self.indexAt(point)
|
||||||
h = index.data(Qt.ItemDataRole.UserRole)
|
h = index.data(highlight_role)
|
||||||
self.context_menu = m = QMenu(self)
|
self.context_menu = m = QMenu(self)
|
||||||
if h is not None:
|
if h is not None:
|
||||||
m.addAction(QIcon.ic('edit_input.png'), _('Modify this highlight'), self.edit_requested.emit)
|
m.addAction(QIcon.ic('edit_input.png'), _('Modify this highlight'), self.edit_requested.emit)
|
||||||
@ -203,7 +205,7 @@ class Highlights(QTreeWidget):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
def current_item_changed(self, current, previous):
|
def current_item_changed(self, current, previous):
|
||||||
self.current_highlight_changed.emit(current.data(0, Qt.ItemDataRole.UserRole) if current is not None else None)
|
self.current_highlight_changed.emit(current.data(0, highlight_role) if current is not None else None)
|
||||||
|
|
||||||
def load(self, highlights, preserve_state=False):
|
def load(self, highlights, preserve_state=False):
|
||||||
s = self.style()
|
s = self.style()
|
||||||
@ -213,7 +215,7 @@ class Highlights(QTreeWidget):
|
|||||||
for i in range(root.childCount()):
|
for i in range(root.childCount()):
|
||||||
chapter = root.child(i)
|
chapter = root.child(i)
|
||||||
if chapter.isExpanded():
|
if chapter.isExpanded():
|
||||||
expanded_chapters.add(chapter.data(0, Qt.ItemDataRole.DisplayRole))
|
expanded_chapters.add(chapter.data(0, section_role))
|
||||||
icon_size = s.pixelMetric(QStyle.PixelMetric.PM_SmallIconSize, None, self)
|
icon_size = s.pixelMetric(QStyle.PixelMetric.PM_SmallIconSize, None, self)
|
||||||
dpr = self.devicePixelRatioF()
|
dpr = self.devicePixelRatioF()
|
||||||
is_dark = is_dark_theme()
|
is_dark = is_dark_theme()
|
||||||
@ -262,10 +264,11 @@ class Highlights(QTreeWidget):
|
|||||||
section = QTreeWidgetItem([sec['title']], 1)
|
section = QTreeWidgetItem([sec['title']], 1)
|
||||||
section.setFlags(Qt.ItemFlag.ItemIsEnabled)
|
section.setFlags(Qt.ItemFlag.ItemIsEnabled)
|
||||||
section.setFont(0, self.section_font)
|
section.setFont(0, self.section_font)
|
||||||
|
section.setData(0, section_role, sec['key'])
|
||||||
if sec['tooltip']:
|
if sec['tooltip']:
|
||||||
section.setToolTip(0, sec['tooltip'])
|
section.setToolTip(0, sec['tooltip'])
|
||||||
self.addTopLevelItem(section)
|
self.addTopLevelItem(section)
|
||||||
section.setExpanded(not preserve_state or sec['title'] in expanded_chapters)
|
section.setExpanded(not preserve_state or sec['key'] in expanded_chapters)
|
||||||
for itemnum, h in enumerate(sec['items']):
|
for itemnum, h in enumerate(sec['items']):
|
||||||
txt = h.get('highlighted_text')
|
txt = h.get('highlighted_text')
|
||||||
txt = txt.replace('\n', ' ')
|
txt = txt.replace('\n', ' ')
|
||||||
@ -275,7 +278,7 @@ class Highlights(QTreeWidget):
|
|||||||
txt = txt[:100] + '…'
|
txt = txt[:100] + '…'
|
||||||
item = QTreeWidgetItem(section, [txt], 2)
|
item = QTreeWidgetItem(section, [txt], 2)
|
||||||
item.setFlags(Qt.ItemFlag.ItemIsSelectable | Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemNeverHasChildren)
|
item.setFlags(Qt.ItemFlag.ItemIsSelectable | Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemNeverHasChildren)
|
||||||
item.setData(0, Qt.ItemDataRole.UserRole, h)
|
item.setData(0, highlight_role, h)
|
||||||
try:
|
try:
|
||||||
dec = decoration_for_style(self.palette(), h.get('style') or {}, icon_size, dpr, is_dark)
|
dec = decoration_for_style(self.palette(), h.get('style') or {}, icon_size, dpr, is_dark)
|
||||||
except Exception:
|
except Exception:
|
||||||
@ -327,7 +330,7 @@ class Highlights(QTreeWidget):
|
|||||||
if ch:
|
if ch:
|
||||||
q = ch['uuid']
|
q = ch['uuid']
|
||||||
for i, item in enumerate(items):
|
for i, item in enumerate(items):
|
||||||
h = item.data(0, Qt.ItemDataRole.UserRole)
|
h = item.data(0, highlight_role)
|
||||||
if h['uuid'] == q:
|
if h['uuid'] == q:
|
||||||
cr = i
|
cr = i
|
||||||
if query.backwards:
|
if query.backwards:
|
||||||
@ -339,7 +342,7 @@ class Highlights(QTreeWidget):
|
|||||||
cr = -1
|
cr = -1
|
||||||
indices = chain(range(cr + 1, count), range(0, cr + 1))
|
indices = chain(range(cr + 1, count), range(0, cr + 1))
|
||||||
for i in indices:
|
for i in indices:
|
||||||
h = items[i].data(0, Qt.ItemDataRole.UserRole)
|
h = items[i].data(0, highlight_role)
|
||||||
if pat.search(h['highlighted_text']) is not None or pat.search(h.get('notes') or '') is not None:
|
if pat.search(h['highlighted_text']) is not None or pat.search(h.get('notes') or '') is not None:
|
||||||
self.set_current_row(*self.uuid_map[h['uuid']])
|
self.set_current_row(*self.uuid_map[h['uuid']])
|
||||||
return True
|
return True
|
||||||
@ -362,7 +365,7 @@ class Highlights(QTreeWidget):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
def item_activated(self, item):
|
def item_activated(self, item):
|
||||||
h = item.data(0, Qt.ItemDataRole.UserRole)
|
h = item.data(0, highlight_role)
|
||||||
if h is not None:
|
if h is not None:
|
||||||
self.jump_to_highlight.emit(h)
|
self.jump_to_highlight.emit(h)
|
||||||
|
|
||||||
@ -370,17 +373,17 @@ class Highlights(QTreeWidget):
|
|||||||
def current_highlight(self):
|
def current_highlight(self):
|
||||||
i = self.currentItem()
|
i = self.currentItem()
|
||||||
if i is not None:
|
if i is not None:
|
||||||
return i.data(0, Qt.ItemDataRole.UserRole)
|
return i.data(0, highlight_role)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def all_highlights(self):
|
def all_highlights(self):
|
||||||
for item in self.iteritems():
|
for item in self.iteritems():
|
||||||
yield item.data(0, Qt.ItemDataRole.UserRole)
|
yield item.data(0, highlight_role)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def selected_highlights(self):
|
def selected_highlights(self):
|
||||||
for item in self.selectedItems():
|
for item in self.selectedItems():
|
||||||
yield item.data(0, Qt.ItemDataRole.UserRole)
|
yield item.data(0, highlight_role)
|
||||||
|
|
||||||
def keyPressEvent(self, ev):
|
def keyPressEvent(self, ev):
|
||||||
if ev.matches(QKeySequence.StandardKey.Delete):
|
if ev.matches(QKeySequence.StandardKey.Delete):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user