X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fchatviewsearchcontroller.cpp;h=1635d90970183a4921ac76e4f238e8aabf79baf9;hp=44ddc694d52f963d9e4f2565b9988afcb1538dbc;hb=01ed2953cbad3f2de3df262dc1601e82d903b4a8;hpb=a117d3bd1592bae3b14630c953790a005b3c3a3d diff --git a/src/qtui/chatviewsearchcontroller.cpp b/src/qtui/chatviewsearchcontroller.cpp index 44ddc694..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,12 +72,40 @@ 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) return; - + QAbstractItemModel *model = _scene->model(); Q_ASSERT(model); @@ -124,16 +153,22 @@ 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) { QList checkItems; if(_searchSenders) checkItems << &(line->item(MessageModel::SenderColumn)); - + if(_searchMsgs) checkItems << &(line->item(MessageModel::ContentsColumn)); - + foreach(ChatItem *item, checkItems) { foreach(QRectF wordRect, item->findWords(searchString(), caseSensitive())) { _highlightItems << new SearchHighlightItem(wordRect.adjusted(item->x(), 0, item->x(), 0), line); @@ -193,21 +228,49 @@ void ChatViewSearchController::setSearchOnlyRegularMsgs(bool searchOnlyRegularMs } - +// ================================================== +// 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); }