X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fchatitem.h;h=436f3d092ab8eb55b2bdc516d3f35176e2c9d586;hp=b6f4cf41547c3f3f45bfee1905c301e355a50a0f;hb=77176474b628e801ba94d9d50d0d961a12aa01c4;hpb=4875fbdd65630d336608f64d802e680d18823974 diff --git a/src/qtui/chatitem.h b/src/qtui/chatitem.h index b6f4cf41..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,12 +42,13 @@ class ChatItem { protected: // boundingRect is relative to the parent ChatLine ChatItem(const QRectF &boundingRect, ChatLine *parent); - virtual ~ChatItem() {} + virtual ~ChatItem(); public: const QAbstractItemModel *model() const; ChatLine *chatLine() const; ChatScene *chatScene() const; + ChatView *chatView() const; int row() const; virtual ChatLineModel::ColumnType column() const = 0; @@ -63,14 +65,6 @@ public: QPointF mapToScene(const QPointF &) const; 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; - 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 {