diff options
author | Pierre Rossi <pierre.rossi@gmail.com> | 2010-09-17 17:14:04 +0200 |
---|---|---|
committer | Pierre Rossi <pierre.rossi@gmail.com> | 2010-10-08 22:45:17 +0200 |
commit | 79b98452cb17a595cbe04f166a95c7ac38594e2b (patch) | |
tree | 802320bc6b8194400e509578300760b2aeb61537 | |
parent | Prompt user before restoring session after a crash. (diff) | |
download | rekonq-79b98452cb17a595cbe04f166a95c7ac38594e2b.tar.xz |
Fix multiple word highlighting.
This time it works even with 'b' coming after some <b> or </b>
have been inserted and with substrings, which would cause the
following:
<b>String_containing_<b>substring</b></b>
-rw-r--r-- | src/urlbar/listitem.cpp | 44 | ||||
-rw-r--r-- | src/urlbar/listitem.h | 2 |
2 files changed, 39 insertions, 7 deletions
diff --git a/src/urlbar/listitem.cpp b/src/urlbar/listitem.cpp index c60e69a8..8b908149 100644 --- a/src/urlbar/listitem.cpp +++ b/src/urlbar/listitem.cpp @@ -204,22 +204,52 @@ IconLabel::IconLabel(const KIcon &icon, QWidget *parent) // --------------------------------------------------------------- +static QString highlightWordsInText(const QString &text, const QStringList &words) +{ + QString ret = text; + QBitArray boldSections(ret.size()); + foreach (const QString &wordToPointOut, words) { + int index = ret.indexOf(wordToPointOut, 0, Qt::CaseInsensitive); + while(index > -1) { + boldSections.fill(true,index + 1, index + wordToPointOut.size() + 1); + index = ret.indexOf(wordToPointOut, index + wordToPointOut.size(), Qt::CaseInsensitive); + } + } + int numSections = 0; + bool bold = false; + for(int i=0; i < boldSections.size() - 1; ++i ) { + if (boldSections.testBit(i) && (i == boldSections.size() || !boldSections.testBit(i+1))) + numSections++; + } + const int tagLength = 7; // length of "<b>" and "</b>" we're going to add for each bold section. + ret.reserve(ret.size() + numSections * tagLength); + bold = false; + for (int i = boldSections.size() - 1; i >= 0; --i) { + if (!bold && boldSections.testBit(i)) { + ret.insert(i, QL1S("</b>")); + bold = true; + } else if (bold && !boldSections.testBit(i)) { + ret.insert(i, QL1S("<b>")); + bold = false; + } + } + return ret; +} TextLabel::TextLabel(const QString &text, const QString &textToPointOut, QWidget *parent) : QLabel(parent) { + setTextFormat(Qt::RichText); + setMouseTracking(false); QString t = text; const bool wasItalic = t.startsWith(QL1S("<i>")); if (wasItalic) - t.remove(QRegExp("<[/ib]*>")); - + t.remove(QRegExp(QL1S("<[/ib]*>"))); t = Qt::escape(t); - QString ss = Qt::escape(textToPointOut); - t.replace(QRegExp('(' + ss + ')', Qt::CaseInsensitive), "<b>\\1</b>"); - + QStringList words = Qt::escape(textToPointOut.simplified()).split(QL1C(' ')); + t = highlightWordsInText(t, words); if (wasItalic) t = QL1S("<i>") + t + QL1S("</i>"); - setText(t); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); } @@ -228,6 +258,8 @@ TextLabel::TextLabel(const QString &text, const QString &textToPointOut, QWidget TextLabel::TextLabel(QWidget *parent) : QLabel(parent) { + setTextFormat(Qt::RichText); + setMouseTracking(false); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); } diff --git a/src/urlbar/listitem.h b/src/urlbar/listitem.h index be5a2569..975c3724 100644 --- a/src/urlbar/listitem.h +++ b/src/urlbar/listitem.h @@ -115,7 +115,7 @@ public: // ------------------------------------------------------------------------- -class TextLabel : public QLabel +class REKONQ_TESTS_EXPORT TextLabel : public QLabel { Q_OBJECT |