From 79b98452cb17a595cbe04f166a95c7ac38594e2b Mon Sep 17 00:00:00 2001 From: Pierre Rossi Date: Fri, 17 Sep 2010 17:14:04 +0200 Subject: Fix multiple word highlighting. This time it works even with 'b' coming after some or have been inserted and with substrings, which would cause the following: String_containing_substring --- src/urlbar/listitem.cpp | 44 ++++++++++++++++++++++++++++++++++++++------ 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 "" and "" 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("")); + bold = true; + } else if (bold && !boldSections.testBit(i)) { + ret.insert(i, QL1S("")); + 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("")); 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), "\\1"); - + QStringList words = Qt::escape(textToPointOut.simplified()).split(QL1C(' ')); + t = highlightWordsInText(t, words); if (wasItalic) t = QL1S("") + t + QL1S(""); - 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 -- cgit v1.2.1