X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fchatitem.h;h=436f3d092ab8eb55b2bdc516d3f35176e2c9d586;hp=1184740cd348b3540fb042b485cefa5790885e00;hb=77176474b628e801ba94d9d50d0d961a12aa01c4;hpb=6353231ed1d32a5be3580ba60a06d9cf588ad877 diff --git a/src/qtui/chatitem.h b/src/qtui/chatitem.h index 1184740c..436f3d09 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, @@ -103,6 +104,12 @@ protected: virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *) {}; virtual void hoverMoveEvent(QGraphicsSceneHoverEvent *) {}; + QTextLayout *layout() const; + virtual inline void initLayout(QTextLayout *layout) const { initLayout(layout, QTextOption::NoWrap); } + virtual void initLayout(QTextLayout *layout, QTextOption::WrapMode, Qt::Alignment alignment = Qt::AlignLeft) const; + virtual void doLayout(QTextLayout *) const; + virtual UiStyle::FormatList formatList() const; + void paintBackground(QPainter *); QVector selectionFormats() const; virtual QVector additionalFormats() const; @@ -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 inline void initLayout(QTextLayout *layout) const { ChatItem::initLayout(layout, QTextOption::ManualWrap, Qt::AlignRight); } }; // ************************************************************ @@ -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 inline void initLayout(QTextLayout *layout) const { ChatItem::initLayout(layout, QTextOption::WrapAtWordBoundaryOrAnywhere); } 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