From 7d53ef7c748fd509dbc37cf1383a56b8eaaa7291 Mon Sep 17 00:00:00 2001 From: Kai Uwe Broulik Date: Tue, 25 Apr 2023 18:33:29 +0200 Subject: [PATCH] Allow copying annotation text to clipboard Adds a "Copy Text to Clipboard" context menu which copies the annotation text to the clipboard as plain text. When an annotation is selected in "Browse" mode, its text is copied. --- part/annotationpopup.cpp | 31 +++++++++++++++++++++++++++++++ part/annotationpopup.h | 1 + part/pageview.cpp | 10 ++++++++++ 3 files changed, 42 insertions(+) diff --git a/part/annotationpopup.cpp b/part/annotationpopup.cpp index 1086d9dcf..f52a0dc6a 100644 --- a/part/annotationpopup.cpp +++ b/part/annotationpopup.cpp @@ -7,6 +7,8 @@ #include "annotationpopup.h" #include +#include +#include #include #include @@ -84,6 +86,16 @@ void AnnotationPopup::addActionsToMenu(QMenu *menu) action->setEnabled(onlyOne); connect(action, &QAction::triggered, menu, [this, pair] { doOpenAnnotationWindow(pair); }); + if (!pair.annotation->contents().isEmpty()) { + action = menu->addAction(QIcon::fromTheme(QStringLiteral("edit-copy")), i18n("Copy Text to Clipboard")); + const bool copyAllowed = mDocument->isAllowed(Okular::AllowCopy); + if (!copyAllowed) { + action->setEnabled(false); + action->setText(i18n("Copy forbidden by DRM")); + } + connect(action, &QAction::triggered, menu, [this, pair] { doCopyAnnotation(pair); }); + } + action = menu->addAction(QIcon::fromTheme(QStringLiteral("list-remove")), i18n("&Delete")); action->setEnabled(mDocument->isAllowed(Okular::AllowNotes)); connect(action, &QAction::triggered, menu, [this] { @@ -119,6 +131,16 @@ void AnnotationPopup::addActionsToMenu(QMenu *menu) action = menu->addAction(QIcon::fromTheme(QStringLiteral("comment")), i18n("&Open Pop-up Note")); connect(action, &QAction::triggered, menu, [this, pair] { doOpenAnnotationWindow(pair); }); + if (!pair.annotation->contents().isEmpty()) { + action = menu->addAction(QIcon::fromTheme(QStringLiteral("edit-copy")), i18n("Copy Text to Clipboard")); + const bool copyAllowed = mDocument->isAllowed(Okular::AllowCopy); + if (!copyAllowed) { + action->setEnabled(false); + action->setText(i18n("Copy forbidden by DRM")); + } + connect(action, &QAction::triggered, menu, [this, pair] { doCopyAnnotation(pair); }); + } + action = menu->addAction(QIcon::fromTheme(QStringLiteral("list-remove")), i18n("&Delete")); action->setEnabled(mDocument->isAllowed(Okular::AllowNotes) && mDocument->canRemovePageAnnotation(pair.annotation)); connect(action, &QAction::triggered, menu, [this, pair] { doRemovePageAnnotation(pair); }); @@ -140,6 +162,15 @@ void AnnotationPopup::addActionsToMenu(QMenu *menu) } } +void AnnotationPopup::doCopyAnnotation(AnnotPagePair pair) +{ + const QString text = pair.annotation->contents(); + if (!text.isEmpty()) { + QClipboard *cb = QApplication::clipboard(); + cb->setText(text, QClipboard::Clipboard); + } +} + void AnnotationPopup::doRemovePageAnnotation(AnnotPagePair pair) { if (pair.pageNumber != -1) { diff --git a/part/annotationpopup.h b/part/annotationpopup.h index 7da9586ee..91179686e 100644 --- a/part/annotationpopup.h +++ b/part/annotationpopup.h @@ -69,6 +69,7 @@ public: }; private: + void doCopyAnnotation(AnnotPagePair pair); void doRemovePageAnnotation(AnnotPagePair pair); void doOpenAnnotationWindow(AnnotPagePair pair); void doOpenPropertiesDialog(AnnotPagePair pair); diff --git a/part/pageview.cpp b/part/pageview.cpp index f0d0b81b4..3879ff28a 100644 --- a/part/pageview.cpp +++ b/part/pageview.cpp @@ -1102,6 +1102,16 @@ QMimeData *PageView::getTableContents() const void PageView::copyTextSelection() const { switch (d->mouseMode) { + case Okular::Settings::EnumMouseMode::Browse: { + if (auto *annotation = d->mouseAnnotation->annotation()) { + const QString text = annotation->contents(); + if (!text.isEmpty()) { + QClipboard *cb = QApplication::clipboard(); + cb->setText(text, QClipboard::Clipboard); + } + } + } break; + case Okular::Settings::EnumMouseMode::TableSelect: { QClipboard *cb = QApplication::clipboard(); cb->setMimeData(getTableContents(), QClipboard::Clipboard);