From bd46735d9ce1d77a92b48eeb85a67b2d36b02aa6 Mon Sep 17 00:00:00 2001 From: Jean-Francois Dockes Date: Tue, 27 May 2014 10:49:12 +0200 Subject: [PATCH] allow displaying current doc filter (media/message etc.) as menu --- src/qtgui/guiutils.cpp | 2 +- src/qtgui/guiutils.h | 3 +- src/qtgui/rclmain.ui | 58 +-------------- src/qtgui/rclmain_w.cpp | 160 ++++++++++++++++++++++++++++++++-------- src/qtgui/rclmain_w.h | 16 +++- src/qtgui/uiprefs.ui | 69 ++++++++++++++--- src/qtgui/uiprefs_w.cpp | 25 ++++++- 7 files changed, 227 insertions(+), 106 deletions(-) diff --git a/src/qtgui/guiutils.cpp b/src/qtgui/guiutils.cpp index 6879b3f9..b13b3783 100644 --- a/src/qtgui/guiutils.cpp +++ b/src/qtgui/guiutils.cpp @@ -104,7 +104,7 @@ void rwSettings(bool writing) "/Recoll/prefs/ssearch/noComplete", Bool, false); SETTING_RW(prefs.ssearchAsYouType, "/Recoll/prefs/ssearch/asYouType", Bool, false); - SETTING_RW(prefs.catgToolBar, "/Recoll/prefs/catgToolBar", Bool, false); + SETTING_RW(prefs.filterCtlStyle, "/Recoll/prefs/filterCtlStyle", Int, 0); SETTING_RW(prefs.ssearchAutoPhrase, "/Recoll/prefs/ssearchAutoPhrase", Bool, true); SETTING_RW(prefs.ssearchAutoPhraseThreshPC, diff --git a/src/qtgui/guiutils.h b/src/qtgui/guiutils.h index cacb6c90..2b232e10 100644 --- a/src/qtgui/guiutils.h +++ b/src/qtgui/guiutils.h @@ -45,7 +45,8 @@ class PrefsPack { bool ssearchAsYouType; // Decide if we display the doc category filter control as a // toolbar+combobox or as a button group under simple search - bool catgToolBar; + enum FilterCtlStyle {FCS_BT, FCS_CMB, FCS_MN}; + int filterCtlStyle; int respagesize; int maxhltextmbs; QString reslistfontfamily; diff --git a/src/qtgui/rclmain.ui b/src/qtgui/rclmain.ui index 0ed960cf..5aa6656e 100644 --- a/src/qtgui/rclmain.ui +++ b/src/qtgui/rclmain.ui @@ -46,29 +46,6 @@ - - - - - 0 - 0 - - - - - - 0 - 0 - 45 - 20 - - - - All - - - - @@ -82,46 +59,13 @@ - - - Search tools - - - TopToolBarArea - - - false - - - - - - - - Result list - - - TopToolBarArea - - - false - - - - - - - - - - 0 0 800 - 21 + 25 diff --git a/src/qtgui/rclmain_w.cpp b/src/qtgui/rclmain_w.cpp index d3cfce64..3431b6d5 100644 --- a/src/qtgui/rclmain_w.cpp +++ b/src/qtgui/rclmain_w.cpp @@ -52,6 +52,7 @@ using std::pair; #include #include #include +#include #include "recoll.h" #include "debuglog.h" @@ -156,35 +157,62 @@ void RclMain::init() } curid->setChecked(true); - // Toolbar+combobox version of the category selector - QComboBox *catgCMB = 0; - if (prefs.catgToolBar) { - QToolBar *catgToolBar = new QToolBar(this); - catgCMB = new QComboBox(catgToolBar); - catgCMB->setEditable(FALSE); - catgCMB->addItem(tr("All")); - catgToolBar->setObjectName(QString::fromUtf8("catgToolBar")); - catgCMB->setToolTip(tr("Document category filter")); - catgToolBar->addWidget(catgCMB); - this->addToolBar(Qt::TopToolBarArea, catgToolBar); - } + m_toolsTB = new QToolBar(this); + m_toolsTB->setObjectName(QString::fromUtf8("m_toolsTB")); + m_toolsTB->addAction(toolsAdvanced_SearchAction); + m_toolsTB->addAction(toolsDoc_HistoryAction); + m_toolsTB->addAction(toolsSpellAction); + this->addToolBar(Qt::TopToolBarArea, m_toolsTB); - // Document categories buttons - QHBoxLayout *bgrphbox = new QHBoxLayout(catgBGRP); - QButtonGroup *bgrp = new QButtonGroup(catgBGRP); + m_resTB = new QToolBar(this); + m_resTB->setObjectName(QString::fromUtf8("m_resTB")); + this->addToolBar(Qt::TopToolBarArea, m_resTB); + + // Document filter buttons and combobox + // Combobox version of the document filter control + m_filtCMB = new QComboBox(m_resTB); + m_filtCMB->setEditable(FALSE); + m_filtCMB->addItem(tr("All")); + m_filtCMB->setToolTip(tr("Document filter")); + // Buttons version of the document filter control + m_filtFRM = new QFrame(this); + m_filtFRM->setObjectName(QString::fromUtf8("m_filtFRM")); + QSizePolicy sizePolicy2(QSizePolicy::Preferred, QSizePolicy::Maximum); + sizePolicy2.setHorizontalStretch(0); + sizePolicy2.setVerticalStretch(0); + sizePolicy2.setHeightForWidth(m_filtFRM->sizePolicy().hasHeightForWidth()); + m_filtFRM->setSizePolicy(sizePolicy2); + QHBoxLayout *bgrphbox = new QHBoxLayout(m_filtFRM); + m_filtBGRP = new QButtonGroup(m_filtFRM); + QRadioButton *allRDB = new QRadioButton(m_filtFRM); + verticalLayout->insertWidget(1, m_filtFRM); + allRDB->setObjectName(QString::fromUtf8("allRDB")); + allRDB->setGeometry(QRect(0, 0, 45, 20)); + allRDB->setText(tr("All")); bgrphbox->addWidget(allRDB); int bgrpid = 0; - bgrp->addButton(allRDB, bgrpid++); - connect(bgrp, SIGNAL(buttonClicked(int)), this, SLOT(catgFilter(int))); + m_filtBGRP->addButton(allRDB, bgrpid++); allRDB->setChecked(true); + + // Menu version of the document filter control + m_filtMN = new QMenu(MenuBar); + m_filtMN->setObjectName(QString::fromUtf8("m_filtMN")); + MenuBar->insertMenu(helpMenu->menuAction(), m_filtMN); + m_filtMN->setTitle("F&ilter"); + QActionGroup *fltag = new QActionGroup(this); + fltag->setExclusive(true); + QAction *act = fltag->addAction(tr("All")); + m_filtMN->addAction(act); + act->setCheckable(true); + act->setData((int)0); + + // Go through the filter list and setup buttons and combobox vector cats; theconfig->getGuiFilterNames(cats); - // Text for button 0 is not used. Next statement just avoids unused - // variable compiler warning for catg_strings m_catgbutvec.push_back(catg_strings[0]); for (vector::const_iterator it = cats.begin(); it != cats.end(); it++) { - QRadioButton *but = new QRadioButton(catgBGRP); + 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. @@ -196,15 +224,19 @@ void RclMain::init() but_txt = catgnm.right(catgnm.size()-(colon+1)); } but->setText(tr(but_txt.toUtf8())); - if (prefs.catgToolBar && catgCMB) - catgCMB->addItem(tr(catgnm.toUtf8())); + m_filtCMB->addItem(tr(but_txt.toUtf8())); bgrphbox->addWidget(but); - bgrp->addButton(but, bgrpid++); + m_filtBGRP->addButton(but, bgrpid++); + QAction *act = fltag->addAction(tr(but_txt.toUtf8())); + m_filtMN->addAction(act); + act->setCheckable(true); + act->setData((int)(m_catgbutvec.size()-1)); + m_filtMN->connect(m_filtMN, SIGNAL(triggered(QAction *)), this, + SLOT(catgFilter(QAction *))); } - catgBGRP->setLayout(bgrphbox); - - if (prefs.catgToolBar) - catgBGRP->hide(); + m_filtFRM->setLayout(bgrphbox); + connect(m_filtBGRP, SIGNAL(buttonClicked(int)),this, SLOT(catgFilter(int))); + connect(m_filtCMB, SIGNAL(activated(int)), this, SLOT(catgFilter(int))); sSearch->queryText->installEventFilter(this); @@ -266,9 +298,6 @@ void RclMain::init() connect(extIdxAction, SIGNAL(triggered()), this, SLOT(showExtIdxDialog())); - if (prefs.catgToolBar && catgCMB) - connect(catgCMB, SIGNAL(activated(int)), - this, SLOT(catgFilter(int))); connect(toggleFullScreenAction, SIGNAL(triggered()), this, SLOT(toggleFullScreen())); connect(actionShowQueryDetails, SIGNAL(triggered()), @@ -350,6 +379,8 @@ void RclMain::init() connect(reslist, SIGNAL(previewRequested(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; @@ -370,6 +401,49 @@ void RclMain::resultCount(int n) actionSortByDateDesc->setEnabled(n>0); } +void RclMain::setFilterCtlStyle(int stl) +{ + switch (stl) { + case PrefsPack::FCS_MN: + setupResTB(false); + m_filtFRM->setVisible(false); + m_filtMN->menuAction()->setVisible(true); + break; + case PrefsPack::FCS_CMB: + setupResTB(true); + m_filtFRM->setVisible(false); + m_filtMN->menuAction()->setVisible(false); + break; + case PrefsPack::FCS_BT: + default: + setupResTB(false); + m_filtFRM->setVisible(true); + m_filtMN->menuAction()->setVisible(false); + } +} + +// Set up the "results" toolbox, adding the filter combobox or not depending +// on config option +void RclMain::setupResTB(bool combo) +{ + m_resTB->clear(); + m_resTB->addAction(firstPageAction); + m_resTB->addAction(prevPageAction); + m_resTB->addAction(nextPageAction); + m_resTB->addSeparator(); + m_resTB->addAction(actionSortByDateAsc); + m_resTB->addAction(actionSortByDateDesc); + if (combo) { + m_resTB->addSeparator(); + m_filtCMB->show(); + m_resTB->addWidget(m_filtCMB); + } else { + m_filtCMB->hide(); + } + m_resTB->addSeparator(); + m_resTB->addAction(actionShowResultsAsTable); +} + // This is called by a timer right after we come up. Try to open // the database and talk to the user if we can't void RclMain::initDbOpen() @@ -2080,13 +2154,35 @@ QString RclMain::getQueryDescription() return QString::fromUtf8(m_source->getDescription().c_str()); } -// User pressed a category button: set filter params in reslist +// Set filter, action style +void RclMain::catgFilter(QAction *act) +{ + int id = act->data().toInt(); + catgFilter(id); +} + +// User pressed a filter button: set filter params in reslist void RclMain::catgFilter(int id) { - LOGDEB(("RclMain::catgFilter: id %d\n")); + LOGDEB(("RclMain::catgFilter: id %d\n", id)); if (id < 0 || id >= int(m_catgbutvec.size())) return; + switch (prefs.filterCtlStyle) { + case PrefsPack::FCS_MN: + m_filtCMB->setCurrentIndex(id); + m_filtBGRP->buttons()[id]->setChecked(true); + break; + case PrefsPack::FCS_CMB: + m_filtBGRP->buttons()[id]->setChecked(true); + m_filtMN->actions()[id]->setChecked(true); + break; + case PrefsPack::FCS_BT: + default: + m_filtCMB->setCurrentIndex(id); + m_filtMN->actions()[id]->setChecked(true); + } + m_filtspec.reset(); if (id != 0) { diff --git a/src/qtgui/rclmain_w.h b/src/qtgui/rclmain_w.h index 525e0b00..7424a1af 100644 --- a/src/qtgui/rclmain_w.h +++ b/src/qtgui/rclmain_w.h @@ -31,6 +31,7 @@ #include "spell_w.h" #include "refcntr.h" #include "pathut.h" +#include "guiutils.h" class IdxSchedW; class ExecCmd; @@ -68,6 +69,8 @@ public: displayingTable(0), m_idNoStem(0), m_idAllStem(0), + m_toolsTB(0), m_resTB(0), + m_filtFRM(0), m_filtCMB(0), m_filtBGRP(0), m_filtMN(0), m_idxproc(0), m_sortspecnochange(false), m_indexerState(IXST_RUNNINGNOTMINE), @@ -144,6 +147,7 @@ public slots: virtual void setStemLang(QAction *id); virtual void adjustPrefsMenu(); virtual void catgFilter(int); + virtual void catgFilter(QAction *); virtual void initDbOpen(); virtual void toggleFullScreen(); virtual void on_actionSortByDateAsc_toggled(bool on); @@ -152,6 +156,7 @@ public slots: virtual void onSortDataChanged(DocSeqSortSpec); virtual void resultCount(int); virtual void applyStyleSheet(); + virtual void setFilterCtlStyle(int stl); signals: void docSourceChanged(RefCntr); @@ -175,8 +180,14 @@ private: QTimer *periodictimer; ResTable *restable; bool displayingTable; - QAction *m_idNoStem; - QAction *m_idAllStem; + QAction *m_idNoStem; + QAction *m_idAllStem; + QToolBar *m_toolsTB; + QToolBar *m_resTB; + QFrame *m_filtFRM; + QComboBox *m_filtCMB; + QButtonGroup *m_filtBGRP; + QMenu *m_filtMN; QFileSystemWatcher m_watcher; vector m_viewers; ExecCmd *m_idxproc; // Indexing process @@ -196,6 +207,7 @@ private: QString m_urltoview; virtual void init(); + virtual void setupResTB(bool combo); virtual void previewPrevOrNextInTab(Preview *, int sid, int docnum, bool next); virtual void execViewer(const map& subs, bool istempfile, diff --git a/src/qtgui/uiprefs.ui b/src/qtgui/uiprefs.ui index ec281cf0..7f6dec92 100644 --- a/src/qtgui/uiprefs.ui +++ b/src/qtgui/uiprefs.ui @@ -6,8 +6,8 @@ 0 0 - 531 - 427 + 542 + 449 @@ -149,6 +149,9 @@ <BR> + + buttonGroup + @@ -156,6 +159,9 @@ <PRE> + + buttonGroup + @@ -163,6 +169,9 @@ <PRE> + wrap + + buttonGroup + @@ -175,14 +184,48 @@ - - - Display category filter as toolbar instead of button panel (needs restart). - - - false - - + + + + + Decide if document filters are shown as radio buttons, toolbar combobox, or menu. + + + Document filter choice style: + + + + + + + Buttons Panel + + + buttonGroup_2 + + + + + + + Toolbar Combobox + + + buttonGroup_2 + + + + + + + Menu + + + buttonGroup_2 + + + + @@ -397,7 +440,7 @@ - + Snippets window CSS file @@ -882,4 +925,8 @@ May be slow for big documents. + + + + diff --git a/src/qtgui/uiprefs_w.cpp b/src/qtgui/uiprefs_w.cpp index ef467336..4ba0f6e5 100644 --- a/src/qtgui/uiprefs_w.cpp +++ b/src/qtgui/uiprefs_w.cpp @@ -103,7 +103,20 @@ void UIPrefsDialog::setFromPrefs() pageLenSB->setValue(prefs.respagesize); collapseDupsCB->setChecked(prefs.collapseDuplicates); maxHLTSB->setValue(prefs.maxhltextmbs); - catgToolBarCB->setChecked(prefs.catgToolBar); + + switch (prefs.filterCtlStyle) { + case PrefsPack::FCS_MN: + filterMN_RB->setChecked(1); + break; + case PrefsPack::FCS_CMB: + filterCMB_RB->setChecked(1); + break; + case PrefsPack::FCS_BT: + default: + fprintf(stderr, "filter ctl style %d\n", prefs.filterCtlStyle); + filterBT_RB->setChecked(1); + break; + } ssAutoSpaceCB->setChecked(prefs.ssearchOnWS); ssNoCompleteCB->setChecked(prefs.ssearchNoComplete); ssAutoAllCB->setChecked(prefs.ssearchAsYouType); @@ -224,7 +237,15 @@ void UIPrefsDialog::accept() prefs.ssearchNoComplete = ssNoCompleteCB->isChecked(); prefs.ssearchAsYouType = ssAutoAllCB->isChecked(); - prefs.catgToolBar = catgToolBarCB->isChecked(); + if (filterMN_RB->isChecked()) { + prefs.filterCtlStyle = PrefsPack::FCS_MN; + } else if (filterCMB_RB->isChecked()) { + prefs.filterCtlStyle = PrefsPack::FCS_CMB; + } else { + prefs.filterCtlStyle = PrefsPack::FCS_BT; + } + m_mainWindow->setFilterCtlStyle(prefs.filterCtlStyle); + prefs.respagesize = pageLenSB->value(); prefs.collapseDuplicates = collapseDupsCB->isChecked(); prefs.maxhltextmbs = maxHLTSB->value();