X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fchatviewsearchcontroller.cpp;h=3828de643d65a00ff483136946ab03cb4e7c0411;hp=1635d90970183a4921ac76e4f238e8aabf79baf9;hb=61e0633ce94a38e669382c29db498f335d2e0fa8;hpb=114f8a14b8bc82669ffda0599ce30fc299be9396 diff --git a/src/qtui/chatviewsearchcontroller.cpp b/src/qtui/chatviewsearchcontroller.cpp index 1635d909..3828de64 100644 --- a/src/qtui/chatviewsearchcontroller.cpp +++ b/src/qtui/chatviewsearchcontroller.cpp @@ -69,6 +69,7 @@ void ChatViewSearchController::setSearchString(const QString &searchString) { return; connect(_scene, SIGNAL(destroyed()), this, SLOT(sceneDestroyed())); + connect(_scene, SIGNAL(layoutChanged()), this, SLOT(repositionHighlights())); updateHighlights(); } @@ -176,6 +177,50 @@ void ChatViewSearchController::highlightLine(ChatLine *line) { } } +void ChatViewSearchController::repositionHighlights() { + QSet chatLines; + foreach(SearchHighlightItem *item, _highlightItems) { + ChatLine *line = qgraphicsitem_cast(item->parentItem()); + if(line) + chatLines << line; + } + QList chatLineList(chatLines.toList()); + foreach(ChatLine *line, chatLineList) { + repositionHighlights(line); + } +} + +void ChatViewSearchController::repositionHighlights(ChatLine *line) { + QList searchHighlights; + foreach(QGraphicsItem *child, line->childItems()) { + SearchHighlightItem *highlightItem = qgraphicsitem_cast(child); + if(highlightItem) + searchHighlights << highlightItem; + } + + if(searchHighlights.isEmpty()) + return; + + QList wordPos; + if(_searchSenders) { + foreach(QRectF wordRect, line->senderItem().findWords(searchString(), caseSensitive())) { + wordPos << QPointF(wordRect.x() + line->senderItem().x(), wordRect.y()); + } + } + if(_searchMsgs) { + foreach(QRectF wordRect, line->contentsItem().findWords(searchString(), caseSensitive())) { + wordPos << QPointF(wordRect.x() + line->contentsItem().x(), wordRect.y()); + } + } + + qSort(searchHighlights.begin(), searchHighlights.end(), SearchHighlightItem::firstInLine); + + Q_ASSERT(wordPos.count() == searchHighlights.count()); + for(int i = 0; i < searchHighlights.count(); i++) { + searchHighlights.at(i)->setPos(wordPos.at(i)); + } +} + void ChatViewSearchController::sceneDestroyed() { // WARNING: don't call any methods on scene! _scene = 0; @@ -274,3 +319,10 @@ void SearchHighlightItem::paint(QPainter *painter, const QStyleOptionGraphicsIte qreal radius = boundingRect().height() * 0.30; painter->drawRoundedRect(boundingRect(), radius, radius); } + +bool SearchHighlightItem::firstInLine(QGraphicsItem *item1, QGraphicsItem *item2) { + if(item1->pos().y() != item2->pos().y()) + return item1->pos().y() < item2->pos().y(); + else + return item1->pos().x() < item2->pos().x(); +}