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 /src/urlbar | |
| 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>
Diffstat (limited to 'src/urlbar')
| -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 | 
