X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fchatitem.h;fp=src%2Fqtui%2Fchatitem.h;h=c7658e50457511a76fb6b644ac91a2e4a2eee885;hp=5a23146699b5946f6484ed0c34d5faa73d011ce3;hb=c1cf157116de7fc3da96203aa6f03c38c7ebb650;hpb=30b159cb876a9495de42e9a3e70ca050516f0805 diff --git a/src/qtui/chatitem.h b/src/qtui/chatitem.h index 5a231466..c7658e50 100644 --- a/src/qtui/chatitem.h +++ b/src/qtui/chatitem.h @@ -21,17 +21,17 @@ #ifndef CHATITEM_H_ #define CHATITEM_H_ +#include + #include #include +#include #include "chatlinemodel.h" #include "chatscene.h" #include "clickable.h" -#include "uistyle.h" #include "qtui.h" - -#include -#include +#include "uistyle.h" class ChatLine; class ChatView; @@ -43,14 +43,14 @@ class ChatItem { protected: // boundingRect is relative to the parent ChatLine - ChatItem(const QRectF &boundingRect, ChatLine *parent); + ChatItem(const QRectF& boundingRect, ChatLine* parent); virtual ~ChatItem(); public: - const QAbstractItemModel *model() const; - ChatLine *chatLine() const; - ChatScene *chatScene() const; - ChatView *chatView() const; + const QAbstractItemModel* model() const; + ChatLine* chatLine() const; + ChatScene* chatScene() const; + ChatView* chatView() const; int row() const; virtual ChatLineModel::ColumnType column() const = 0; @@ -62,12 +62,12 @@ public: inline qreal x() const; inline qreal y() const; - QPointF mapToLine(const QPointF &) const; - QPointF mapFromLine(const QPointF &) const; - QPointF mapToScene(const QPointF &) const; - QPointF mapFromScene(const QPointF &) const; + QPointF mapToLine(const QPointF&) const; + QPointF mapFromLine(const QPointF&) const; + QPointF mapToScene(const QPointF&) const; + QPointF mapFromScene(const QPointF&) const; - virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr); + virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr); virtual inline int type() const { return ChatScene::ChatItemType; } QVariant data(int role) const; @@ -76,16 +76,16 @@ public: QString selection() const; void clearSelection(); void setFullSelection(); - void continueSelecting(const QPointF &pos); + void continueSelecting(const QPointF& pos); bool hasSelection() const; - bool isPosOverSelection(const QPointF &pos) const; + bool isPosOverSelection(const QPointF& pos) const; - QList findWords(const QString &searchWord, Qt::CaseSensitivity caseSensitive); + QList findWords(const QString& searchWord, Qt::CaseSensitivity caseSensitive); - virtual void addActionsToMenu(QMenu *menu, const QPointF &itemPos); - virtual void handleClick(const QPointF &pos, ChatScene::ClickMode); + virtual void addActionsToMenu(QMenu* menu, const QPointF& itemPos); + virtual void handleClick(const QPointF& pos, ChatScene::ClickMode); - void initLayoutHelper(QTextLayout *layout, QTextOption::WrapMode, Qt::Alignment = Qt::AlignLeft) const; + void initLayoutHelper(QTextLayout* layout, QTextOption::WrapMode, Qt::Alignment = Qt::AlignLeft) const; //! Remove internally cached data /** This removes e.g. the cached QTextLayout to avoid wasting space for nonvisible ChatLines @@ -93,28 +93,29 @@ public: virtual void clearCache(); protected: - enum SelectionMode { + enum SelectionMode + { NoSelection, PartialSelection, FullSelection }; - virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event); - virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); - virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); - virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *) {} - virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *) {} - virtual void hoverMoveEvent(QGraphicsSceneHoverEvent *) {} + virtual void mouseMoveEvent(QGraphicsSceneMouseEvent* event); + virtual void mousePressEvent(QGraphicsSceneMouseEvent* event); + virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent* event); + virtual void hoverEnterEvent(QGraphicsSceneHoverEvent*) {} + virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent*) {} + virtual void hoverMoveEvent(QGraphicsSceneHoverEvent*) {} - QTextLayout *layout() const; + QTextLayout* layout() const; - virtual void initLayout(QTextLayout *layout) const; - virtual void doLayout(QTextLayout *) const; + virtual void initLayout(QTextLayout* layout) const; + virtual void doLayout(QTextLayout*) const; virtual UiStyle::FormatList formatList() const; - void paintBackground(QPainter *); + void paintBackground(QPainter*); virtual QVector additionalFormats() const; - void overlayFormat(UiStyle::FormatList &fmtList, quint16 start, quint16 end, UiStyle::FormatType overlayFmt) const; + void overlayFormat(UiStyle::FormatList& fmtList, quint16 start, quint16 end, UiStyle::FormatType overlayFmt) const; inline qint16 selectionStart() const { return _selectionStart; } inline void setSelectionStart(qint16 start) { _selectionStart = start; } @@ -127,21 +128,33 @@ protected: virtual bool hasActiveClickable() const; virtual std::pair activeClickableRange() const; - qint16 posToCursor(const QPointF &pos) const; + qint16 posToCursor(const QPointF& pos) const; - inline void setGeometry(qreal width, qreal height) { clearCache(); _boundingRect.setSize(QSizeF(width, height)); } - inline void setHeight(const qreal &height) { clearCache(); _boundingRect.setHeight(height); } - inline void setWidth(const qreal &width) { clearCache(); _boundingRect.setWidth(width); } - inline void setPos(const QPointF &pos) { _boundingRect.moveTopLeft(pos); } + inline void setGeometry(qreal width, qreal height) + { + clearCache(); + _boundingRect.setSize(QSizeF(width, height)); + } + inline void setHeight(const qreal& height) + { + clearCache(); + _boundingRect.setHeight(height); + } + inline void setWidth(const qreal& width) + { + clearCache(); + _boundingRect.setWidth(width); + } + inline void setPos(const QPointF& pos) { _boundingRect.moveTopLeft(pos); } private: - ChatLine *_parent; + ChatLine* _parent; QRectF _boundingRect; SelectionMode _selectionMode; qint16 _selectionStart, _selectionEnd; - mutable QTextLayout *_cachedLayout; + mutable QTextLayout* _cachedLayout; // internal selection stuff void setSelection(int start, int length); @@ -149,7 +162,6 @@ private: friend class ChatLine; }; - // ************************************************************ // TimestampChatItem // ************************************************************ @@ -158,12 +170,13 @@ private: class TimestampChatItem : public ChatItem { public: - TimestampChatItem(const QRectF &boundingRect, ChatLine *parent) : ChatItem(boundingRect, parent) {} + TimestampChatItem(const QRectF& boundingRect, ChatLine* parent) + : ChatItem(boundingRect, parent) + {} inline int type() const override { return ChatScene::TimestampChatItemType; } inline ChatLineModel::ColumnType column() const override { return ChatLineModel::TimestampColumn; } }; - // ************************************************************ // SenderChatItem // ************************************************************ @@ -171,17 +184,18 @@ public: class SenderChatItem : public ChatItem { public: - SenderChatItem(const QRectF &boundingRect, ChatLine *parent) : ChatItem(boundingRect, parent) {} + SenderChatItem(const QRectF& boundingRect, ChatLine* parent) + : ChatItem(boundingRect, parent) + {} inline ChatLineModel::ColumnType column() const override { return ChatLineModel::SenderColumn; } - void handleClick(const QPointF &pos, ChatScene::ClickMode clickMode) override; + void handleClick(const QPointF& pos, ChatScene::ClickMode clickMode) override; protected: - void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override; + void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr) override; inline int type() const override { return ChatScene::SenderChatItemType; } - void initLayout(QTextLayout *layout) const override; + void initLayout(QTextLayout* layout) const override; }; - // ************************************************************ // ContentsChatItem // ************************************************************ @@ -193,48 +207,48 @@ class ContentsChatItem : public ChatItem Q_DECLARE_TR_FUNCTIONS(ContentsChatItem) public: - ContentsChatItem(const QPointF &pos, const qreal &width, ChatLine *parent); + ContentsChatItem(const QPointF& pos, const qreal& width, ChatLine* parent); ~ContentsChatItem() override; inline int type() const override { return ChatScene::ContentsChatItemType; } inline ChatLineModel::ColumnType column() const override { return ChatLineModel::ContentsColumn; } - QFontMetricsF *fontMetrics() const; + QFontMetricsF* fontMetrics() const; void clearCache() override; protected: - void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; - void hoverLeaveEvent(QGraphicsSceneHoverEvent *event) override; - void hoverMoveEvent(QGraphicsSceneHoverEvent *event) override; - void handleClick(const QPointF &pos, ChatScene::ClickMode clickMode) override; + void mouseMoveEvent(QGraphicsSceneMouseEvent* event) override; + void hoverLeaveEvent(QGraphicsSceneHoverEvent* event) override; + void hoverMoveEvent(QGraphicsSceneHoverEvent* event) override; + void handleClick(const QPointF& pos, ChatScene::ClickMode clickMode) override; bool hasActiveClickable() const override; std::pair activeClickableRange() const override; - void addActionsToMenu(QMenu *menu, const QPointF &itemPos) override; + void addActionsToMenu(QMenu* menu, const QPointF& itemPos) override; virtual void copyLinkToClipboard(); - void initLayout(QTextLayout *layout) const override; - void doLayout(QTextLayout *layout) const override; + void initLayout(QTextLayout* layout) const override; + void doLayout(QTextLayout* layout) const override; UiStyle::FormatList formatList() const override; private: class ActionProxy; class WrapColumnFinder; - mutable ContentsChatItemPrivate *_data; - ContentsChatItemPrivate *privateData() const; + mutable ContentsChatItemPrivate* _data; + ContentsChatItemPrivate* privateData() const; - Clickable clickableAt(const QPointF &pos) const; + Clickable clickableAt(const QPointF& pos) const; void endHoverMode(); - void showWebPreview(const Clickable &click); + void showWebPreview(const Clickable& click); void clearWebPreview(); qreal setGeometryByWidth(qreal w); - QFontMetricsF *_fontMetrics; + QFontMetricsF* _fontMetrics; // we need a receiver for Action signals static ActionProxy _actionProxy; @@ -243,25 +257,28 @@ private: friend struct ContentsChatItemPrivate; }; - -struct ContentsChatItemPrivate { - ContentsChatItem *contentsItem; +struct ContentsChatItemPrivate +{ + ContentsChatItem* contentsItem; ClickableList clickables; Clickable currentClickable; Clickable activeClickable; - ContentsChatItemPrivate(ClickableList c, ContentsChatItem *parent) : contentsItem(parent), clickables(std::move(c)) {} + ContentsChatItemPrivate(ClickableList c, ContentsChatItem* parent) + : contentsItem(parent) + , clickables(std::move(c)) + {} }; class ContentsChatItem::WrapColumnFinder { public: - WrapColumnFinder(const ChatItem *parent); + WrapColumnFinder(const ChatItem* parent); qint16 nextWrapColumn(qreal width); private: - const ChatItem *item; + const ChatItem* item; QTextLayout layout; QTextLine line; ChatLineModel::WrapList wrapList; @@ -270,7 +287,6 @@ private: qreal choppedTrailing; }; - //! Acts as a proxy for Action signals targetted at a ContentsChatItem /** Since a ChatItem is not a QObject, hence cannot receive signals, we use a static ActionProxy * as a receiver instead. This avoids having to handle ChatItem actions (e.g. context menu entries) @@ -289,22 +305,39 @@ private: * in the Action correctly. * @return The ChatItem from which the sending Action originated */ - inline ContentsChatItem *item() const + inline ContentsChatItem* item() const { - return static_cast(qobject_cast(sender())->data().value()); + return static_cast(qobject_cast(sender())->data().value()); } }; - /*************************************************************************************************/ // Inlines -QRectF ChatItem::boundingRect() const { return _boundingRect; } -qreal ChatItem::width() const { return _boundingRect.width(); } -qreal ChatItem::height() const { return _boundingRect.height(); } -QPointF ChatItem::pos() const { return _boundingRect.topLeft(); } -qreal ChatItem::x() const { return pos().x(); } -qreal ChatItem::y() const { return pos().y(); } +QRectF ChatItem::boundingRect() const +{ + return _boundingRect; +} +qreal ChatItem::width() const +{ + return _boundingRect.width(); +} +qreal ChatItem::height() const +{ + return _boundingRect.height(); +} +QPointF ChatItem::pos() const +{ + return _boundingRect.topLeft(); +} +qreal ChatItem::x() const +{ + return pos().x(); +} +qreal ChatItem::y() const +{ + return pos().y(); +} #endif