From 393937708552725329035daf1bffa260fbcf551f Mon Sep 17 00:00:00 2001 From: dockes Date: Tue, 21 Mar 2006 15:11:30 +0000 Subject: [PATCH] implement right click menu in result list --- src/qtgui/rclreslist.cpp | 51 +++++++++++++++++++++++++++++++++++++++- src/qtgui/rclreslist.h | 12 ++++++++-- 2 files changed, 60 insertions(+), 3 deletions(-) diff --git a/src/qtgui/rclreslist.cpp b/src/qtgui/rclreslist.cpp index 33b9038e..e4c3f615 100644 --- a/src/qtgui/rclreslist.cpp +++ b/src/qtgui/rclreslist.cpp @@ -1,5 +1,5 @@ #ifndef lint -static char rcsid[] = "@(#$Id: rclreslist.cpp,v 1.3 2006-03-21 13:46:37 dockes Exp $ (C) 2005 J.F.Dockes"; +static char rcsid[] = "@(#$Id: rclreslist.cpp,v 1.4 2006-03-21 15:11:30 dockes Exp $ (C) 2005 J.F.Dockes"; #endif #include @@ -12,6 +12,7 @@ static char rcsid[] = "@(#$Id: rclreslist.cpp,v 1.3 2006-03-21 13:46:37 dockes E #include #include #include +#include #include "debuglog.h" #include "recoll.h" @@ -71,6 +72,21 @@ void RclResList::setDocSource(DocSequence *docsource) showResultPage(); } +// Get document number from paragraph number +int RclResList::docnumfromparnum(int par) +{ + if (m_winfirst == -1) + return -1; + std::map::iterator it = m_pageParaToReldocnums.find(par); + int dn; + if (it != m_pageParaToReldocnums.end()) { + dn = m_winfirst + it->second; + } else { + dn = -1; + } + return dn; +} + bool RclResList::getDoc(int docnum, Rcl::Doc &doc) { if (docnum >= 0 && docnum >= int(m_winfirst) && @@ -155,6 +171,7 @@ void RclResList::showResultPage() Rcl::Doc doc; int resCnt = m_docsource->getResCnt(); + m_pageParaToReldocnums.clear(); LOGDEB(("showResultPage: rescnt %d, winfirst %d\n", resCnt, m_winfirst)); @@ -180,6 +197,7 @@ void RclResList::showResultPage() int last = MIN(resCnt-m_winfirst, prefs.respagesize); m_curDocs.clear(); + // Insert results if any in result list window. We have to send // the text to the widgets, because we need the paragraph number // each time we add a result paragraph (its diffult and @@ -310,6 +328,7 @@ void RclResList::showResultPage() append(str); setCursorPosition(0,0); + m_pageParaToReldocnums[paragraphs()-1] = i; m_curDocs.push_back(doc); } @@ -387,3 +406,33 @@ void RclResList::linkWasClicked(const QString &s) default: break;// ?? } } + +QPopupMenu *RclResList::createPopupMenu(const QPoint& pos) +{ + int para = paragraphAt(pos); + clicked(para, 0); + m_docnum = docnumfromparnum(para); + QPopupMenu *popup = new QPopupMenu(this, "qt_edit_menu"); + popup->insertItem(tr("&Preview"), this, SLOT(menuPreview())); + popup->insertItem(tr("&Edit"), this, SLOT(menuEdit())); + popup->insertItem(tr("&Copy File Name"), this, SLOT(menuCopyFN())); + return popup; +} + +void RclResList::menuPreview() +{ + emit docClicked(m_docnum); +} +void RclResList::menuEdit() +{ + emit docDoubleClicked(m_docnum); +} +void RclResList::menuCopyFN() +{ + Rcl::Doc doc; + if (getDoc(m_docnum, doc)) { + // Our urls currently always begin with "file://" + QApplication::clipboard()->setText(doc.url.c_str()+7, + QClipboard::Selection); + } +} diff --git a/src/qtgui/rclreslist.h b/src/qtgui/rclreslist.h index 3618b75f..81954060 100644 --- a/src/qtgui/rclreslist.h +++ b/src/qtgui/rclreslist.h @@ -1,8 +1,9 @@ #ifndef _RCLRESLIST_H_INCLUDED_ #define _RCLRESLIST_H_INCLUDED_ -/* @(#$Id: rclreslist.h,v 1.2 2006-03-21 13:46:37 dockes Exp $ (C) 2005 J.F.Dockes */ +/* @(#$Id: rclreslist.h,v 1.3 2006-03-21 15:11:30 dockes Exp $ (C) 2005 J.F.Dockes */ #include +#include #include "rcldb.h" #include "docseq.h" @@ -18,6 +19,7 @@ class RclResList : public QTextBrowser virtual void resetSearch() {m_winfirst = -1;} virtual bool getDoc( int, Rcl::Doc & ); virtual void setDocSource(DocSequence *); + virtual QPopupMenu *createPopupMenu(const QPoint& pos); public slots: virtual void clicked(int, int); @@ -25,6 +27,9 @@ class RclResList : public QTextBrowser virtual void resPageDownOrNext(); virtual void resultPageBack(); virtual void showResultPage(); + virtual void menuPreview(); + virtual void menuEdit(); + virtual void menuCopyFN(); signals: void nextPageAvailable(bool); @@ -41,10 +46,13 @@ class RclResList : public QTextBrowser virtual void linkWasClicked(const QString &); private: + std::map m_pageParaToReldocnums; + virtual int docnumfromparnum(int); + DocSequence *m_docsource; std::vector m_curDocs; int m_winfirst; - + int m_docnum; // Docnum matching the void emitLinkClicked(const QString &s) { emit linkClicked(s); };