X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fchatitem.h;h=4e51e93983bf2542a36616745d54429160143a5f;hp=1184740cd348b3540fb042b485cefa5790885e00;hb=9337b0bdce0bff71a9ea08cc630ce065028fe389;hpb=6353231ed1d32a5be3580ba60a06d9cf588ad877 diff --git a/src/qtui/chatitem.h b/src/qtui/chatitem.h index 1184740c..4e51e939 100644 --- a/src/qtui/chatitem.h +++ b/src/qtui/chatitem.h @@ -33,6 +33,7 @@ #include class ChatLine; +class ChatView; /* All external positions are relative to the parent ChatLine */ /* Yes, that's also true for the boundingRect() and related things */ @@ -41,13 +42,14 @@ class ChatItem { protected: // boundingRect is relative to the parent ChatLine ChatItem(const QRectF &boundingRect, ChatLine *parent); - virtual ~ChatItem() {} + virtual ~ChatItem(); public: - inline const QAbstractItemModel *model() const; - inline ChatLine *chatLine() const; - inline ChatScene *chatScene() const; - inline int row() const; + const QAbstractItemModel *model() const; + ChatLine *chatLine() const; + ChatScene *chatScene() const; + ChatView *chatView() const; + int row() const; virtual ChatLineModel::ColumnType column() const = 0; // The boundingRect() is relative to the parent ChatLine @@ -58,18 +60,10 @@ public: inline qreal x() const; inline qreal y() const; - inline QPointF mapToLine(const QPointF &) const; - inline QPointF mapFromLine(const QPointF &) const; - inline QPointF mapToScene(const QPointF &) const; - inline QPointF mapFromScene(const QPointF &) const; - - void initLayoutHelper(QTextLayout *layout, QTextOption::WrapMode, Qt::Alignment = Qt::AlignLeft) const; - virtual inline void initLayout(QTextLayout *layout) const { - initLayoutHelper(layout, QTextOption::NoWrap); - doLayout(layout); - } - virtual void doLayout(QTextLayout *) const; - virtual UiStyle::FormatList formatList() 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 = 0); virtual inline int type() const { return ChatScene::ChatItemType; } @@ -89,6 +83,13 @@ public: 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; + + //! Remove internally cached data + /** This removes e.g. the cached QTextLayout to avoid wasting space for nonvisible ChatLines + */ + virtual void clearCache(); + protected: enum SelectionMode { NoSelection, @@ -99,9 +100,15 @@ protected: 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 hoverEnterEvent(QGraphicsSceneHoverEvent *) {} + virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *) {} + virtual void hoverMoveEvent(QGraphicsSceneHoverEvent *) {} + + QTextLayout *layout() const; + + virtual void initLayout(QTextLayout *layout) const; + virtual void doLayout(QTextLayout *) const; + virtual UiStyle::FormatList formatList() const; void paintBackground(QPainter *); QVector selectionFormats() const; @@ -118,9 +125,9 @@ protected: qint16 posToCursor(const QPointF &pos) const; - inline void setGeometry(qreal width, qreal height) { _boundingRect.setSize(QSizeF(width, height)); } - inline void setHeight(const qreal &height) { _boundingRect.setHeight(height); } - inline void setWidth(const qreal &width) { _boundingRect.setWidth(width); } + 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: @@ -130,6 +137,8 @@ private: SelectionMode _selectionMode; qint16 _selectionStart, _selectionEnd; + mutable QTextLayout *_cachedLayout; + // internal selection stuff void setSelection(int start, int length); @@ -161,10 +170,7 @@ public: protected: virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); virtual inline int type() const { return ChatScene::SenderChatItemType; } - virtual inline void initLayout(QTextLayout *layout) const { - initLayoutHelper(layout, QTextOption::ManualWrap, Qt::AlignRight); - doLayout(layout); - } + virtual void initLayout(QTextLayout *layout) const; }; // ************************************************************ @@ -185,6 +191,8 @@ public: inline ChatLineModel::ColumnType column() const { return ChatLineModel::ContentsColumn; } QFontMetricsF *fontMetrics() const; + virtual void clearCache(); + protected: virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event); virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); @@ -196,10 +204,7 @@ protected: virtual QVector additionalFormats() const; - virtual inline void initLayout(QTextLayout *layout) const { - initLayoutHelper(layout, QTextOption::WrapAtWordBoundaryOrAnywhere); - doLayout(layout); - } + virtual void initLayout(QTextLayout *layout) const; virtual void doLayout(QTextLayout *layout) const; virtual UiStyle::FormatList formatList() const; @@ -207,7 +212,7 @@ private: class ActionProxy; class WrapColumnFinder; - ContentsChatItemPrivate *_data; + mutable ContentsChatItemPrivate *_data; ContentsChatItemPrivate *privateData() const; Clickable clickableAt(const QPointF &pos) const; @@ -217,13 +222,14 @@ private: void clearWebPreview(); qreal setGeometryByWidth(qreal w); - friend class ChatLine; - friend struct ContentsChatItemPrivate; QFontMetricsF *_fontMetrics; // we need a receiver for Action signals static ActionProxy _actionProxy; + + friend class ChatLine; + friend struct ContentsChatItemPrivate; }; struct ContentsChatItemPrivate { @@ -276,15 +282,8 @@ private: /*************************************************************************************************/ -#include "chatline.h" /* avoid circular includes */ - // Inlines -ChatLine *ChatItem::chatLine() const { return _parent; } -ChatScene *ChatItem::chatScene() const { return chatLine()->chatScene(); } -const QAbstractItemModel *ChatItem::model() const { return chatLine()->model(); } -int ChatItem::row() const { return chatLine()->row(); } - QRectF ChatItem::boundingRect() const { return _boundingRect; } qreal ChatItem::width() const { return _boundingRect.width(); } qreal ChatItem::height() const { return _boundingRect.height(); } @@ -292,10 +291,4 @@ QPointF ChatItem::pos() const { return _boundingRect.topLeft(); } qreal ChatItem::x() const { return pos().x(); } qreal ChatItem::y() const { return pos().y(); } -QPointF ChatItem::mapToLine(const QPointF &p) const { return p + pos(); } -QPointF ChatItem::mapFromLine(const QPointF &p) const { return p - pos(); } -// relative to the ChatLine -QPointF ChatItem::mapToScene(const QPointF &p) const { return chatLine()->mapToScene(p /* + pos() */); } -QPointF ChatItem::mapFromScene(const QPointF &p) const { return chatLine()->mapFromScene(p) /* - pos() */; } - #endif