#include "qtui.h"
#include "qtuistyle.h"
-ChatItem::ChatItem(const qreal &width, const qreal &height, const QPointF &pos, ChatLineModel::ColumnType col, QGraphicsItem *parent)
+ChatItem::ChatItem(const qreal &width, const qreal &height, const QPointF &pos, QGraphicsItem *parent)
: QGraphicsItem(parent),
_data(0),
_boundingRect(0, 0, width, height),
- _fontMetrics(0),
_selectionMode(NoSelection),
_selectionStart(-1)
{
- const QAbstractItemModel *model_ = model();
- QModelIndex index = model_->index(row(), col);
- _fontMetrics = QtUi::style()->fontMetrics(model_->data(index, ChatLineModel::FormatRole).value<UiStyle::FormatList>().at(0).second);
setAcceptHoverEvents(true);
setZValue(20);
setPos(pos);
searchIdx = plainText.indexOf(searchWord, searchIdx + 1, caseSensitive);
}
- if(!hasLayout())
+ bool hadLayout = hasLayout();
+ if(!hadLayout)
updateLayout();
foreach(int idx, indexList) {
QTextLine line = layout()->lineForTextPosition(idx);
qreal x = line.cursorToX(idx);
qreal width = line.cursorToX(idx + searchWord.count()) - x;
- qreal height = fontMetrics()->lineSpacing();
+ qreal height = line.height();
qreal y = height * line.lineNumber();
resultList << QRectF(x, y, width, height);
}
+
+ if(!hadLayout)
+ clearLayout();
return resultList;
}
// ContentsChatItem
// ************************************************************
ContentsChatItem::ContentsChatItem(const qreal &width, const QPointF &pos, QGraphicsItem *parent)
- : ChatItem(0, 0, pos, column(), parent)
+ : ChatItem(0, 0, pos, parent)
{
+ const QAbstractItemModel *model_ = model();
+ QModelIndex index = model_->index(row(), column());
+ _fontMetrics = QtUi::style()->fontMetrics(model_->data(index, ChatLineModel::FormatRole).value<UiStyle::FormatList>().at(0).second);
+
setGeometryByWidth(width);
}
class ChatItem : public QGraphicsItem {
protected:
- ChatItem(const qreal &width, const qreal &height, const QPointF &pos, ChatLineModel::ColumnType column, QGraphicsItem *parent);
+ ChatItem(const qreal &width, const qreal &height, const QPointF &pos, QGraphicsItem *parent);
virtual ~ChatItem();
public:
virtual ChatLineModel::ColumnType column() const = 0;
inline ChatScene *chatScene() const { return qobject_cast<ChatScene *>(scene()); }
- inline QFontMetricsF *fontMetrics() const { return _fontMetrics; }
inline QRectF boundingRect() const { return _boundingRect; }
inline qreal width() const { return _boundingRect.width(); }
inline qreal height() const { return _boundingRect.height(); }
inline bool hasLayout() const { return (bool)_data; }
QTextLayout *createLayout(QTextOption::WrapMode, Qt::Alignment = Qt::AlignLeft);
virtual inline QTextLayout *createLayout() { return createLayout(QTextOption::WrapAnywhere); }
+ virtual void updateLayout();
void clearLayout();
- virtual void updateLayout();
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
QVariant data(int role) const;
ChatItemPrivate *_data;
QRectF _boundingRect;
- QFontMetricsF *_fontMetrics;
enum SelectionMode { NoSelection, PartialSelection, FullSelection };
SelectionMode _selectionMode;
//! 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), column(), parent) {}
+ 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; }
};
//! 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, column(), parent) {}
+ 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; }
virtual inline QTextLayout *createLayout() { return ChatItem::createLayout(QTextOption::WrapAnywhere, Qt::AlignRight); }
};
qreal setGeometryByWidth(qreal w);
friend class ChatLine;
friend struct ContentsChatItemPrivate;
+
+ inline QFontMetricsF *fontMetrics() const { return _fontMetrics; }
+ QFontMetricsF *_fontMetrics;
};
struct ContentsChatItem::Clickable {
ContentsChatItemPrivate(QTextLayout *l, const QList<ContentsChatItem::Clickable> &c) : ChatItemPrivate(l), clickables(c), hasDragged(false) {}
};
+//inlines regarding ContentsChatItemPrivate
+ContentsChatItemPrivate *ContentsChatItem::privateData() const { return (ContentsChatItemPrivate *)ChatItem::privateData(); }
+
class ContentsChatItem::WrapColumnFinder {
public:
WrapColumnFinder(ChatItem *parent);
const QAbstractItemModel *ChatItem::model() const { return static_cast<ChatLine *>(parentItem())->model(); }
int ChatItem::row() const { return static_cast<ChatLine *>(parentItem())->row(); }
-ContentsChatItemPrivate *ContentsChatItem::privateData() const { return (ContentsChatItemPrivate *)privateData(); }
-
#endif