From 49f966fd9c04f3aa3149be73bb61b8e1781ce1c2 Mon Sep 17 00:00:00 2001 From: Marcus Eggenberger Date: Mon, 22 Sep 2008 13:33:46 +0200 Subject: [PATCH] bringing those up and down buttons of the searchbar to life --- src/qtui/bufferwidget.cpp | 13 +++++ src/qtui/bufferwidget.h | 26 +++++----- src/qtui/chatview.cpp | 3 +- src/qtui/chatviewsearchbar.cpp | 3 -- src/qtui/chatviewsearchbar.h | 2 + src/qtui/chatviewsearchcontroller.cpp | 70 +++++++++++++++++++++++++-- src/qtui/chatviewsearchcontroller.h | 20 +++++++- 7 files changed, 118 insertions(+), 19 deletions(-) diff --git a/src/qtui/bufferwidget.cpp b/src/qtui/bufferwidget.cpp index bdaaff2d..f9b69867 100644 --- a/src/qtui/bufferwidget.cpp +++ b/src/qtui/bufferwidget.cpp @@ -51,6 +51,13 @@ BufferWidget::BufferWidget(QWidget *parent) _chatViewSearchController, SLOT(setSearchMsgs(bool))); connect(ui.searchBar->searchOnlyRegularMsgsBox(), SIGNAL(toggled(bool)), _chatViewSearchController, SLOT(setSearchOnlyRegularMsgs(bool))); + connect(ui.searchBar->searchUpButton(), SIGNAL(clicked()), + _chatViewSearchController, SLOT(highlightPrev())); + connect(ui.searchBar->searchDownButton(), SIGNAL(clicked()), + _chatViewSearchController, SLOT(highlightNext())); + + connect(_chatViewSearchController, SIGNAL(newCurrentHighlight(QGraphicsItem *)), + this, SLOT(scrollToHighlight(QGraphicsItem *))); } BufferWidget::~BufferWidget() { @@ -86,3 +93,9 @@ void BufferWidget::showChatView(BufferId id) { } } +void BufferWidget::scrollToHighlight(QGraphicsItem *highlightItem) { + ChatView *view = qobject_cast(ui.stackedWidget->currentWidget()); + if(view) { + view->centerOn(highlightItem); + } +} diff --git a/src/qtui/bufferwidget.h b/src/qtui/bufferwidget.h index 6f48f096..75027cbf 100644 --- a/src/qtui/bufferwidget.h +++ b/src/qtui/bufferwidget.h @@ -25,28 +25,32 @@ #include "abstractbuffercontainer.h" +class QGraphicsItem; class ChatViewSearchBar; class ChatViewSearchController; class BufferWidget : public AbstractBufferContainer { Q_OBJECT - public: - BufferWidget(QWidget *parent); - ~BufferWidget(); +public: + BufferWidget(QWidget *parent); + ~BufferWidget(); inline ChatViewSearchBar *searchBar() const { return ui.searchBar; } - protected: - virtual AbstractChatView *createChatView(BufferId); - virtual void removeChatView(BufferId); +protected: + virtual AbstractChatView *createChatView(BufferId); + virtual void removeChatView(BufferId); - protected slots: - virtual void showChatView(BufferId); +protected slots: + virtual void showChatView(BufferId); - private: - Ui::BufferWidget ui; - QHash _chatViews; +private slots: + void scrollToHighlight(QGraphicsItem *highlightItem); + +private: + Ui::BufferWidget ui; + QHash _chatViews; ChatViewSearchController *_chatViewSearchController; }; diff --git a/src/qtui/chatview.cpp b/src/qtui/chatview.cpp index fe196d06..6037c981 100644 --- a/src/qtui/chatview.cpp +++ b/src/qtui/chatview.cpp @@ -49,7 +49,8 @@ void ChatView::init(MessageFilter *filter) { setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setAlignment(Qt::AlignBottom); setInteractive(true); - setOptimizationFlags(QGraphicsView::DontClipPainter | QGraphicsView::DontAdjustForAntialiasing); + //setOptimizationFlags(QGraphicsView::DontClipPainter | QGraphicsView::DontAdjustForAntialiasing); + setOptimizationFlags(QGraphicsView::DontAdjustForAntialiasing); setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate); setTransformationAnchor(QGraphicsView::NoAnchor); diff --git a/src/qtui/chatviewsearchbar.cpp b/src/qtui/chatviewsearchbar.cpp index c4c6f095..55246919 100644 --- a/src/qtui/chatviewsearchbar.cpp +++ b/src/qtui/chatviewsearchbar.cpp @@ -30,9 +30,6 @@ ChatViewSearchBar::ChatViewSearchBar(QWidget *parent) ui.setupUi(this); layout()->setContentsMargins(0, 0, 0, 0); - ui.searchUpButton->setEnabled(false); - ui.searchDownButton->setEnabled(false); - hide(); ActionCollection *coll = QtUi::actionCollection(); diff --git a/src/qtui/chatviewsearchbar.h b/src/qtui/chatviewsearchbar.h index 8caf3f80..d89e2a18 100644 --- a/src/qtui/chatviewsearchbar.h +++ b/src/qtui/chatviewsearchbar.h @@ -38,6 +38,8 @@ public: inline QCheckBox *searchSendersBox() const { return ui.searchSendersBox; } inline QCheckBox *searchMsgsBox() const { return ui.searchMsgsBox; } inline QCheckBox *searchOnlyRegularMsgsBox() const { return ui.searchOnlyRegularMsgsBox; } + inline QToolButton *searchUpButton() const { return ui.searchUpButton; } + inline QToolButton *searchDownButton() const { return ui.searchDownButton; } public slots: void setVisible(bool); diff --git a/src/qtui/chatviewsearchcontroller.cpp b/src/qtui/chatviewsearchcontroller.cpp index e8d7f90f..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,20 +227,49 @@ void ChatViewSearchController::setSearchOnlyRegularMsgs(bool searchOnlyRegularMs updateHighlights(searchOnlyRegularMsgs); } + +// ================================================== +// SearchHighlightItem +// ================================================== SearchHighlightItem::SearchHighlightItem(QRectF wordRect, QGraphicsItem *parent) - : QGraphicsItem(parent) + : QObject(), + QGraphicsItem(parent), + _highlighted(false), + _alpha(100), + _timeLine(150) { 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(254, 237, 45)); + painter->setPen(QPen(QColor(0, 0, 0, _alpha), 1.5)); + painter->setBrush(QColor(254, 237, 45, _alpha)); painter->setRenderHints(QPainter::Antialiasing); qreal radius = boundingRect().height() * 0.30; painter->drawRoundedRect(boundingRect(), radius, radius); diff --git a/src/qtui/chatviewsearchcontroller.h b/src/qtui/chatviewsearchcontroller.h index 6d8dc2d9..51b6ff0a 100644 --- a/src/qtui/chatviewsearchcontroller.h +++ b/src/qtui/chatviewsearchcontroller.h @@ -25,9 +25,11 @@ #include #include #include +#include #include "message.h" +class QGraphicsItem; class ChatLine; class ChatScene; class SearchHighlightItem; @@ -49,14 +51,21 @@ public slots: void setSearchMsgs(bool searchMsgs); void setSearchOnlyRegularMsgs(bool searchOnlyRegularMsgs); + void highlightNext(); + void highlightPrev(); + private slots: void sceneDestroyed(); void updateHighlights(bool reuse = false); +signals: + void newCurrentHighlight(QGraphicsItem *highlightItem); + private: QString _searchString; ChatScene *_scene; QList _highlightItems; + int _currentHighlight; bool _caseSensitive; bool _searchSenders; @@ -73,14 +82,23 @@ private: // Highlight Items #include -class SearchHighlightItem : public QGraphicsItem { +class SearchHighlightItem : public QObject, public QGraphicsItem { + Q_OBJECT + public: SearchHighlightItem(QRectF wordRect, QGraphicsItem *parent = 0); inline virtual QRectF boundingRect() const { return _boundingRect; } virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); + void setHighlighted(bool highlighted); + +private slots: + void updateHighlight(qreal value); private: QRectF _boundingRect; + bool _highlighted; + qreal _alpha; + QTimeLine _timeLine; }; #endif //CHATVIEWSEARCHCONTROLLER_H -- 2.20.1