#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:
- 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
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; }
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);
public:
SenderChatItem(const QRectF &boundingRect, ChatLine *parent) : ChatItem(boundingRect, parent) {}
virtual inline ChatLineModel::ColumnType column() const { return ChatLineModel::SenderColumn; }
+ virtual void handleClick(const QPointF &pos, ChatScene::ClickMode clickMode);
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 {
/*************************************************************************************************/
-#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(); }
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