-#ifndef _CHATLINE_H_
-#define _CHATLINE_H_
-
-#include <QtGui>
-
-#include "util.h"
-#include "style.h"
-#include "quasselui.h"
-
-//FIXME: chatline doku
-//!\brief Containing the layout and providing the rendering of a single message.
-/** A ChatLine takes a Message object,
- * formats it (by turning the various message types into a human-readable form and afterwards pumping it through
- * our Style engine), and stores it as a number of QTextLayouts representing the three fields of a chat line
- * (timestamp, sender and text). These layouts already include any rendering information such as font,
- * color, or selected characters. By calling layout(), they can be quickly layouted to fit a given set of field widths.
- * Afterwards, they can quickly be painted whenever necessary.
- *
- * By separating the complex and slow task of interpreting and formatting Message objects (which happens exactly once
- * per message) from the actual layouting and painting, we gain a lot of speed compared to the standard Qt rendering
- * functions.
- */
-class ChatLine : public QObject, public AbstractUiMsg {
- Q_OBJECT
-
- public:
- ChatLine(Message message);
- virtual ~ChatLine();
-
- qreal layout(qreal tsWidth, qreal nickWidth, qreal textWidth);
- qreal height() const { return hght; }
- int posToCursor(QPointF pos);
- void draw(QPainter *p, const QPointF &pos);
-
- enum SelectionMode { None, Partial, Full };
- void setSelection(SelectionMode, int start = 0, int end = 0);
-
- QDateTime timeStamp() const;
- QString sender() const;
- QString text() const;
- MsgId msgId() const;
- BufferInfo bufferInfo() const;
-
- bool isUrl(int pos) const;
- QUrl getUrl(int pos) const;
-
- public slots:
-
- private:
- qreal hght;
- Message msg;
- qreal tsWidth, senderWidth, textWidth;
- Style::StyledString styledTimeStamp, styledSender, styledText;
-
- struct FormatRange {
- int start;
- int length;
- int height;
- QTextCharFormat format;
- };
- struct Word {
- int start;
- int length;
- int trailing;
- int height;
+#pragma once
+
+#include <QGraphicsItem>
+#include <QModelIndex>
+#include <QRectF>
+
+#include "chatitem.h"
+#include "chatlinemodel.h"
+#include "chatscene.h"
+
+class QAbstractItemModel;
+class QEvent;
+class QGraphicsSceneMouseEvent;
+class QGraphicsSceneHoverEvent;
+class QPainter;
+class QStyleOptionGraphicsItem;
+
+class ChatLine : public QGraphicsItem
+{
+public:
+ ChatLine(int row,
+ QAbstractItemModel* model,
+ const qreal& width,
+ const qreal& timestampWidth,
+ const qreal& senderWidth,
+ const qreal& contentsWidth,
+ const QPointF& senderPos,
+ const QPointF& contentsPos,
+ QGraphicsItem* parent = nullptr);
+
+ ~ChatLine() override;
+
+ inline QRectF boundingRect() const override { return {0, 0, _width, _height}; }
+
+ inline QModelIndex index() const { return model()->index(row(), 0); }
+ inline MsgId msgId() const { return index().data(MessageModel::MsgIdRole).value<MsgId>(); }
+ inline Message::Type msgType() const { return (Message::Type)index().data(MessageModel::TypeRole).toInt(); }
+
+ inline int row() const { return _row; }
+ inline void setRow(int row) { _row = row; }
+
+ inline const QAbstractItemModel* model() const { return _model; }
+ inline ChatScene* chatScene() const { return qobject_cast<ChatScene*>(scene()); }
+ inline ChatView* chatView() const { return chatScene() ? chatScene()->chatView() : nullptr; }
+
+ inline qreal width() const { return _width; }
+ inline qreal height() const { return _height; }
+
+ ChatItem* item(ChatLineModel::ColumnType);
+ ChatItem* itemAt(const QPointF& pos);
+ inline ChatItem* timestampItem() { return &_timestampItem; }
+ inline ChatItem* senderItem() { return &_senderItem; }
+ inline ContentsChatItem* contentsItem() { return &_contentsItem; }
+
+ void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr) override;
+ enum
+ {
+ Type = ChatScene::ChatLineType