From 36fd18c62127745589c4af3235e2757d20522f94 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 15 Sep 2020 07:23:40 +0530 Subject: [PATCH] Add a context menu to the viewer highlights panel --- src/calibre/gui2/viewer/highlights.py | 28 +++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/viewer/highlights.py b/src/calibre/gui2/viewer/highlights.py index 30c09f9710..9a089ecfa5 100644 --- a/src/calibre/gui2/viewer/highlights.py +++ b/src/calibre/gui2/viewer/highlights.py @@ -9,8 +9,8 @@ from functools import lru_cache from itertools import chain from PyQt5.Qt import ( QColor, QFont, QHBoxLayout, QIcon, QImage, QItemSelectionModel, QKeySequence, - QLabel, QPainter, QPainterPath, QPixmap, QPushButton, QRect, QSizePolicy, Qt, - QTextEdit, QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget, pyqtSignal + QLabel, QMenu, QPainter, QPainterPath, QPixmap, QPushButton, QRect, QSizePolicy, + Qt, QTextEdit, QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget, pyqtSignal ) from calibre.constants import ( @@ -146,9 +146,12 @@ class Highlights(QTreeWidget): current_highlight_changed = pyqtSignal(object) delete_requested = pyqtSignal() edit_requested = pyqtSignal() + edit_notes_requested = pyqtSignal() def __init__(self, parent=None): QTreeWidget.__init__(self, parent) + self.setContextMenuPolicy(Qt.CustomContextMenu) + self.customContextMenuRequested.connect(self.show_context_menu) self.default_decoration = QIcon(I('blank.png')) self.setHeaderHidden(True) self.num_of_items = 0 @@ -161,6 +164,23 @@ class Highlights(QTreeWidget): self.section_font = QFont(self.font()) self.section_font.setItalic(True) + def show_context_menu(self, point): + index = self.indexAt(point) + h = index.data(Qt.UserRole) + self.context_menu = m = QMenu(self) + if h is not None: + m.addAction(QIcon(I('edit_input.png')), _('Modify this highlight'), self.edit_requested.emit) + m.addAction(QIcon(I('trash.png')), ngettext( + 'Delete this highlight', 'Delete selected highlights', len(self.selectedItems()) + ), self.delete_requested.emit) + if h.get('notes'): + m.addAction(QIcon(I('modified.png')), _('Edit notes for this highlight'), self.edit_notes_requested.emit) + m.addSeparator() + m.addAction(_('Expand all'), self.expandAll) + m.addAction(_('Collapse all'), self.collapseAll) + self.context_menu.popup(self.mapToGlobal(point)) + return True + def current_item_changed(self, current, previous): self.current_highlight_changed.emit(current.data(0, Qt.UserRole) if current is not None else None) @@ -397,6 +417,7 @@ class HighlightsPanel(QWidget): h.jump_to_highlight.connect(self.jump_to_highlight) h.delete_requested.connect(self.remove_highlight) h.edit_requested.connect(self.edit_highlight) + h.edit_notes_requested.connect(self.edit_notes) h.current_highlight_changed.connect(self.current_highlight_changed) self.load = h.load self.refresh = h.refresh @@ -467,6 +488,9 @@ class HighlightsPanel(QWidget): return self.no_selected_highlight() self.request_highlight_action.emit(h['uuid'], 'edit') + def edit_notes(self): + self.notes_display.edit_notes() + def remove_highlight(self): highlights = tuple(self.highlights.selected_highlights) if not highlights: