commit 1410eeb10e4ce1549ce381ab7ae85847c442c41f
Author: Richard Kimberly Heck <[email protected]>
Date: Thu Oct 18 21:41:20 2018 -0400
Simplify the code that adds underlining to the layout combo.
---
src/frontends/qt4/CategorizedCombo.cpp | 22 +++-------------------
src/frontends/qt4/LayoutBox.cpp | 23 ++++-------------------
src/support/qstring_helpers.cpp | 15 +++++++++++++++
src/support/qstring_helpers.h | 7 +++++++
4 files changed, 29 insertions(+), 38 deletions(-)
diff --git a/src/frontends/qt4/CategorizedCombo.cpp
b/src/frontends/qt4/CategorizedCombo.cpp
index 291a402..200628b 100644
--- a/src/frontends/qt4/CategorizedCombo.cpp
+++ b/src/frontends/qt4/CategorizedCombo.cpp
@@ -268,25 +268,9 @@ QString CCItemDelegate::underlineFilter(QString const & s)
const
QString const & f = cc_->filter();
if (f.isEmpty())
return s;
-
- // step through data item and put "(x)" for every matching character
- QString r;
- int lastp = -1;
- for (int i = 0; i < f.length(); ++i) {
- int p = s.indexOf(f[i], lastp + 1, Qt::CaseInsensitive);
- if (p < 0)
- continue;
- if (lastp == p - 1 && lastp != -1) {
- // remove ")" and append "x)"
- r = r.left(r.length() - 4) + s[p] + "</u>";
- } else {
- // append "(x)"
- r += s.mid(lastp + 1, p - lastp - 1);
- r += QString("<u>") + s[p] + "</u>";
- }
- lastp = p;
- }
- r += s.mid(lastp + 1);
+ QString r(s);
+ QRegExp pattern(charFilterRegExpC(f));
+ r.replace(pattern, "<u>\\1</u>");
return r;
}
diff --git a/src/frontends/qt4/LayoutBox.cpp b/src/frontends/qt4/LayoutBox.cpp
index 2bc8714..e82be6e 100644
--- a/src/frontends/qt4/LayoutBox.cpp
+++ b/src/frontends/qt4/LayoutBox.cpp
@@ -43,6 +43,7 @@
#include <QHeaderView>
#include <QItemDelegate>
#include <QPainter>
+#include <QRegExp>
#include <QSortFilterProxyModel>
#include <QStandardItemModel>
#include <QTextFrame>
@@ -298,25 +299,9 @@ QString LayoutItemDelegate::underlineFilter(QString const
& s) const
QString const & f = layout_->filter();
if (f.isEmpty())
return s;
-
- // step through data item and put "(x)" for every matching character
- QString r;
- int lastp = -1;
- for (int i = 0; i < f.length(); ++i) {
- int p = s.indexOf(f[i], lastp + 1, Qt::CaseInsensitive);
- if (p < 0)
- continue;
- if (lastp == p - 1 && lastp != -1) {
- // remove ")" and append "x)"
- r = r.left(r.length() - 4) + s[p] + "</u>";
- } else {
- // append "(x)"
- r += s.mid(lastp + 1, p - lastp - 1);
- r += QString("<u>") + s[p] + "</u>";
- }
- lastp = p;
- }
- r += s.mid(lastp + 1);
+ QString r(s);
+ QRegExp pattern(charFilterRegExpC(f));
+ r.replace(pattern, "<u>\\1</u>");
return r;
}
diff --git a/src/support/qstring_helpers.cpp b/src/support/qstring_helpers.cpp
index ada6125..4a09c1b 100644
--- a/src/support/qstring_helpers.cpp
+++ b/src/support/qstring_helpers.cpp
@@ -81,4 +81,19 @@ QString charFilterRegExp(QString const & filter)
return re;
}
+QString charFilterRegExpC(QString const & filter)
+{
+ QString re = "(";
+ for (int i = 0; i < filter.length(); ++i) {
+ QChar c = filter[i];
+ if (c.isLower())
+ re += "["+ QRegExp::escape(c) +
QRegExp::escape(c.toUpper()) + "]";
+ else
+ re += QRegExp::escape(c);
+ }
+ return re + ")";
+}
+
+
+
} // namespace lyx
diff --git a/src/support/qstring_helpers.h b/src/support/qstring_helpers.h
index a3fafb4..45e0434 100644
--- a/src/support/qstring_helpers.h
+++ b/src/support/qstring_helpers.h
@@ -82,9 +82,16 @@ std::string fromqstr(QString const & str);
/**
* constructs a regex to filter on consecutive characters
+ * matches lower- and uppercase on lowercase characters,
+ * and just uppercase for uppercase
*/
QString charFilterRegExp(QString const & filter);
+/**
+ * as above, but constructs a capturing regex for a sequence of characters
+ */
+QString charFilterRegExpC(QString const & filter);
+
} // namespace lyx
#endif // QSTRING_HELPERS_H