+protected:
+ ChatItem(const qreal &width, const qreal &height, const QPointF &pos, QGraphicsItem *parent);
+
+public:
+ inline const QAbstractItemModel *model() const;
+ inline int row() const;
+ virtual ChatLineModel::ColumnType column() const = 0;
+ inline ChatScene *chatScene() const { return qobject_cast<ChatScene *>(scene()); }
+
+ inline QRectF boundingRect() const { return _boundingRect; }
+ inline qreal width() const { return _boundingRect.width(); }
+ inline qreal height() const { return _boundingRect.height(); }
+
+ 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);
+ enum { Type = ChatScene::ChatItemType };
+ virtual inline int type() const { return Type; }
+
+ QVariant data(int role) const;
+
+ // selection stuff, to be called by the scene
+ QString selection() const;
+ void clearSelection();
+ void setFullSelection();
+ void continueSelecting(const QPointF &pos);
+ bool hasSelection() const;
+ bool isPosOverSelection(const QPointF &pos) const;
+
+ QList<QRectF> findWords(const QString &searchWord, Qt::CaseSensitivity caseSensitive);
+
+ virtual void addActionsToMenu(QMenu *menu, const QPointF &itemPos);
+ virtual void handleClick(const QPointF &pos, ChatScene::ClickMode);
+
+protected:
+ enum SelectionMode {
+ NoSelection,
+ PartialSelection,
+ FullSelection
+ };
+
+ virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+ virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
+ virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+
+ void paintBackground(QPainter *);
+ QVector<QTextLayout::FormatRange> selectionFormats() const;
+ virtual QVector<QTextLayout::FormatRange> additionalFormats() const;
+ void overlayFormat(UiStyle::FormatList &fmtList, int start, int end, quint32 overlayFmt) const;
+
+ inline qint16 selectionStart() const { return _selectionStart; }
+ inline void setSelectionStart(qint16 start) { _selectionStart = start; }
+ inline qint16 selectionEnd() const { return _selectionEnd; }
+ inline void setSelectionEnd(qint16 end) { _selectionEnd = end; }
+ inline SelectionMode selectionMode() const { return _selectionMode; }
+ inline void setSelectionMode(SelectionMode mode) { _selectionMode = mode; }
+ void setSelection(SelectionMode mode, qint16 selectionStart, qint16 selectionEnd);
+
+ qint16 posToCursor(const QPointF &pos) const;
+
+ // 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) {
+ _boundingRect.setWidth(width);
+ _boundingRect.setHeight(height);
+ }
+ inline void setHeight(const qreal &height) {
+ _boundingRect.setHeight(height);
+ }
+ inline void setWidth(const qreal &width) {
+ _boundingRect.setWidth(width);
+ }
+
+private:
+ // internal selection stuff
+ void setSelection(int start, int length);
+
+ QRectF _boundingRect;
+
+ SelectionMode _selectionMode;
+ qint16 _selectionStart, _selectionEnd;
+
+ friend class ChatLine;
+};