ChatViewSearchController::ChatViewSearchController(QObject *parent)
: QObject(parent),
_scene(0),
+ _currentHighlight(0),
_caseSensitive(false),
_searchSenders(false),
_searchMsgs(true),
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);
highlightLine(line);
}
}
+
+ if(!_highlightItems.isEmpty()) {
+ _highlightItems.last()->setHighlighted(true);
+ _currentHighlight = _highlightItems.count() - 1;
+ emit newCurrentHighlight(_highlightItems.last());
+ }
}
void ChatViewSearchController::highlightLine(ChatLine *line) {
QList<ChatItem *> 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);
}
-
+// ==================================================
+// 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);
}