[office/tellico] /: Add option for using regular expressions in the quick filter

Robby Stephenson null at kde.org
Wed Mar 16 01:15:47 GMT 2022


Git commit 9f93fa8921c90119e3d1e0ddd58a3d316c6fba60 by Robby Stephenson.
Committed on 16/03/2022 at 01:15.
Pushed by rstephenson into branch 'master'.

Add option for using regular expressions in the quick filter

BUG: 450018
FIXED-IN: 3.5

M  +4    -0    ChangeLog
M  +2    -1    doc/configuration.docbook
M  +3    -0    src/config/tellico_config.kcfg
M  +8    -0    src/configdialog.cpp
M  +1    -0    src/configdialog.h
M  +2    -2    src/filter.cpp
M  +1    -1    src/filter.h
M  +1    -1    src/mainwindow.cpp
M  +13   -1    src/tests/filtertest.cpp

https://invent.kde.org/office/tellico/commit/9f93fa8921c90119e3d1e0ddd58a3d316c6fba60

diff --git a/ChangeLog b/ChangeLog
index e6365f2d..87785153 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2022-03-15  Robby Stephenson  <robby at periapsis.org>
+
+	* Added option for using regular expressions in quick filter (Bug 450517).
+
 2022-03-13  Robby Stephenson  <robby at periapsis.org>
 
 	* Added data source for arcade-history.com (Bug 450058).
diff --git a/doc/configuration.docbook b/doc/configuration.docbook
index 748036be..450ecda4 100644
--- a/doc/configuration.docbook
+++ b/doc/configuration.docbook
@@ -37,7 +37,8 @@ in the data files, or saved separately in the &appname; application folder. Also
 is started, it can automatically reopen the last data file that was open. The
 <guilabel>Tip of the Day</guilabel> dialog contains helpful hints on using &appname;
 and appears at program startup. You may want to read through some of the hints and
-then disable the dialog.
+then disable the dialog. The <interface>Quick Filter</interface> in the toolbar is useful
+for easily filtering through your collection and can utilize regular expressions.
 </para>
 
 <para>
diff --git a/src/config/tellico_config.kcfg b/src/config/tellico_config.kcfg
index c50bd76c..46f0cc96 100644
--- a/src/config/tellico_config.kcfg
+++ b/src/config/tellico_config.kcfg
@@ -109,6 +109,9 @@
     <entry key="Enable Webcam" type="Bool">
         <default>true</default>
     </entry>
+    <entry key="Quick Filter RegExp" type="Bool">
+        <default>false</default>
+    </entry>
 </group>
 
 <group name="Printing">
