diff --git a/src/qtgui/rclmain_w.cpp b/src/qtgui/rclmain_w.cpp index 9ad33d12..872fecfe 100644 --- a/src/qtgui/rclmain_w.cpp +++ b/src/qtgui/rclmain_w.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include "recoll.h" #include "log.h" @@ -752,7 +753,7 @@ void RclMain::showTrayMessage(const QString& text) { if (m_trayicon && prefs.trayMessages) m_trayicon->showMessage("Recoll", text, - QSystemTrayIcon::Information, 1000); + QSystemTrayIcon::Information, 2000); } void RclMain::closeEvent(QCloseEvent *ev) @@ -887,6 +888,11 @@ public: int cnt; }; +void RclMain::hideToolTip() +{ + QToolTip::hideText(); +} + void RclMain::initiateQuery() { if (!m_source) diff --git a/src/qtgui/rclmain_w.h b/src/qtgui/rclmain_w.h index 1d09b967..cea89e0b 100644 --- a/src/qtgui/rclmain_w.h +++ b/src/qtgui/rclmain_w.h @@ -169,7 +169,8 @@ public slots: virtual void onSetDescription(QString); virtual void onNewShortcuts(); virtual void toggleTable(); - + virtual void hideToolTip(); + private slots: virtual void updateIdxStatus(); virtual void onWebcacheDestroyed(QObject *); diff --git a/src/qtgui/reslist.cpp b/src/qtgui/reslist.cpp index a87563f7..d2ca7700 100644 --- a/src/qtgui/reslist.cpp +++ b/src/qtgui/reslist.cpp @@ -1267,6 +1267,13 @@ void ResList::menuCopyFN() ResultPopup::copyFN(doc); } +void ResList::menuCopyText() +{ + Rcl::Doc doc; + if (getDoc(m_popDoc, doc)) + ResultPopup::copyText(doc, m_rclmain); +} + void ResList::menuCopyURL() { Rcl::Doc doc; diff --git a/src/qtgui/reslist.h b/src/qtgui/reslist.h index ece5efda..5b98119b 100644 --- a/src/qtgui/reslist.h +++ b/src/qtgui/reslist.h @@ -82,6 +82,7 @@ public slots: virtual void menuOpenWith(QAction *); virtual void menuCopyFN(); virtual void menuCopyURL(); + virtual void menuCopyText(); virtual void menuExpand(); virtual void menuPreviewParent(); virtual void menuOpenParent(); diff --git a/src/qtgui/respopup.cpp b/src/qtgui/respopup.cpp index 0a280179..bbdf600b 100644 --- a/src/qtgui/respopup.cpp +++ b/src/qtgui/respopup.cpp @@ -20,6 +20,9 @@ #include #include #include +#include +#include +#include #include "log.h" #include "smallut.h" @@ -27,6 +30,7 @@ #include "docseq.h" #include "respopup.h" #include "appformime.h" +#include "rclmain_w.h" namespace ResultPopup { @@ -95,6 +99,7 @@ QMenu *create(QWidget *me, int opts, std::shared_ptr source, popup->addAction(QWidget::tr("Copy &File Name"), me, SLOT(menuCopyFN())); } popup->addAction(QWidget::tr("Copy &URL"), me, SLOT(menuCopyURL())); + popup->addAction(QWidget::tr("Copy Text"), me, SLOT(menuCopyText())); if ((opts&showSaveOne) && !(isFsTop)) popup->addAction(QWidget::tr("&Write to File"), me, @@ -176,4 +181,32 @@ void copyURL(const Rcl::Doc &doc) QApplication::clipboard()->setText(url, QClipboard::Clipboard); } + +void copyText(Rcl::Doc &doc, RclMain *rclmain) +{ + QString msg(QApplication::translate("RclMainBase", "Could not extract or copy text")); + if (rcldb->getDocRawText(doc)) { + QApplication::clipboard()->setText(u8s2qs(doc.text)); + msg = QApplication::translate("RclMainBase", + "%1 bytes copied to clipboard").arg(doc.text.size()); + } + + if (rclmain) { + // Feedback was requested: tray messages are too ennoying, not + // everybody displays the status bar, and the tool tip only + // works when the copy is triggered through a shortcut (else, + // it appears that the mouse event cancels it and it's not + // shown). So let's do status bar if visible else tooltip. + // Menu trigger with no status bar -> no feedback... + + // rclmain->showTrayMessage(msg); + if (rclmain->statusBar()->isVisible()) { + rclmain->statusBar()->showMessage(msg, 1000); + } else { + QToolTip::showText(QCursor::pos(), msg); + QTimer::singleShot(1000, rclmain, SLOT(hideToolTip())); + } + } +} + } diff --git a/src/qtgui/respopup.h b/src/qtgui/respopup.h index 72cf00ef..6be65463 100644 --- a/src/qtgui/respopup.h +++ b/src/qtgui/respopup.h @@ -18,6 +18,7 @@ #define _RESPOPUP_H_INCLUDED_ #include "autoconfig.h" +class RclMain; namespace ResultPopup { enum Options {showExpand = 0x1, showSubs = 0x2, isMain = 0x3, showSaveOne = 0x4, showSaveSel = 0x8}; @@ -29,6 +30,7 @@ extern Rcl::Doc getParent(std::shared_ptr source, extern Rcl::Doc getFolder(Rcl::Doc& doc); extern void copyFN(const Rcl::Doc &doc); extern void copyURL(const Rcl::Doc &doc); +extern void copyText(Rcl::Doc &doc, RclMain *rclmain=nullptr); }; #endif /* _RESPOPUP_H_INCLUDED_ */ diff --git a/src/qtgui/restable.cpp b/src/qtgui/restable.cpp index c0b7eb2f..8314da47 100644 --- a/src/qtgui/restable.cpp +++ b/src/qtgui/restable.cpp @@ -717,7 +717,7 @@ void ResTable::onNewShortcuts() "Ctrl+V", m_showvheadersc, toggleVHeader); SETSHORTCUT(this, "restable:718", tr("Result Table"), tr("Copy current result text to clipboard"), - "Ctrl+G", m_copycurtextsc, copyCurrentRowText); + "Ctrl+G", m_copycurtextsc, menuCopyText); std::vector scps={ m_opensc, m_openquitsc, m_previewsc, m_showsnipssc, m_showheadersc, m_showvheadersc, m_copycurtextsc}; @@ -812,23 +812,6 @@ void ResTable::onUiPrefsChanged() } } -void ResTable::copyCurrentRowText() -{ - auto index = tableView->selectionModel()->currentIndex(); - if (!index.isValid()) { - LOGINF("ResTable::copyCurrentRowText: invalid current index\n"); - return; - } - int row = index.row(); - LOGDEB("copyCurrentRowText: row " << row << "\n"); - Rcl::Doc doc; - auto source = m_model->getDocSource(); - if (source && source->getDoc(row, doc) && rcldb && - rcldb->getDocRawText(doc)) { - QApplication::clipboard()->setText(u8s2qs(doc.text)); - }; -} - void ResTable::setCurrentRow(int row) { tableView->setFocus(Qt::ShortcutFocusReason); @@ -1238,6 +1221,12 @@ void ResTable::menuCopyURL() ResultPopup::copyURL(m_detaildoc); } +void ResTable::menuCopyText() +{ + if (m_detaildocnum >= 0 && rcldb) + ResultPopup::copyText(m_detaildoc, m_rclmain); +} + void ResTable::menuExpand() { if (m_detaildocnum >= 0) diff --git a/src/qtgui/restable.h b/src/qtgui/restable.h index bc32b2d4..4b871c14 100644 --- a/src/qtgui/restable.h +++ b/src/qtgui/restable.h @@ -169,6 +169,7 @@ public slots: virtual void menuOpenWith(QAction *); virtual void menuCopyFN(); virtual void menuCopyURL(); + virtual void menuCopyText(); virtual void menuExpand(); virtual void menuPreviewParent(); virtual void menuOpenParent(); @@ -188,7 +189,6 @@ public slots: virtual void setCurrentRow(int row); virtual void toggleHeader(); virtual void toggleVHeader(); - virtual void copyCurrentRowText(); signals: void docPreviewClicked(int, Rcl::Doc, int);