+protected:
+ virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+ virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
+ virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+
+ inline QTextLayout *layout() const;
+
+ virtual inline QVector<QTextLayout::FormatRange> additionalFormats() const { return QVector<QTextLayout::FormatRange>(); }
+ qint16 posToCursor(const QPointF &pos);
+
+ inline bool hasPrivateData() const { return (bool)_data; }
+ ChatItemPrivate *privateData() const;
+ virtual inline ChatItemPrivate *newPrivateData();
+
+ // WARNING: setGeometry and setHeight should not be used without either:
+ // a) calling prepareGeometryChange() immediately before setColumns()
+ // b) calling Chatline::setPos() immediately afterwards
+ inline void setGeometry(qreal width, qreal height) {
+ prepareGeometryChange();
+ _boundingRect.setWidth(width);
+ _boundingRect.setHeight(height);
+ }
+ inline void setHeight(const qreal &height) {
+ prepareGeometryChange();
+ _boundingRect.setHeight(height);
+ }
+ inline void setWidth(const qreal &width) {
+ prepareGeometryChange();
+ _boundingRect.setWidth(width);
+ }
+
+private:
+ // internal selection stuff
+ void setSelection(int start, int length);
+
+ ChatItemPrivate *_data;
+ QRectF _boundingRect;
+
+ enum SelectionMode { NoSelection, PartialSelection, FullSelection };
+ SelectionMode _selectionMode;
+ qint16 _selectionStart, _selectionEnd;
+
+ friend class ChatLine;
+};
+
+struct ChatItemPrivate {
+ QTextLayout *layout;
+ ChatItemPrivate(QTextLayout *l) : layout(l) {}
+ ~ChatItemPrivate() {
+ delete layout;
+ }
+};
+
+// inlines of ChatItem
+QTextLayout *ChatItem::layout() const { return privateData()->layout; }
+ChatItemPrivate *ChatItem::newPrivateData() { return new ChatItemPrivate(createLayout(QTextOption::WrapAnywhere)); }
+
+// ************************************************************
+// TimestampChatItem
+// ************************************************************
+
+//! A ChatItem for the timestamp column
+class TimestampChatItem : public ChatItem {
+public:
+ TimestampChatItem(const qreal &width, const qreal &height, QGraphicsItem *parent) : ChatItem(width, height, QPointF(0, 0), parent) {}
+ virtual inline ChatLineModel::ColumnType column() const { return ChatLineModel::TimestampColumn; }
+};
+
+// ************************************************************
+// SenderChatItem
+// ************************************************************
+//! A ChatItem for the sender column
+class SenderChatItem : public ChatItem {
+public:
+ SenderChatItem(const qreal &width, const qreal &height, const QPointF &pos, QGraphicsItem *parent) : ChatItem(width, height, pos, parent) {}
+ virtual inline ChatLineModel::ColumnType column() const { return ChatLineModel::SenderColumn; }
+
+protected:
+ virtual inline ChatItemPrivate *newPrivateData() { return new ChatItemPrivate(createLayout(QTextOption::WrapAnywhere, Qt::AlignRight)); }
+};
+
+// ************************************************************
+// ContentsChatItem
+// ************************************************************
+struct ContentsChatItemPrivate;