diff --git a/src/configdialog.cpp b/src/configdialog.cpp
index a47404cf..21db01cf 100644
--- a/src/configdialog.cpp
+++ b/src/configdialog.cpp
@@ -215,6 +215,12 @@ void ConfigDialog::initGeneralPage(QFrame* frame) {
   l->addWidget(m_cbOpenLastFile);
   connect(m_cbOpenLastFile, &QAbstractButton::clicked, this, &ConfigDialog::slotModified);
 
+  m_cbQuickFilterRegExp = new QCheckBox(i18n("&Enable regular expressions in quick filter"), frame);
+  m_cbQuickFilterRegExp->setWhatsThis(i18n("If checked, the quick filter will "
+                                           "interpret text as a regular expression."));
+  l->addWidget(m_cbQuickFilterRegExp);
+  connect(m_cbQuickFilterRegExp, &QAbstractButton::clicked, this, &ConfigDialog::slotModified);
+
   m_cbShowTipDay = new QCheckBox(i18n("&Show \"Tip of the Day\" at startup"), frame);
   m_cbShowTipDay->setWhatsThis(i18n("If checked, the \"Tip of the Day\" will be "
                                     "shown at program start-up."));
@@ -683,6 +689,7 @@ void ConfigDialog::readGeneralConfig() {
   m_modifying = true;
 
   m_cbShowTipDay->setChecked(Config::showTipOfDay());
+  m_cbQuickFilterRegExp->setChecked(Config::quickFilterRegExp());
   m_cbOpenLastFile->setChecked(Config::reopenLastFile());
 #ifdef ENABLE_WEBCAM
   m_cbEnableWebcam->setChecked(Config::enableWebcam());
@@ -781,6 +788,7 @@ void ConfigDialog::saveConfiguration() {
 
 void ConfigDialog::saveGeneralConfig() {
   Config::setShowTipOfDay(m_cbShowTipDay->isChecked());
+  Config::setQuickFilterRegExp(m_cbQuickFilterRegExp->isChecked());
   Config::setEnableWebcam(m_cbEnableWebcam->isChecked());
 
   int imageLocation;
diff --git a/src/configdialog.h b/src/configdialog.h
index 3776d02e..9c8ed175 100644
--- a/src/configdialog.h
+++ b/src/configdialog.h
@@ -171,6 +171,7 @@ private:
   QRadioButton* m_rbImageInAppDir;
   QRadioButton* m_rbImageInLocalDir;
   QCheckBox* m_cbOpenLastFile;
+  QCheckBox* m_cbQuickFilterRegExp;
   QCheckBox* m_cbShowTipDay;
   QCheckBox* m_cbEnableWebcam;
   QCheckBox* m_cbCapitalize;
diff --git a/src/filter.cpp b/src/filter.cpp
index 8f8c0d72..f3f4bc6c 100644
--- a/src/filter.cpp
+++ b/src/filter.cpp
@@ -317,14 +317,14 @@ bool Filter::operator==(const Filter& other) const {
          *static_cast<const QList<FilterRule*>*>(this) == static_cast<const QList<FilterRule*>&>(other);
 }
 
-void Filter::populateQuickFilter(FilterPtr filter_, const QString& fieldName_, const QString& text_) {
+void Filter::populateQuickFilter(FilterPtr filter_, const QString& fieldName_, const QString& text_, bool allowRegExp_) {
   Q_ASSERT(filter_);
   if(text_.isEmpty()) return;
 
   // if the text contains any non-word characters, assume it's a regexp
   // but \W in qt is letter, number, or '_', I want to be a bit less strict
   static const QRegularExpression rx(QLatin1String("[^\\w\\s\\-']"));
-  if(rx.match(text_).hasMatch()) {
+  if(allowRegExp_ && rx.match(text_).hasMatch()) {
     QString text = text_;
     QRegularExpression tx(text);
     if(!tx.isValid()) {
diff --git a/src/filter.h b/src/filter.h
index f1c4dc85..d7370daf 100644
--- a/src/filter.h
+++ b/src/filter.h
@@ -142,7 +142,7 @@ public:
 
   bool operator==(const Filter& other) const;
 
-  static void populateQuickFilter(FilterPtr filter, const QString& fieldName, const QString& text);
+  static void populateQuickFilter(FilterPtr filter, const QString& fieldName, const QString& text, bool allowRegExp);
 
 private:
   Filter& operator=(const Filter& other);
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index a2b9757c..f202abfd 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -1777,7 +1777,7 @@ void MainWindow::setFilter(const QString& text_) {
         fieldName = Data::Document::self()->collection()->fieldNameByTitle(fieldName);
       }
     }
-    Filter::populateQuickFilter(filter, fieldName, text);
+    Filter::populateQuickFilter(filter, fieldName, text, Config::quickFilterRegExp());
     // also want to update the line edit in case the filter was set by DBUS
     if(m_quickFilter->text() != text_) {
       m_quickFilter->setText(text_);
diff --git a/src/tests/filtertest.cpp b/src/tests/filtertest.cpp
index 3f5fb786..8d3a1e8d 100644
--- a/src/tests/filtertest.cpp
+++ b/src/tests/filtertest.cpp
@@ -340,6 +340,18 @@ void FilterTest::testQuickFilter() {
   Tellico::FilterPtr filter(new Tellico::Filter(Tellico::Filter::MatchAll));
   QString fieldName; // empty means any field
 
-  Tellico::Filter::populateQuickFilter(filter, fieldName, QStringLiteral("C++"));
+  Tellico::Filter::populateQuickFilter(filter, fieldName, QStringLiteral("C++"), true /* allow regexps */);
   QVERIFY(filter->matches(entry));
+
+  entry->setField(QStringLiteral("title"), QStringLiteral("Coding Standards"));
+  QVERIFY(filter->matches(entry)); // still matches due to c++ being interpreted as a regexp
+
+  Tellico::FilterPtr filter2(new Tellico::Filter(Tellico::Filter::MatchAll));
+
+  Tellico::Filter::populateQuickFilter(filter2, fieldName, QStringLiteral("C++"), false /* allow regexps */);
+  entry->setField(QStringLiteral("title"), QStringLiteral("C++ Coding Standards"));
+  QVERIFY(filter2->matches(entry));
+
+  entry->setField(QStringLiteral("title"), QStringLiteral("Coding Standards"));
+  QVERIFY(!filter2->matches(entry)); // no longer matches
 }


More information about the kde-doc-english mailing list