Add search to snippets window + dont display snippets where no actual match is found

This commit is contained in:
Jean-Francois Dockes 2012-10-08 14:23:17 +02:00
parent ec9bdfa882
commit 9b1a23385d
3 changed files with 167 additions and 33 deletions

View file

@ -16,7 +16,9 @@
<property name="sizeGripEnabled">
<bool>true</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QWebView" name="webView">
<property name="url">
@ -26,6 +28,79 @@
</property>
</widget>
</item>
<item>
<widget class="QFrame" name="searchFM">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QToolButton" name="searchClosePB">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string notr="true">X</string>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextOnly</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="searchLB">
<property name="text">
<string>Find:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="searchLE">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="nextPB">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Next</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="prevPB">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Prev</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
@ -63,5 +138,21 @@
</hint>
</hints>
</connection>
<connection>
<sender>searchClosePB</sender>
<signal>clicked()</signal>
<receiver>searchFM</receiver>
<slot>hide()</slot>
<hints>
<hint type="sourcelabel">
<x>33</x>
<y>414</y>
</hint>
<hint type="destinationlabel">
<x>328</x>
<y>414</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View file

@ -21,8 +21,13 @@
#include <string>
#include <vector>
#include <sstream>
using namespace std;
#include <QWebSettings>
#include <QWebFrame>
#include <QShortcut>
#include "debuglog.h"
#include "recoll.h"
#include "snippets_w.h"
@ -50,6 +55,25 @@ void SnippetsW::init()
if (m_source.isNull())
return;
searchFM->hide();
webView->page()->currentFrame()->setScrollBarPolicy(Qt::Horizontal,
Qt::ScrollBarAlwaysOff);
new QShortcut(QKeySequence::Find, this, SLOT(slotEditFind()));
new QShortcut(QKeySequence(Qt::Key_Slash), this, SLOT(slotEditFind()));
new QShortcut(QKeySequence::FindNext, this, SLOT(slotEditFindNext()));
new QShortcut(QKeySequence::FindPrevious, this,
SLOT(slotEditFindPrevious()));
connect(searchLE, SIGNAL(textChanged(const QString&)),
this, SLOT(slotSearchTextChanged(const QString&)));
connect(nextPB, SIGNAL(clicked()), this, SLOT(slotEditFindNext()));
new QShortcut(QKeySequence(Qt::Key_F3), this, SLOT(slotEditFindNext()));
connect(prevPB, SIGNAL(clicked()), this, SLOT(slotEditFindPrevious()));
connect(webView, SIGNAL(linkClicked(const QUrl &)),
this, SLOT(linkWasClicked(const QUrl &)));
webView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
// Make title out of file name if none yet
string titleOrFilename;
string utf8fn;
@ -58,7 +82,6 @@ void SnippetsW::init()
if (titleOrFilename.empty()) {
titleOrFilename = utf8fn;
}
setWindowTitle(QString::fromUtf8(titleOrFilename.c_str()));
vector<Rcl::Snippet> vpabs;
@ -67,43 +90,60 @@ void SnippetsW::init()
HighlightData hdata;
m_source->getTerms(hdata);
QString html = QString::fromAscii(
ostringstream oss;
oss <<
"<html><head>"
"<meta http-equiv=\"content-type\" "
"content=\"text/html; charset=utf-8\"></head>"
"<body style='overflow-x: scroll; white-space: nowrap'>"
"<table>"
);
;
g_hiliter.set_inputhtml(false);
for (vector<Rcl::Snippet>::const_iterator it = vpabs.begin();
it != vpabs.end(); it++) {
html += "<tr><td>";
if (it->page > 0) {
char txt[100];
sprintf(txt, "P.&nbsp;%d", it->page);
char url[100];
sprintf(url, "P%dT%s", it->page, it->term.c_str());
html += "<a href=\"";
html += url;
html += "\">";
html += txt;
html += "</a>";
}
html += "</td><td>";
list<string> lr;
g_hiliter.plaintorich(it->snippet, lr, hdata);
html.append(QString::fromUtf8(lr.front().c_str()));
html.append("</td></tr>\n");
if (!g_hiliter.plaintorich(it->snippet, lr, hdata)) {
LOGDEB1(("No match for [%s]\n", it->snippet.c_str()));
continue;
}
html.append("</body></html>");
webView->setHtml(html);
connect(webView, SIGNAL(linkClicked(const QUrl &)),
this, SLOT(linkWasClicked(const QUrl &)));
webView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
oss << "<tr><td>";
if (it->page > 0) {
oss << "<a href=\"P" << it->page << "T" << it->term << "\">"
<< "P.&nbsp;" << it->page << "</a>";
}
oss << "</td><td>" << lr.front().c_str() << "</td></tr>" << endl;
}
oss << "</body></html>";
QWebSettings *ws = webView->page()->settings();
if (prefs.reslistfontfamily != "") {
ws->setFontFamily(QWebSettings::StandardFont, prefs.reslistfontfamily);
ws->setFontSize(QWebSettings::DefaultFontSize, prefs.reslistfontsize);
}
webView->setHtml(QString::fromUtf8(oss.str().c_str()));
}
void SnippetsW::slotEditFind()
{
searchFM->show();
searchLE->selectAll();
searchLE->setFocus();
}
void SnippetsW::slotEditFindNext()
{
webView->findText(searchLE->text());
}
void SnippetsW::slotEditFindPrevious()
{
webView->findText(searchLE->text(), QWebPage::FindBackward);
}
void SnippetsW::slotSearchTextChanged(const QString& txt)
{
webView->findText(txt);
}
void SnippetsW::linkWasClicked(const QUrl &url)
{

View file

@ -38,7 +38,10 @@ public:
protected slots:
virtual void linkWasClicked(const QUrl &);
virtual void slotEditFind();
virtual void slotEditFindNext();
virtual void slotEditFindPrevious();
virtual void slotSearchTextChanged(const QString&);
signals:
void startNativeViewer(Rcl::Doc, int pagenum, QString term);