diff --git a/src/qtgui/rclmain.ui b/src/qtgui/rclmain.ui
index 90b4b0d3..07804b89 100644
--- a/src/qtgui/rclmain.ui
+++ b/src/qtgui/rclmain.ui
@@ -79,7 +79,9 @@
+
+
@@ -205,6 +207,14 @@
fileEraseSearchHistoryAction
+
+
+ E&xport simple search history
+
+
+ fileExportSSearchHistoryAction
+
+
Missing &helpers
diff --git a/src/qtgui/rclmain_w.cpp b/src/qtgui/rclmain_w.cpp
index 4d2a8d37..9c97e7bc 100644
--- a/src/qtgui/rclmain_w.cpp
+++ b/src/qtgui/rclmain_w.cpp
@@ -122,15 +122,15 @@ void RclMain::init()
{
// This is just to get the common catg strings into the message file
static const char* catg_strings[] = {
- QT_TR_NOOP("All"), QT_TR_NOOP("media"), QT_TR_NOOP("message"),
- QT_TR_NOOP("other"), QT_TR_NOOP("presentation"),
- QT_TR_NOOP("spreadsheet"), QT_TR_NOOP("text"),
- QT_TR_NOOP("sorted"), QT_TR_NOOP("filtered")
+ QT_TR_NOOP("All"), QT_TR_NOOP("media"), QT_TR_NOOP("message"),
+ QT_TR_NOOP("other"), QT_TR_NOOP("presentation"),
+ QT_TR_NOOP("spreadsheet"), QT_TR_NOOP("text"),
+ QT_TR_NOOP("sorted"), QT_TR_NOOP("filtered")
};
setWindowTitle(configToTitle());
DocSequence::set_translations((const char *)tr("sorted").toUtf8(),
- (const char *)tr("filtered").toUtf8());
+ (const char *)tr("filtered").toUtf8());
periodictimer = new QTimer(this);
@@ -174,20 +174,20 @@ void RclMain::init()
// instead
vector langs;
if (!getStemLangs(langs)) {
- QMessageBox::warning(0, "Recoll",
- tr("error retrieving stemming languages"));
+ QMessageBox::warning(0, "Recoll",
+ tr("error retrieving stemming languages"));
}
QAction *curid = prefs.queryStemLang == "ALL" ? m_idAllStem : m_idNoStem;
QAction *id;
for (vector::const_iterator it = langs.begin();
- it != langs.end(); it++) {
- QString qlang = QString::fromUtf8(it->c_str(), it->length());
- id = preferencesMenu->addAction(qlang);
- id->setCheckable(true);
- m_stemLangToId[qlang] = id;
- if (prefs.queryStemLang == qlang) {
- curid = id;
- }
+ it != langs.end(); it++) {
+ QString qlang = QString::fromUtf8(it->c_str(), it->length());
+ id = preferencesMenu->addAction(qlang);
+ id->setCheckable(true);
+ m_stemLangToId[qlang] = id;
+ if (prefs.queryStemLang == qlang) {
+ curid = id;
+ }
}
curid->setChecked(true);
@@ -246,19 +246,19 @@ void RclMain::init()
theconfig->getGuiFilterNames(cats);
m_catgbutvec.push_back(catg_strings[0]);
for (vector::const_iterator it = cats.begin();
- it != cats.end(); it++) {
- QRadioButton *but = new QRadioButton(m_filtFRM);
- QString catgnm = QString::fromUtf8(it->c_str(), it->length());
- m_catgbutvec.push_back(*it);
- // We strip text before the first colon before setting the button name.
- // This is so that the user can decide the order of buttons by naming
- // the filter,ie, a:media b:messages etc.
- QString but_txt = catgnm;
- int colon = catgnm.indexOf(':');
- if (colon != -1) {
- but_txt = catgnm.right(catgnm.size()-(colon+1));
- }
- but->setText(tr(but_txt.toUtf8()));
+ it != cats.end(); it++) {
+ QRadioButton *but = new QRadioButton(m_filtFRM);
+ QString catgnm = QString::fromUtf8(it->c_str(), it->length());
+ m_catgbutvec.push_back(*it);
+ // We strip text before the first colon before setting the button name.
+ // This is so that the user can decide the order of buttons by naming
+ // the filter,ie, a:media b:messages etc.
+ QString but_txt = catgnm;
+ int colon = catgnm.indexOf(':');
+ if (colon != -1) {
+ but_txt = catgnm.right(catgnm.size()-(colon+1));
+ }
+ but->setText(tr(but_txt.toUtf8()));
m_filtCMB->addItem(tr(but_txt.toUtf8()));
bgrphbox->addWidget(but);
m_filtBGRP->addButton(but, bgrpid++);
@@ -291,147 +291,149 @@ void RclMain::init()
connect(sSearch,
SIGNAL(startSearch(std::shared_ptr, bool)),
- this, SLOT(startSearch(std::shared_ptr, bool)));
+ this, SLOT(startSearch(std::shared_ptr, bool)));
connect(sSearch, SIGNAL(setDescription(QString)),
- this, SLOT(onSetDescription(QString)));
+ this, SLOT(onSetDescription(QString)));
connect(sSearch, SIGNAL(clearSearch()),
- this, SLOT(resetSearch()));
+ this, SLOT(resetSearch()));
connect(preferencesMenu, SIGNAL(triggered(QAction*)),
- this, SLOT(setStemLang(QAction*)));
+ this, SLOT(setStemLang(QAction*)));
connect(preferencesMenu, SIGNAL(aboutToShow()),
- this, SLOT(adjustPrefsMenu()));
+ this, SLOT(adjustPrefsMenu()));
connect(fileExitAction, SIGNAL(triggered() ),
- this, SLOT(fileExit() ) );
+ this, SLOT(fileExit() ) );
connect(fileToggleIndexingAction, SIGNAL(triggered()),
- this, SLOT(toggleIndexing()));
+ this, SLOT(toggleIndexing()));
#ifndef _WIN32
fileMenu->insertAction(fileRebuildIndexAction, fileBumpIndexingAction);
connect(fileBumpIndexingAction, SIGNAL(triggered()),
- this, SLOT(bumpIndexing()));
+ this, SLOT(bumpIndexing()));
#endif
connect(fileRebuildIndexAction, SIGNAL(triggered()),
- this, SLOT(rebuildIndex()));
+ this, SLOT(rebuildIndex()));
connect(fileEraseDocHistoryAction, SIGNAL(triggered()),
- this, SLOT(eraseDocHistory()));
+ this, SLOT(eraseDocHistory()));
connect(fileEraseSearchHistoryAction, SIGNAL(triggered()),
- this, SLOT(eraseSearchHistory()));
+ this, SLOT(eraseSearchHistory()));
+ connect(fileExportSSearchHistoryAction, SIGNAL(triggered()),
+ this, SLOT(exportSimpleSearchHistory()));
connect(actionSave_last_query, SIGNAL(triggered()),
- this, SLOT(saveLastQuery()));
+ this, SLOT(saveLastQuery()));
connect(actionLoad_saved_query, SIGNAL(triggered()),
- this, SLOT(loadSavedQuery()));
+ this, SLOT(loadSavedQuery()));
connect(actionShow_index_statistics, SIGNAL(triggered()),
this, SLOT(showIndexStatistics()));
connect(helpAbout_RecollAction, SIGNAL(triggered()),
- this, SLOT(showAboutDialog()));
+ this, SLOT(showAboutDialog()));
connect(showMissingHelpers_Action, SIGNAL(triggered()),
- this, SLOT(showMissingHelpers()));
+ this, SLOT(showMissingHelpers()));
connect(showActiveTypes_Action, SIGNAL(triggered()),
- this, SLOT(showActiveTypes()));
+ this, SLOT(showActiveTypes()));
connect(userManualAction, SIGNAL(triggered()),
- this, SLOT(startManual()));
+ this, SLOT(startManual()));
connect(toolsDoc_HistoryAction, SIGNAL(triggered()),
- this, SLOT(showDocHistory()));
+ this, SLOT(showDocHistory()));
connect(toolsAdvanced_SearchAction, SIGNAL(triggered()),
- this, SLOT(showAdvSearchDialog()));
+ this, SLOT(showAdvSearchDialog()));
connect(toolsSpellAction, SIGNAL(triggered()),
- this, SLOT(showSpellDialog()));
+ this, SLOT(showSpellDialog()));
connect(actionWebcache_Editor, SIGNAL(triggered()),
this, SLOT(showWebcacheDialog()));
connect(actionQuery_Fragments, SIGNAL(triggered()),
- this, SLOT(showFragButs()));
+ this, SLOT(showFragButs()));
connect(actionSpecial_Indexing, SIGNAL(triggered()),
- this, SLOT(showSpecIdx()));
+ this, SLOT(showSpecIdx()));
connect(indexConfigAction, SIGNAL(triggered()),
- this, SLOT(showIndexConfig()));
+ this, SLOT(showIndexConfig()));
connect(indexScheduleAction, SIGNAL(triggered()),
- this, SLOT(showIndexSched()));
+ this, SLOT(showIndexSched()));
connect(queryPrefsAction, SIGNAL(triggered()),
- this, SLOT(showUIPrefs()));
+ this, SLOT(showUIPrefs()));
connect(extIdxAction, SIGNAL(triggered()),
- this, SLOT(showExtIdxDialog()));
+ this, SLOT(showExtIdxDialog()));
connect(enbSynAction, SIGNAL(toggled(bool)),
this, SLOT(setSynEnabled(bool)));
connect(toggleFullScreenAction, SIGNAL(triggered()),
this, SLOT(toggleFullScreen()));
connect(actionShowQueryDetails, SIGNAL(triggered()),
- reslist, SLOT(showQueryDetails()));
+ reslist, SLOT(showQueryDetails()));
connect(periodictimer, SIGNAL(timeout()),
- this, SLOT(periodic100()));
+ this, SLOT(periodic100()));
restable->setRclMain(this, true);
connect(actionSaveResultsAsCSV, SIGNAL(triggered()),
- restable, SLOT(saveAsCSV()));
+ restable, SLOT(saveAsCSV()));
connect(this, SIGNAL(docSourceChanged(std::shared_ptr)),
- restable, SLOT(setDocSource(std::shared_ptr)));
+ restable, SLOT(setDocSource(std::shared_ptr)));
connect(this, SIGNAL(searchReset()),
- restable, SLOT(resetSource()));
+ restable, SLOT(resetSource()));
connect(this, SIGNAL(resultsReady()),
- restable, SLOT(readDocSource()));
+ restable, SLOT(readDocSource()));
connect(this, SIGNAL(sortDataChanged(DocSeqSortSpec)),
- restable, SLOT(onSortDataChanged(DocSeqSortSpec)));
+ restable, SLOT(onSortDataChanged(DocSeqSortSpec)));
connect(restable->getModel(), SIGNAL(sortDataChanged(DocSeqSortSpec)),
- this, SLOT(onSortDataChanged(DocSeqSortSpec)));
+ this, SLOT(onSortDataChanged(DocSeqSortSpec)));
connect(restable, SIGNAL(docPreviewClicked(int, Rcl::Doc, int)),
- this, SLOT(startPreview(int, Rcl::Doc, int)));
+ this, SLOT(startPreview(int, Rcl::Doc, int)));
connect(restable, SIGNAL(docExpand(Rcl::Doc)),
- this, SLOT(docExpand(Rcl::Doc)));
+ this, SLOT(docExpand(Rcl::Doc)));
connect(restable, SIGNAL(showSubDocs(Rcl::Doc)),
- this, SLOT(showSubDocs(Rcl::Doc)));
+ this, SLOT(showSubDocs(Rcl::Doc)));
connect(restable, SIGNAL(openWithRequested(Rcl::Doc, string)),
- this, SLOT(openWith(Rcl::Doc, string)));
+ this, SLOT(openWith(Rcl::Doc, string)));
reslist->setRclMain(this, true);
connect(this, SIGNAL(docSourceChanged(std::shared_ptr)),
- reslist, SLOT(setDocSource(std::shared_ptr)));
+ reslist, SLOT(setDocSource(std::shared_ptr)));
connect(firstPageAction, SIGNAL(triggered()),
- reslist, SLOT(resultPageFirst()));
+ reslist, SLOT(resultPageFirst()));
connect(prevPageAction, SIGNAL(triggered()),
- reslist, SLOT(resPageUpOrBack()));
+ reslist, SLOT(resPageUpOrBack()));
connect(nextPageAction, SIGNAL(triggered()),
- reslist, SLOT(resPageDownOrNext()));
+ reslist, SLOT(resPageDownOrNext()));
connect(this, SIGNAL(searchReset()),
- reslist, SLOT(resetList()));
+ reslist, SLOT(resetList()));
connect(this, SIGNAL(resultsReady()),
- reslist, SLOT(readDocSource()));
+ reslist, SLOT(readDocSource()));
connect(reslist, SIGNAL(hasResults(int)),
- this, SLOT(resultCount(int)));
+ this, SLOT(resultCount(int)));
connect(reslist, SIGNAL(wordSelect(QString)),
- sSearch, SLOT(addTerm(QString)));
+ sSearch, SLOT(addTerm(QString)));
connect(reslist, SIGNAL(wordReplace(const QString&, const QString&)),
- sSearch, SLOT(onWordReplace(const QString&, const QString&)));
+ sSearch, SLOT(onWordReplace(const QString&, const QString&)));
connect(reslist, SIGNAL(nextPageAvailable(bool)),
- this, SLOT(enableNextPage(bool)));
+ this, SLOT(enableNextPage(bool)));
connect(reslist, SIGNAL(prevPageAvailable(bool)),
- this, SLOT(enablePrevPage(bool)));
+ this, SLOT(enablePrevPage(bool)));
connect(reslist, SIGNAL(docExpand(Rcl::Doc)),
- this, SLOT(docExpand(Rcl::Doc)));
+ this, SLOT(docExpand(Rcl::Doc)));
connect(reslist, SIGNAL(showSnippets(Rcl::Doc)),
- this, SLOT(showSnippets(Rcl::Doc)));
+ this, SLOT(showSnippets(Rcl::Doc)));
connect(reslist, SIGNAL(showSubDocs(Rcl::Doc)),
- this, SLOT(showSubDocs(Rcl::Doc)));
+ this, SLOT(showSubDocs(Rcl::Doc)));
connect(reslist, SIGNAL(docSaveToFileClicked(Rcl::Doc)),
- this, SLOT(saveDocToFile(Rcl::Doc)));
+ this, SLOT(saveDocToFile(Rcl::Doc)));
connect(reslist, SIGNAL(editRequested(Rcl::Doc)),
- this, SLOT(startNativeViewer(Rcl::Doc)));
+ this, SLOT(startNativeViewer(Rcl::Doc)));
connect(reslist, SIGNAL(openWithRequested(Rcl::Doc, string)),
- this, SLOT(openWith(Rcl::Doc, string)));
+ this, SLOT(openWith(Rcl::Doc, string)));
connect(reslist, SIGNAL(docPreviewClicked(int, Rcl::Doc, int)),
- this, SLOT(startPreview(int, Rcl::Doc, int)));
+ this, SLOT(startPreview(int, Rcl::Doc, int)));
connect(reslist, SIGNAL(previewRequested(Rcl::Doc)),
- this, SLOT(startPreview(Rcl::Doc)));
+ this, SLOT(startPreview(Rcl::Doc)));
setFilterCtlStyle(prefs.filterCtlStyle);
if (prefs.keepSort && prefs.sortActive) {
- m_sortspec.field = (const char *)prefs.sortField.toUtf8();
- m_sortspec.desc = prefs.sortDesc;
- onSortDataChanged(m_sortspec);
- emit sortDataChanged(m_sortspec);
+ m_sortspec.field = (const char *)prefs.sortField.toUtf8();
+ m_sortspec.desc = prefs.sortDesc;
+ onSortDataChanged(m_sortspec);
+ emit sortDataChanged(m_sortspec);
}
enableTrayIcon(prefs.showTrayIcon);
@@ -524,32 +526,32 @@ void RclMain::initDbOpen()
bool maindberror;
if (!maybeOpenDb(reason, true, &maindberror)) {
nodb = true;
- if (maindberror) {
- FirstIdxDialog fidia(this);
- connect(fidia.idxconfCLB, SIGNAL(clicked()),
- this, SLOT(execIndexConfig()));
- connect(fidia.idxschedCLB, SIGNAL(clicked()),
- this, SLOT(execIndexSched()));
- connect(fidia.runidxPB, SIGNAL(clicked()),
- this, SLOT(rebuildIndex()));
- fidia.exec();
- // Don't open adv search or run cmd line search in this case.
- return;
- } else {
- QMessageBox::warning(0, "Recoll",
- tr("Could not open external index. Db not open. Check external indexes list."));
- }
+ if (maindberror) {
+ FirstIdxDialog fidia(this);
+ connect(fidia.idxconfCLB, SIGNAL(clicked()),
+ this, SLOT(execIndexConfig()));
+ connect(fidia.idxschedCLB, SIGNAL(clicked()),
+ this, SLOT(execIndexSched()));
+ connect(fidia.runidxPB, SIGNAL(clicked()),
+ this, SLOT(rebuildIndex()));
+ fidia.exec();
+ // Don't open adv search or run cmd line search in this case.
+ return;
+ } else {
+ QMessageBox::warning(0, "Recoll",
+ tr("Could not open external index. Db not open. Check external indexes list."));
+ }
}
if (prefs.startWithAdvSearchOpen)
- showAdvSearchDialog();
+ showAdvSearchDialog();
// If we have something in the search entry, it comes from a
// command line argument
if (!nodb && sSearch->hasSearchString())
- QTimer::singleShot(0, sSearch, SLOT(startSimpleSearch()));
+ QTimer::singleShot(0, sSearch, SLOT(startSimpleSearch()));
if (!m_urltoview.isEmpty())
- viewUrl();
+ viewUrl();
}
void RclMain::setStemLang(QAction *id)
@@ -559,17 +561,17 @@ void RclMain::setStemLang(QAction *id)
// (might also be "show prefs" etc.
bool isLangId = false;
for (map::const_iterator it = m_stemLangToId.begin();
- it != m_stemLangToId.end(); it++) {
- if (id == it->second)
- isLangId = true;
+ it != m_stemLangToId.end(); it++) {
+ if (id == it->second)
+ isLangId = true;
}
if (!isLangId)
- return;
+ return;
// Set the "checked" item state for lang entries
for (map::const_iterator it = m_stemLangToId.begin();
- it != m_stemLangToId.end(); it++) {
- (it->second)->setChecked(false);
+ it != m_stemLangToId.end(); it++) {
+ (it->second)->setChecked(false);
}
id->setChecked(true);
@@ -577,11 +579,11 @@ void RclMain::setStemLang(QAction *id)
// notify that we changed
QString lang;
if (id == m_idNoStem) {
- lang = "";
+ lang = "";
} else if (id == m_idAllStem) {
- lang = "ALL";
+ lang = "ALL";
} else {
- lang = id->text();
+ lang = id->text();
}
prefs.queryStemLang = lang;
LOGDEB("RclMain::setStemLang(" << id << "): lang [" <<
@@ -596,18 +598,18 @@ void RclMain::setStemLang(const QString& lang)
LOGDEB("RclMain::setStemLang(" << qs2utf8s(lang) << ")\n");
QAction *id;
if (lang == "") {
- id = m_idNoStem;
+ id = m_idNoStem;
} else if (lang == "ALL") {
- id = m_idAllStem;
+ id = m_idAllStem;
} else {
- map::iterator it = m_stemLangToId.find(lang);
- if (it == m_stemLangToId.end())
- return;
- id = it->second;
+ map::iterator it = m_stemLangToId.find(lang);
+ if (it == m_stemLangToId.end())
+ return;
+ id = it->second;
}
for (map::const_iterator it = m_stemLangToId.begin();
- it != m_stemLangToId.end(); it++) {
- (it->second)->setChecked(false);
+ it != m_stemLangToId.end(); it++) {
+ (it->second)->setChecked(false);
}
id->setChecked(true);
}
@@ -669,7 +671,7 @@ void RclMain::fileExit()
restable->saveColState();
if (prefs.ssearchTypSav) {
- prefs.ssearchTyp = sSearch->searchTypCMB->currentIndex();
+ prefs.ssearchTyp = sSearch->searchTypCMB->currentIndex();
}
rwSettings(true);
@@ -689,8 +691,8 @@ void RclMain::startSearch(std::shared_ptr sdata, bool issimple)
LOGDEB("RclMain::startSearch. Indexing " << (m_idxproc?"on":"off") <<
" Active " << m_queryActive << "\n");
if (m_queryActive) {
- LOGDEB("startSearch: already active\n");
- return;
+ LOGDEB("startSearch: already active\n");
+ return;
}
m_queryActive = true;
restable->setEnabled(false);
@@ -702,10 +704,10 @@ void RclMain::startSearch(std::shared_ptr sdata, bool issimple)
string reason;
// If indexing is being performed, we reopen the db at each query.
if (!maybeOpenDb(reason, m_idxproc != 0)) {
- QMessageBox::critical(0, "Recoll", QString(reason.c_str()));
- m_queryActive = false;
+ QMessageBox::critical(0, "Recoll", QString(reason.c_str()));
+ m_queryActive = false;
restable->setEnabled(true);
- return;
+ return;
}
if (prefs.synFileEnable && !prefs.synFile.isEmpty()) {
@@ -724,8 +726,8 @@ void RclMain::startSearch(std::shared_ptr sdata, bool issimple)
curPreview = 0;
DocSequenceDb *src =
- new DocSequenceDb(rcldb, std::shared_ptr(query),
- string(tr("Query results").toUtf8()), sdata);
+ new DocSequenceDb(rcldb, std::shared_ptr(query),
+ string(tr("Query results").toUtf8()), sdata);
src->setAbstractParams(prefs.queryBuildAbstract,
prefs.queryReplaceAbstract);
m_source = std::shared_ptr(src);
@@ -739,15 +741,15 @@ void RclMain::startSearch(std::shared_ptr sdata, bool issimple)
class QueryThread : public QThread {
std::shared_ptr m_source;
- public:
+public:
QueryThread(std::shared_ptr source)
- : m_source(source)
+ : m_source(source)
{
}
~QueryThread() { }
virtual void run()
{
- cnt = m_source->getResCnt();
+ cnt = m_source->getResCnt();
}
int cnt;
};
@@ -755,7 +757,7 @@ class QueryThread : public QThread {
void RclMain::initiateQuery()
{
if (!m_source)
- return;
+ return;
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
QueryThread qthr(m_source);
@@ -763,8 +765,8 @@ void RclMain::initiateQuery()
QProgressDialog progress(this);
progress.setLabelText(tr("Query in progress.
"
- "Due to limitations of the indexing library,
"
- "cancelling will exit the program"));
+ "Due to limitations of the indexing library,
"
+ "cancelling will exit the program"));
progress.setWindowModality(Qt::WindowModal);
progress.setRange(0,0);
@@ -774,29 +776,29 @@ void RclMain::initiateQuery()
// progress.setMinimumDuration(2000);
// Also the multiple processEvents() seem to improve the responsiveness??
for (int i = 0;;i++) {
- qApp->processEvents();
- if (qthr.wait(100)) {
- break;
- }
- if (i == 20)
- progress.show();
- qApp->processEvents();
- if (progress.wasCanceled()) {
- // Just get out of there asap.
- exit(1);
- }
+ qApp->processEvents();
+ if (qthr.wait(100)) {
+ break;
+ }
+ if (i == 20)
+ progress.show();
+ qApp->processEvents();
+ if (progress.wasCanceled()) {
+ // Just get out of there asap.
+ exit(1);
+ }
- qApp->processEvents();
+ qApp->processEvents();
}
int cnt = qthr.cnt;
QString msg;
if (cnt > 0) {
- QString str;
- msg = tr("Result count (est.)") + ": " +
- str.setNum(cnt);
+ QString str;
+ msg = tr("Result count (est.)") + ": " +
+ str.setNum(cnt);
} else {
- msg = tr("No results found");
+ msg = tr("No results found");
}
statusBar()->showMessage(msg, 0);
@@ -815,28 +817,28 @@ void RclMain::resetSearch()
void RclMain::onSortCtlChanged()
{
if (m_sortspecnochange)
- return;
+ return;
LOGDEB("RclMain::onSortCtlChanged()\n");
m_sortspec.reset();
if (actionSortByDateAsc->isChecked()) {
- m_sortspec.field = "mtime";
- m_sortspec.desc = false;
- prefs.sortActive = true;
- prefs.sortDesc = false;
- prefs.sortField = "mtime";
+ m_sortspec.field = "mtime";
+ m_sortspec.desc = false;
+ prefs.sortActive = true;
+ prefs.sortDesc = false;
+ prefs.sortField = "mtime";
} else if (actionSortByDateDesc->isChecked()) {
- m_sortspec.field = "mtime";
- m_sortspec.desc = true;
- prefs.sortActive = true;
- prefs.sortDesc = true;
- prefs.sortField = "mtime";
+ m_sortspec.field = "mtime";
+ m_sortspec.desc = true;
+ prefs.sortActive = true;
+ prefs.sortDesc = true;
+ prefs.sortField = "mtime";
} else {
- prefs.sortActive = prefs.sortDesc = false;
- prefs.sortField = "";
+ prefs.sortActive = prefs.sortDesc = false;
+ prefs.sortField = "";
}
if (m_source)
- m_source->setSortSpec(m_sortspec);
+ m_source->setSortSpec(m_sortspec);
emit sortDataChanged(m_sortspec);
initiateQuery();
}
@@ -846,15 +848,15 @@ void RclMain::onSortDataChanged(DocSeqSortSpec spec)
LOGDEB("RclMain::onSortDataChanged\n");
m_sortspecnochange = true;
if (spec.field.compare("mtime")) {
- actionSortByDateDesc->setChecked(false);
- actionSortByDateAsc->setChecked(false);
+ actionSortByDateDesc->setChecked(false);
+ actionSortByDateAsc->setChecked(false);
} else {
- actionSortByDateDesc->setChecked(spec.desc);
- actionSortByDateAsc->setChecked(!spec.desc);
+ actionSortByDateDesc->setChecked(spec.desc);
+ actionSortByDateAsc->setChecked(!spec.desc);
}
m_sortspecnochange = false;
if (m_source)
- m_source->setSortSpec(spec);
+ m_source->setSortSpec(spec);
m_sortspec = spec;
prefs.sortField = QString::fromUtf8(spec.field.c_str());
@@ -874,21 +876,21 @@ void RclMain::on_actionShowResultsAsTable_toggled(bool on)
actionSaveResultsAsCSV->setEnabled(on);
static QShortcut tablefocseq(QKeySequence("Ctrl+r"), this);
if (!on) {
- int docnum = restable->getDetailDocNumOrTopRow();
- if (docnum >= 0) {
+ int docnum = restable->getDetailDocNumOrTopRow();
+ if (docnum >= 0) {
reslist->resultPageFor(docnum);
}
disconnect(&tablefocseq, SIGNAL(activated()),
restable, SLOT(takeFocus()));
sSearch->takeFocus();
} else {
- int docnum = reslist->pageFirstDocNum();
- if (docnum >= 0) {
- restable->makeRowVisible(docnum);
- }
- nextPageAction->setEnabled(false);
- prevPageAction->setEnabled(false);
- firstPageAction->setEnabled(false);
+ int docnum = reslist->pageFirstDocNum();
+ if (docnum >= 0) {
+ restable->makeRowVisible(docnum);
+ }
+ nextPageAction->setEnabled(false);
+ prevPageAction->setEnabled(false);
+ firstPageAction->setEnabled(false);
connect(&tablefocseq, SIGNAL(activated()),
restable, SLOT(takeFocus()));
}
@@ -898,11 +900,11 @@ void RclMain::on_actionSortByDateAsc_toggled(bool on)
{
LOGDEB("RclMain::on_actionSortByDateAsc_toggled(" << on << ")\n");
if (on) {
- if (actionSortByDateDesc->isChecked()) {
- actionSortByDateDesc->setChecked(false);
- // Let our buddy work.
- return;
- }
+ if (actionSortByDateDesc->isChecked()) {
+ actionSortByDateDesc->setChecked(false);
+ // Let our buddy work.
+ return;
+ }
}
onSortCtlChanged();
}
@@ -911,11 +913,11 @@ void RclMain::on_actionSortByDateDesc_toggled(bool on)
{
LOGDEB("RclMain::on_actionSortByDateDesc_toggled(" << on << ")\n");
if (on) {
- if (actionSortByDateAsc->isChecked()) {
- actionSortByDateAsc->setChecked(false);
- // Let our buddy work.
- return;
- }
+ if (actionSortByDateAsc->isChecked()) {
+ actionSortByDateAsc->setChecked(false);
+ // Let our buddy work.
+ return;
+ }
}
onSortCtlChanged();
}
@@ -923,17 +925,17 @@ void RclMain::on_actionSortByDateDesc_toggled(bool on)
void RclMain::saveDocToFile(Rcl::Doc doc)
{
QString s =
- QFileDialog::getSaveFileName(this, //parent
- tr("Save file"),
- QString::fromLocal8Bit(path_home().c_str())
- );
+ QFileDialog::getSaveFileName(this, //parent
+ tr("Save file"),
+ QString::fromLocal8Bit(path_home().c_str())
+ );
string tofile((const char *)s.toLocal8Bit());
TempFile temp; // not used because tofile is set.
if (!FileInterner::idocToFile(temp, tofile, theconfig, doc)) {
- QMessageBox::warning(0, "Recoll",
- tr("Cannot extract document or create "
- "temporary file"));
- return;
+ QMessageBox::warning(0, "Recoll",
+ tr("Cannot extract document or create "
+ "temporary file"));
+ return;
}
}
@@ -942,20 +944,20 @@ void RclMain::showSubDocs(Rcl::Doc doc)
LOGDEB("RclMain::showSubDocs\n");
string reason;
if (!maybeOpenDb(reason)) {
- QMessageBox::critical(0, "Recoll", QString(reason.c_str()));
- return;
+ QMessageBox::critical(0, "Recoll", QString(reason.c_str()));
+ return;
}
vector docs;
if (!rcldb->getSubDocs(doc, docs)) {
- QMessageBox::warning(0, "Recoll", QString("Can't get subdocs"));
- return;
- }
+ QMessageBox::warning(0, "Recoll", QString("Can't get subdocs"));
+ return;
+ }
DocSequenceDocs *src =
- new DocSequenceDocs(rcldb, docs,
- qs2utf8s(tr("Sub-documents and attachments")));
+ new DocSequenceDocs(rcldb, docs,
+ qs2utf8s(tr("Sub-documents and attachments")));
src->setDescription(qs2utf8s(tr("Sub-documents and attachments")));
std::shared_ptr
- source(new DocSource(theconfig, std::shared_ptr(src)));
+ source(new DocSource(theconfig, std::shared_ptr(src)));
ResTable *res = new ResTable();
res->setRclMain(this, false);
@@ -970,20 +972,20 @@ void RclMain::docExpand(Rcl::Doc doc)
{
LOGDEB("RclMain::docExpand()\n");
if (!rcldb)
- return;
+ return;
list terms;
terms = m_source->expand(doc);
if (terms.empty()) {
- LOGDEB("RclMain::docExpand: no terms\n");
- return;
+ LOGDEB("RclMain::docExpand: no terms\n");
+ return;
}
// Do we keep the original query. I think we'd better not.
// rcldb->expand is set to keep the original query terms instead.
QString text;// = sSearch->queryText->currentText();
for (list::iterator it = terms.begin(); it != terms.end(); it++) {
- text += QString::fromLatin1(" \"") +
- QString::fromUtf8((*it).c_str()) + QString::fromLatin1("\"");
+ text += QString::fromLatin1(" \"") +
+ QString::fromUtf8((*it).c_str()) + QString::fromLatin1("\"");
}
// We need to insert item here, its not auto-done like when the user types
// CR
@@ -1000,21 +1002,23 @@ void RclMain::showDocHistory()
string reason;
if (!maybeOpenDb(reason)) {
- QMessageBox::critical(0, "Recoll", QString(reason.c_str()));
- return;
+ QMessageBox::critical(0, "Recoll", QString(reason.c_str()));
+ return;
}
// Construct a bogus SearchData structure
std::shared_ptrsearchdata =
- std::shared_ptr(new Rcl::SearchData(Rcl::SCLT_AND, cstr_null));
+ std::shared_ptr(new Rcl::SearchData(Rcl::SCLT_AND,
+ cstr_null));
searchdata->setDescription((const char *)tr("History data").toUtf8());
// If you change the title, also change it in eraseDocHistory()
DocSequenceHistory *src =
- new DocSequenceHistory(rcldb, g_dynconf,
- string(tr("Document history").toUtf8()));
+ new DocSequenceHistory(rcldb, g_dynconf,
+ string(tr("Document history").toUtf8()));
src->setDescription((const char *)tr("History data").toUtf8());
- DocSource *source = new DocSource(theconfig, std::shared_ptr(src));
+ DocSource *source = new DocSource(theconfig,
+ std::shared_ptr(src));
m_source = std::shared_ptr(source);
m_source->setSortSpec(m_sortspec);
m_source->setFiltSpec(m_filtspec);
@@ -1028,27 +1032,59 @@ void RclMain::eraseDocHistory()
{
// Clear file storage
if (g_dynconf)
- g_dynconf->eraseAll(docHistSubKey);
+ g_dynconf->eraseAll(docHistSubKey);
// Clear possibly displayed history
if (reslist->displayingHistory()) {
- showDocHistory();
+ showDocHistory();
}
}
void RclMain::eraseSearchHistory()
{
- prefs.ssearchHistory.clear();
- if (sSearch)
- sSearch->clearAll();
- if (g_advshistory)
- g_advshistory->clear();
+ int rep = QMessageBox::warning(
+ 0, tr("Confirm"),
+ tr("Erasing simple and advanced search history lists, "
+ "please click Ok to confirm"),
+ QMessageBox::Ok, QMessageBox::Cancel, QMessageBox::NoButton);
+ if (rep == QMessageBox::Ok) {
+ prefs.ssearchHistory.clear();
+ if (sSearch)
+ sSearch->clearAll();
+ if (g_advshistory)
+ g_advshistory->clear();
+ }
+}
+
+void RclMain::exportSimpleSearchHistory()
+{
+ QFileDialog dialog(0, "Saving simple search history");
+ dialog.setFileMode(QFileDialog::AnyFile);
+ dialog.setAcceptMode(QFileDialog::AcceptSave);
+ dialog.setViewMode(QFileDialog::List);
+ QFlags flags = QDir::NoDotAndDotDot|QDir::Files;
+ dialog.setFilter(flags);
+ if (dialog.exec() != QDialog::Accepted) {
+ return;
+ }
+ string path = qs2utf8s(dialog.selectedFiles().value(0));
+ LOGDEB("Chosen path: " << path << "\n");
+ FILE *fp = fopen(path.c_str(), "wb");
+ if (fp == 0) {
+ QMessageBox::warning(0, "Recoll",
+ tr("Could not open/create file"));
+ return;
+ }
+ for (int i = 0; i < prefs.ssearchHistory.count(); i++) {
+ fprintf(fp, "%s\n", qs2utf8s(prefs.ssearchHistory[i]).c_str());
+ }
+ fclose(fp);
}
// Called when the uiprefs dialog is ok'd
void RclMain::setUIPrefs()
{
if (!uiprefs)
- return;
+ return;
LOGDEB("Recollmain::setUIPrefs\n");
reslist->setFont();
sSearch->setPrefs();
@@ -1059,14 +1095,14 @@ void RclMain::setUIPrefs()
void RclMain::enableNextPage(bool yesno)
{
if (!displayingTable)
- nextPageAction->setEnabled(yesno);
+ nextPageAction->setEnabled(yesno);
}
void RclMain::enablePrevPage(bool yesno)
{
if (!displayingTable) {
- prevPageAction->setEnabled(yesno);
- firstPageAction->setEnabled(yesno);
+ prevPageAction->setEnabled(yesno);
+ firstPageAction->setEnabled(yesno);
}
}
@@ -1078,7 +1114,7 @@ void RclMain::onSetDescription(QString desc)
QString RclMain::getQueryDescription()
{
if (!m_source)
- return "";
+ return "";
return m_queryDescription.isEmpty() ?
u8s2qs(m_source->getDescription()) : m_queryDescription;
}
@@ -1095,7 +1131,7 @@ void RclMain::catgFilter(int id)
{
LOGDEB("RclMain::catgFilter: id " << id << "\n");
if (id < 0 || id >= int(m_catgbutvec.size()))
- return;
+ return;
switch (prefs.filterCtlStyle) {
case PrefsPack::FCS_MN:
@@ -1122,10 +1158,10 @@ void RclMain::setFiltSpec()
// "Category" buttons
if (m_catgbutvecidx != 0) {
- string catg = m_catgbutvec[m_catgbutvecidx];
- string frag;
- theconfig->getGuiFilter(catg, frag);
- m_filtspec.orCrit(DocSeqFiltSpec::DSFS_QLANG, frag);
+ string catg = m_catgbutvec[m_catgbutvecidx];
+ string frag;
+ theconfig->getGuiFilter(catg, frag);
+ m_filtspec.orCrit(DocSeqFiltSpec::DSFS_QLANG, frag);
}
// Fragments from the fragbuts buttonbox tool
@@ -1139,7 +1175,7 @@ void RclMain::setFiltSpec()
}
if (m_source)
- m_source->setFiltSpec(m_filtspec);
+ m_source->setFiltSpec(m_filtspec);
initiateQuery();
}
diff --git a/src/qtgui/rclmain_w.h b/src/qtgui/rclmain_w.h
index 3b163583..df9235cc 100644
--- a/src/qtgui/rclmain_w.h
+++ b/src/qtgui/rclmain_w.h
@@ -139,6 +139,7 @@ public slots:
virtual void resetSearch();
virtual void eraseDocHistory();
virtual void eraseSearchHistory();
+ virtual void exportSimpleSearchHistory();
virtual void saveLastQuery();
virtual void loadSavedQuery();
virtual void setStemLang(QAction *id);