X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fchatline.cpp;h=80b0d565cf41c1bc264f994b602679ffd4cc1b88;hp=ed931bd3eea4df4c0b7765932ca54c7e8d1d0671;hb=8961f348947fc55cc4bc769563684af3f2ea7ccc;hpb=4a5065255e652dd0c301bac0db41b7afb777ef49 diff --git a/src/qtui/chatline.cpp b/src/qtui/chatline.cpp index ed931bd3..80b0d565 100644 --- a/src/qtui/chatline.cpp +++ b/src/qtui/chatline.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2013 by the Quassel Project * + * Copyright (C) 2005-2019 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -18,17 +18,28 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ +#include "chatline.h" + +#include #include #include +#include +#include #include -#include +#include +#include + +class QAbstractItemModel; +class QGraphicsSceneMouseEvent; +class QGraphicsSceneHoverEvent; +class QPainter; +class QStyleOptionGraphicsItem; #include "bufferinfo.h" #include "buffersyncer.h" -#include "client.h" #include "chatitem.h" -#include "chatline.h" #include "chatview.h" +#include "client.h" #include "columnhandleitem.h" #include "messagemodel.h" #include "networkmodel.h" @@ -36,22 +47,26 @@ #include "qtuisettings.h" #include "qtuistyle.h" -ChatLine::ChatLine(int row, QAbstractItemModel *model, - const qreal &width, - const qreal ×tampWidth, const qreal &senderWidth, const qreal &contentsWidth, - const QPointF &senderPos, const QPointF &contentsPos, - QGraphicsItem *parent) - : QGraphicsItem(parent), - _row(row), // needs to be set before the items - _model(model), - _contentsItem(contentsPos, contentsWidth, this), - _senderItem(QRectF(senderPos, QSizeF(senderWidth, _contentsItem.height())), this), - _timestampItem(QRectF(0, 0, timestampWidth, _contentsItem.height()), this), - _width(width), - _height(_contentsItem.height()), - _selection(0), - _mouseGrabberItem(0), - _hoverItem(0) +ChatLine::ChatLine(int row, + QAbstractItemModel* model, + const qreal& width, + const qreal& timestampWidth, + const qreal& senderWidth, + const qreal& contentsWidth, + const QPointF& senderPos, + const QPointF& contentsPos, + QGraphicsItem* parent) + : QGraphicsItem(parent) + , _row(row) // needs to be set before the items + , _model(model) + , _contentsItem(contentsPos, contentsWidth, this) + , _senderItem(QRectF(senderPos, QSizeF(senderWidth, _contentsItem.height())), this) + , _timestampItem(QRectF(0, 0, timestampWidth, _contentsItem.height()), this) + , _width(width) + , _height(_contentsItem.height()) + , _selection(0) + , _mouseGrabberItem(nullptr) + , _hoverItem(nullptr) { Q_ASSERT(model); QModelIndex index = model->index(row, ChatLineModel::ContentsColumn); @@ -60,15 +75,13 @@ ChatLine::ChatLine(int row, QAbstractItemModel *model, setHighlighted(index.data(MessageModel::FlagsRole).toInt() & Message::Highlight); } - ChatLine::~ChatLine() { if (chatView()) chatView()->setHasCache(this, false); } - -ChatItem *ChatLine::item(ChatLineModel::ColumnType column) +ChatItem* ChatLine::item(ChatLineModel::ColumnType column) { switch (column) { case ChatLineModel::TimestampColumn: @@ -78,12 +91,11 @@ ChatItem *ChatLine::item(ChatLineModel::ColumnType column) case ChatLineModel::ContentsColumn: return &_contentsItem; default: - return 0; + return nullptr; } } - -ChatItem *ChatLine::itemAt(const QPointF &pos) +ChatItem* ChatLine::itemAt(const QPointF& pos) { if (_contentsItem.boundingRect().contains(pos)) return &_contentsItem; @@ -91,10 +103,9 @@ ChatItem *ChatLine::itemAt(const QPointF &pos) return &_senderItem; if (_timestampItem.boundingRect().contains(pos)) return &_timestampItem; - return 0; + return nullptr; } - void ChatLine::clearCache() { _timestampItem.clearCache(); @@ -102,37 +113,33 @@ void ChatLine::clearCache() _contentsItem.clearCache(); } - -void ChatLine::setMouseGrabberItem(ChatItem *item) +void ChatLine::setMouseGrabberItem(ChatItem* item) { _mouseGrabberItem = item; } - -bool ChatLine::sceneEvent(QEvent *event) +bool ChatLine::sceneEvent(QEvent* event) { if (event->type() == QEvent::GrabMouse) { // get mouse cursor pos relative to us - ChatView *view = chatScene()->chatView(); + ChatView* view = chatScene()->chatView(); QPointF linePos = mapFromScene(view->mapToScene(view->mapFromGlobal(QCursor::pos()))); setMouseGrabberItem(itemAt(linePos)); } else if (event->type() == QEvent::UngrabMouse) { - setMouseGrabberItem(0); + setMouseGrabberItem(nullptr); } return QGraphicsItem::sceneEvent(event); } - -void ChatLine::setFirstColumn(const qreal ×tampWidth, const qreal &senderWidth, const QPointF &senderPos) +void ChatLine::setFirstColumn(const qreal& timestampWidth, const qreal& senderWidth, const QPointF& senderPos) { _timestampItem.setGeometry(timestampWidth, _height); _senderItem.setGeometry(senderWidth, _height); _senderItem.setPos(senderPos); } - -void ChatLine::setSecondColumn(const qreal &senderWidth, const qreal &contentsWidth, const QPointF &contentsPos, qreal &linePos) +void ChatLine::setSecondColumn(const qreal& senderWidth, const qreal& contentsWidth, const QPointF& contentsPos, qreal& linePos) { // linepos is the *bottom* position for the line qreal height = _contentsItem.setGeometryByWidth(contentsWidth); @@ -151,8 +158,7 @@ void ChatLine::setSecondColumn(const qreal &senderWidth, const qreal &contentsWi setPos(0, linePos); } - -void ChatLine::setGeometryByWidth(const qreal &width, const qreal &contentsWidth, qreal &linePos) +void ChatLine::setGeometryByWidth(const qreal& width, const qreal& contentsWidth, qreal& linePos) { // linepos is the *bottom* position for the line qreal height = _contentsItem.setGeometryByWidth(contentsWidth); @@ -170,10 +176,9 @@ void ChatLine::setGeometryByWidth(const qreal &width, const qreal &contentsWidth _width = width; } - setPos(0, linePos); // set pos is _very_ cheap if nothing changes. + setPos(0, linePos); // set pos is _very_ cheap if nothing changes. } - void ChatLine::setSelected(bool selected, ChatLineModel::ColumnType minColumn) { if (selected) { @@ -198,32 +203,32 @@ void ChatLine::setSelected(bool selected, ChatLineModel::ColumnType minColumn) } } - void ChatLine::setHighlighted(bool highlighted) { - if (highlighted) _selection |= Highlighted; - else _selection &= ~Highlighted; + if (highlighted) + _selection |= Highlighted; + else + _selection &= ~Highlighted; update(); } - -void ChatLine::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +void ChatLine::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { Q_UNUSED(option); Q_UNUSED(widget); - const QAbstractItemModel *model_ = model(); + const QAbstractItemModel* model_ = model(); QModelIndex myIdx = model_->index(row(), 0); Message::Type type = (Message::Type)myIdx.data(MessageModel::TypeRole).toInt(); - UiStyle::MessageLabel label = (UiStyle::MessageLabel)myIdx.data(ChatLineModel::MsgLabelRole).toInt(); + auto label = myIdx.data(ChatLineModel::MsgLabelRole).value(); - QTextCharFormat msgFmt = QtUi::style()->format(UiStyle::formatType(type), label); + QTextCharFormat msgFmt = QtUi::style()->format({UiStyle::formatType(type), {}, {}}, label); if (msgFmt.hasProperty(QTextFormat::BackgroundBrush)) { painter->fillRect(boundingRect(), msgFmt.background()); } if (_selection & Selected) { - QTextCharFormat selFmt = QtUi::style()->format(UiStyle::formatType(type), label | UiStyle::Selected); + QTextCharFormat selFmt = QtUi::style()->format({UiStyle::formatType(type), {}, {}}, label | UiStyle::MessageLabel::Selected); if (selFmt.hasProperty(QTextFormat::BackgroundBrush)) { qreal left = item((ChatLineModel::ColumnType)(_selection & ItemMask))->pos().x(); QRectF selectRect(left, 0, width() - left, height()); @@ -238,63 +243,56 @@ void ChatLine::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, contentsItem()->paint(painter, option, widget); } - // We need to dispatch all mouse-related events to the appropriate (mouse grabbing) ChatItem -ChatItem *ChatLine::mouseEventTargetItem(const QPointF &pos) +ChatItem* ChatLine::mouseEventTargetItem(const QPointF& pos) { if (mouseGrabberItem()) return mouseGrabberItem(); return itemAt(pos); } - -void ChatLine::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +void ChatLine::mouseMoveEvent(QGraphicsSceneMouseEvent* event) { - ChatItem *item = mouseEventTargetItem(event->pos()); + ChatItem* item = mouseEventTargetItem(event->pos()); if (item) item->mouseMoveEvent(event); } - -void ChatLine::mousePressEvent(QGraphicsSceneMouseEvent *event) +void ChatLine::mousePressEvent(QGraphicsSceneMouseEvent* event) { - ChatItem *item = mouseEventTargetItem(event->pos()); + ChatItem* item = mouseEventTargetItem(event->pos()); if (item) item->mousePressEvent(event); } - -void ChatLine::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +void ChatLine::mouseReleaseEvent(QGraphicsSceneMouseEvent* event) { - ChatItem *item = mouseEventTargetItem(event->pos()); + ChatItem* item = mouseEventTargetItem(event->pos()); if (item) item->mouseReleaseEvent(event); } - -void ChatLine::hoverEnterEvent(QGraphicsSceneHoverEvent *event) +void ChatLine::hoverEnterEvent(QGraphicsSceneHoverEvent* event) { - ChatItem *item = mouseEventTargetItem(event->pos()); + ChatItem* item = mouseEventTargetItem(event->pos()); if (item && !_hoverItem) { _hoverItem = item; item->hoverEnterEvent(event); } } - -void ChatLine::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) +void ChatLine::hoverLeaveEvent(QGraphicsSceneHoverEvent* event) { if (_hoverItem) { _hoverItem->hoverLeaveEvent(event); - _hoverItem = 0; + _hoverItem = nullptr; } } - -void ChatLine::hoverMoveEvent(QGraphicsSceneHoverEvent *event) +void ChatLine::hoverMoveEvent(QGraphicsSceneHoverEvent* event) { - ChatItem *item = mouseEventTargetItem(event->pos()); + ChatItem* item = mouseEventTargetItem(event->pos()); if (item) item->hoverMoveEvent(event); }