X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fqtui%2Fchatviewsearchcontroller.cpp;h=1635d90970183a4921ac76e4f238e8aabf79baf9;hb=eab5c456972d723fb3c67fe366548608f3bbeadc;hp=591c20e38d497e0360af3cbc751b83a8d0cf9397;hpb=0789d47e81940cbbdf925466442380063a50ac05;p=quassel.git diff --git a/src/qtui/chatviewsearchcontroller.cpp b/src/qtui/chatviewsearchcontroller.cpp index 591c20e3..1635d909 100644 --- a/src/qtui/chatviewsearchcontroller.cpp +++ b/src/qtui/chatviewsearchcontroller.cpp @@ -31,6 +31,7 @@ ChatViewSearchController::ChatViewSearchController(QObject *parent) : QObject(parent), _scene(0), + _currentHighlight(0), _caseSensitive(false), _searchSenders(false), _searchMsgs(true), @@ -71,7 +72,35 @@ void ChatViewSearchController::setSearchString(const QString &searchString) { updateHighlights(); } +void ChatViewSearchController::highlightNext() { + if(_highlightItems.isEmpty()) + return; + + if(_currentHighlight < _highlightItems.count()) { + _highlightItems.at(_currentHighlight)->setHighlighted(false); + } + _currentHighlight++; + if(_currentHighlight >= _highlightItems.count()) + _currentHighlight = 0; + _highlightItems.at(_currentHighlight)->setHighlighted(true); + emit newCurrentHighlight(_highlightItems.at(_currentHighlight)); +} + +void ChatViewSearchController::highlightPrev() { + if(_highlightItems.isEmpty()) + return; + + if(_currentHighlight < _highlightItems.count()) { + _highlightItems.at(_currentHighlight)->setHighlighted(false); + } + + _currentHighlight--; + if(_currentHighlight < 0) + _currentHighlight = _highlightItems.count() - 1; + _highlightItems.at(_currentHighlight)->setHighlighted(true); + emit newCurrentHighlight(_highlightItems.at(_currentHighlight)); +} void ChatViewSearchController::updateHighlights(bool reuse) { if(!_scene) @@ -124,6 +153,12 @@ void ChatViewSearchController::updateHighlights(bool reuse) { highlightLine(line); } } + + if(!_highlightItems.isEmpty()) { + _highlightItems.last()->setHighlighted(true); + _currentHighlight = _highlightItems.count() - 1; + emit newCurrentHighlight(_highlightItems.last()); + } } void ChatViewSearchController::highlightLine(ChatLine *line) { @@ -192,21 +227,50 @@ void ChatViewSearchController::setSearchOnlyRegularMsgs(bool searchOnlyRegularMs updateHighlights(searchOnlyRegularMsgs); } + +// ================================================== +// SearchHighlightItem +// ================================================== SearchHighlightItem::SearchHighlightItem(QRectF wordRect, QGraphicsItem *parent) - : QGraphicsItem(parent), - _boundingRect(QRectF(-wordRect.width() / 2, -wordRect.height() / 2, wordRect.width(), wordRect.height())) + : QObject(), + QGraphicsItem(parent), + _highlighted(false), + _alpha(100), + _timeLine(150) { - setPos(wordRect.x() + wordRect.width() / 2 , wordRect.y() + wordRect.height() / 2); - scale(1.2, 1.2); + setPos(wordRect.x(), wordRect.y()); + qreal sizedelta = wordRect.height() * 0.1; + _boundingRect = QRectF(-sizedelta, -sizedelta, wordRect.width() + 2 * sizedelta, wordRect.height() + 2 * sizedelta); + + connect(&_timeLine, SIGNAL(valueChanged(qreal)), this, SLOT(updateHighlight(qreal))); +} + +void SearchHighlightItem::setHighlighted(bool highlighted) { + _highlighted = highlighted; + + if(highlighted) + _timeLine.setDirection(QTimeLine::Forward); + else + _timeLine.setDirection(QTimeLine::Backward); + + if(_timeLine.state() != QTimeLine::Running) + _timeLine.start(); + + update(); +} + +void SearchHighlightItem::updateHighlight(qreal value) { + _alpha = 100 + 155 * value; + update(); } void SearchHighlightItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { Q_UNUSED(option); Q_UNUSED(widget); - painter->setPen(QPen(Qt::black, 1.5)); - //painter->setBrush(QColor(127, 133, 250)); - painter->setBrush(QColor(254, 237, 45)); + painter->setPen(QPen(QColor(0, 0, 0, _alpha), 1.5)); + painter->setBrush(QColor(254, 237, 45, _alpha)); painter->setRenderHints(QPainter::Antialiasing); - painter->drawRoundedRect(boundingRect(), 30, 30, Qt::RelativeSize); + qreal radius = boundingRect().height() * 0.30; + painter->drawRoundedRect(boundingRect(), radius, radius); }