implement right click menu in result list

This commit is contained in:
dockes 2006-03-21 15:11:30 +00:00
parent a1d0bbf0ff
commit 3939377085
2 changed files with 60 additions and 3 deletions

View File

@ -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 <time.h>
@ -12,6 +12,7 @@ static char rcsid[] = "@(#$Id: rclreslist.cpp,v 1.3 2006-03-21 13:46:37 dockes E
#include <qtimer.h>
#include <qmessagebox.h>
#include <qimage.h>
#include <qclipboard.h>
#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<int,int>::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);
}
}

View File

@ -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 <qtextbrowser.h>
#include <qpopupmenu.h>
#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<int,int> m_pageParaToReldocnums;
virtual int docnumfromparnum(int);
DocSequence *m_docsource;
std::vector<Rcl::Doc> m_curDocs;
int m_winfirst;
int m_docnum; // Docnum matching the
void emitLinkClicked(const QString &s) {
emit linkClicked(s);
};