#include <QTextLayout>
class ChatLine;
+class ChatView;
/* All external positions are relative to the parent ChatLine */
/* Yes, that's also true for the boundingRect() and related things */
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;
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; }
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,
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<QTextLayout::FormatRange> selectionFormats() const;
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:
SelectionMode _selectionMode;
qint16 _selectionStart, _selectionEnd;
+ mutable QTextLayout *_cachedLayout;
+
// internal selection stuff
void setSelection(int start, int length);
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;
};
// ************************************************************
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);
virtual QVector<QTextLayout::FormatRange> 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;
class ActionProxy;
class WrapColumnFinder;
- ContentsChatItemPrivate *_data;
+ mutable ContentsChatItemPrivate *_data;
ContentsChatItemPrivate *privateData() const;
Clickable clickableAt(const QPointF &pos) const;
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 {