fragbuts sort of working

This commit is contained in:
Jean-Francois Dockes 2014-12-10 18:56:43 +01:00
parent 18a1c66fbc
commit a0af5d1260
4 changed files with 94 additions and 18 deletions

View file

@ -18,6 +18,7 @@
#include "autoconfig.h" #include "autoconfig.h"
#include <string> #include <string>
#include <vector>
#include <QtGui/QHBoxLayout> #include <QtGui/QHBoxLayout>
#include <QtGui/QVBoxLayout> #include <QtGui/QVBoxLayout>
@ -34,11 +35,13 @@
#include "readfile.h" #include "readfile.h"
using namespace std; using namespace std;
class FragButsParser : public QXmlDefaultHandler { class FragButsParser : public QXmlDefaultHandler {
public: public:
FragButsParser(QWidget *_parent) FragButsParser(FragButs *_parent, vector<FragButs::ButFrag>& _buttons)
: parent(_parent), vlw(new QVBoxLayout(parent)), : parent(_parent), vlw(new QVBoxLayout(parent)),
vl(new QVBoxLayout()), hl(0), bg(0), radio(false) vl(new QVBoxLayout()), buttons(_buttons),
hl(0), bg(0), radio(false)
{ {
} }
@ -59,20 +62,21 @@ private:
QWidget *parent; QWidget *parent;
QVBoxLayout *vlw; QVBoxLayout *vlw;
QVBoxLayout *vl; QVBoxLayout *vl;
vector<FragButs::ButFrag>& buttons;
// Temporary data while parsing. // Temporary data while parsing.
QHBoxLayout *hl; QHBoxLayout *hl;
QButtonGroup *bg; QButtonGroup *bg;
QString currentText; QString currentText;
QString label; QString label;
QString frag; string frag;
bool radio; bool radio;
}; };
bool FragButsParser::startElement(const QString & /* namespaceURI */, bool FragButsParser::startElement(const QString & /* namespaceURI */,
const QString & /* localName */, const QString & /* localName */,
const QString &qName, const QString &qName,
const QXmlAttributes &attributes) const QXmlAttributes &/*attributes*/)
{ {
currentText = ""; currentText = "";
if (qName == "buttons") { if (qName == "buttons") {
@ -93,21 +97,24 @@ bool FragButsParser::endElement(const QString & /* namespaceURI */,
if (qName == "label") { if (qName == "label") {
label = currentText; label = currentText;
} else if (qName == "frag") { } else if (qName == "frag") {
frag = currentText; frag = qs2utf8s(currentText);
} else if (qName == "fragbut") { } else if (qName == "fragbut") {
string slab = qs2utf8s(label); string slab = qs2utf8s(label);
trimstring(slab, " \t\n\t"); trimstring(slab, " \t\n\t");
label = QString::fromUtf8(slab.c_str()); label = QString::fromUtf8(slab.c_str());
QAbstractButton *abut;
if (radio) { if (radio) {
QRadioButton *but = new QRadioButton(label, parent); QRadioButton *but = new QRadioButton(label, parent);
bg->addButton(but); bg->addButton(but);
if (bg->buttons().length() == 1) if (bg->buttons().length() == 1)
but->setChecked(true); but->setChecked(true);
hl->addWidget(but); abut = but;
} else { } else {
QCheckBox *but = new QCheckBox(label, parent); QCheckBox *but = new QCheckBox(label, parent);
hl->addWidget(but); abut = but;
} }
buttons.push_back(FragButs::ButFrag(abut, frag));
hl->addWidget(abut);
} else if (qName == "buttons" || qName == "radiobuttons") { } else if (qName == "buttons" || qName == "radiobuttons") {
vl->addLayout(hl); vl->addLayout(hl);
hl = 0; hl = 0;
@ -128,7 +135,7 @@ FragButs::FragButs(QWidget* parent)
return; return;
} }
FragButsParser parser(this); FragButsParser parser(this, m_buttons);
QXmlSimpleReader reader; QXmlSimpleReader reader;
reader.setContentHandler(&parser); reader.setContentHandler(&parser);
reader.setErrorHandler(&parser); reader.setErrorHandler(&parser);
@ -138,8 +145,30 @@ FragButs::FragButs(QWidget* parent)
LOGERR(("FragButs:: parse failed for [%s]\n", conf.c_str())); LOGERR(("FragButs:: parse failed for [%s]\n", conf.c_str()));
return; return;
} }
for (vector<ButFrag>::iterator it = m_buttons.begin();
it != m_buttons.end(); it++) {
connect(it->button, SIGNAL(clicked(bool)),
this, SLOT(onButtonClicked(bool)));
}
} }
FragButs::~FragButs() FragButs::~FragButs()
{ {
} }
void FragButs::onButtonClicked(bool on)
{
LOGDEB(("FragButs::onButtonClicked: [%d]\n", int(on)));
emit fragmentsChanged();
}
void FragButs::getfrags(std::vector<std::string>& frags)
{
for (vector<ButFrag>::iterator it = m_buttons.begin();
it != m_buttons.end(); it++) {
if (it->button->isChecked() && !it->fragment.empty()) {
LOGDEB(("FragButs: fragment [%s]\n", it->fragment.c_str()));
frags.push_back(it->fragment);
}
}
}

View file

@ -17,8 +17,13 @@
#ifndef _FRAGBUTS_H_INCLUDED_ #ifndef _FRAGBUTS_H_INCLUDED_
#define _FRAGBUTS_H_INCLUDED_ #define _FRAGBUTS_H_INCLUDED_
#include <string>
#include <vector>
#include <QWidget> #include <QWidget>
class QAbstractButton;
/* /*
* Display a series of user-defined buttons which activate query * Display a series of user-defined buttons which activate query
* language fragments to augment the current search * language fragments to augment the current search
@ -32,13 +37,26 @@ class FragButs : public QWidget
FragButs(QWidget* parent = 0); FragButs(QWidget* parent = 0);
virtual ~FragButs(); virtual ~FragButs();
public slots: struct ButFrag {
QAbstractButton *button;
std::string fragment;
ButFrag(QAbstractButton *but, const std::string& frag)
: button(but), fragment(frag) {
}
};
void getfrags(std::vector<std::string>&);
private slots:
void onButtonClicked(bool);
signals: signals:
void fragmentsChanged();
private: private:
// Detect source file change // Detect source file change
time_t m_reftime; time_t m_reftime;
std::vector<ButFrag> m_buttons;
}; };

View file

@ -1059,6 +1059,8 @@ void RclMain::showFragButs()
if (fragbuts == 0) { if (fragbuts == 0) {
fragbuts = new FragButs(0); fragbuts = new FragButs(0);
fragbuts->show(); fragbuts->show();
connect(fragbuts, SIGNAL(fragmentsChanged()),
this, SLOT(onFragmentsChanged()));
} else { } else {
// Close and reopen, in hope that makes us visible... // Close and reopen, in hope that makes us visible...
fragbuts->close(); fragbuts->close();
@ -2248,20 +2250,43 @@ void RclMain::catgFilter(int id)
m_filtMN->actions()[id]->setChecked(true); m_filtMN->actions()[id]->setChecked(true);
} }
m_catgbutvecidx = id;
setFiltSpec();
}
void RclMain::setFiltSpec()
{
m_filtspec.reset(); m_filtspec.reset();
if (id != 0) { // "Category" buttons
string catg = m_catgbutvec[id]; if (m_catgbutvecidx != 0) {
string catg = m_catgbutvec[m_catgbutvecidx];
string frag; string frag;
theconfig->getGuiFilter(catg, frag); theconfig->getGuiFilter(catg, frag);
m_filtspec.orCrit(DocSeqFiltSpec::DSFS_QLANG, frag); m_filtspec.orCrit(DocSeqFiltSpec::DSFS_QLANG, frag);
} }
LOGDEB(("RclMain::catgFilter: calling setFiltSpec\n"));
// Fragments from the fragbuts buttonbox tool
if (fragbuts) {
vector<string> frags;
fragbuts->getfrags(frags);
for (vector<string>::const_iterator it = frags.begin();
it != frags.end(); it++) {
m_filtspec.orCrit(DocSeqFiltSpec::DSFS_QLANG, *it);
}
}
if (m_source.isNotNull()) if (m_source.isNotNull())
m_source->setFiltSpec(m_filtspec); m_source->setFiltSpec(m_filtspec);
initiateQuery(); initiateQuery();
} }
void RclMain::onFragmentsChanged()
{
setFiltSpec();
}
void RclMain::toggleFullScreen() void RclMain::toggleFullScreen()
{ {
if (isFullScreen()) if (isFullScreen())

View file

@ -74,6 +74,7 @@ public:
m_toolsTB(0), m_resTB(0), m_toolsTB(0), m_resTB(0),
m_filtFRM(0), m_filtCMB(0), m_filtBGRP(0), m_filtMN(0), m_filtFRM(0), m_filtCMB(0), m_filtBGRP(0), m_filtMN(0),
m_idxproc(0), m_idxproc(0),
m_catgbutvecidx(0),
m_sortspecnochange(false), m_sortspecnochange(false),
m_indexerState(IXST_RUNNINGNOTMINE), m_indexerState(IXST_RUNNINGNOTMINE),
m_queryActive(false), m_queryActive(false),
@ -151,6 +152,7 @@ public slots:
virtual void adjustPrefsMenu(); virtual void adjustPrefsMenu();
virtual void catgFilter(int); virtual void catgFilter(int);
virtual void catgFilter(QAction *); virtual void catgFilter(QAction *);
virtual void onFragmentsChanged();
virtual void initDbOpen(); virtual void initDbOpen();
virtual void toggleFullScreen(); virtual void toggleFullScreen();
virtual void on_actionSortByDateAsc_toggled(bool on); virtual void on_actionSortByDateAsc_toggled(bool on);
@ -197,6 +199,7 @@ private:
ExecCmd *m_idxproc; // Indexing process ExecCmd *m_idxproc; // Indexing process
map<QString, QAction*> m_stemLangToId; map<QString, QAction*> m_stemLangToId;
vector<string> m_catgbutvec; vector<string> m_catgbutvec;
int m_catgbutvecidx;
DocSeqFiltSpec m_filtspec; DocSeqFiltSpec m_filtspec;
bool m_sortspecnochange; bool m_sortspecnochange;
DocSeqSortSpec m_sortspec; DocSeqSortSpec m_sortspec;
@ -226,6 +229,7 @@ private:
virtual void updateIdxForDocs(vector<Rcl::Doc>&); virtual void updateIdxForDocs(vector<Rcl::Doc>&);
virtual void initiateQuery(); virtual void initiateQuery();
virtual bool containerUpToDate(Rcl::Doc& doc); virtual bool containerUpToDate(Rcl::Doc& doc);
virtual void setFiltSpec();
}; };
#endif // RCLMAIN_W_H #endif // RCLMAIN_W_H