+QTextLayout *ChatItem::createLayout(QTextOption::WrapMode wrapMode, Qt::Alignment alignment) {
+ QTextLayout *layout = new QTextLayout(data(MessageModel::DisplayRole).toString());
+
+ QTextOption option;
+ option.setWrapMode(wrapMode);
+ option.setAlignment(alignment);
+ layout->setTextOption(option);
+
+ QList<QTextLayout::FormatRange> formatRanges
+ = QtUi::style()->toTextLayoutList(data(MessageModel::FormatRole).value<UiStyle::FormatList>(), layout->text().length());
+ layout->setAdditionalFormats(formatRanges);
+ return layout;
+}
+
+void ChatItem::updateLayout() {
+ switch(data(ChatLineModel::ColumnTypeRole).toUInt()) {
+ case ChatLineModel::TimestampColumn:
+ if(!haveLayout()) _layout = createLayout(QTextOption::WrapAnywhere, Qt::AlignLeft);
+ // fallthrough
+ case ChatLineModel::SenderColumn:
+ if(!haveLayout()) _layout = createLayout(QTextOption::WrapAnywhere, Qt::AlignRight);
+ _layout->beginLayout();
+ {
+ QTextLine line = _layout->createLine();
+ if(line.isValid()) {
+ line.setLineWidth(width());
+ line.setPosition(QPointF(0, fontMetrics()->leading()));
+ }
+ _layout->endLayout();
+ }
+ break;
+ case ChatLineModel::ContentsColumn: {
+ if(!haveLayout()) _layout = createLayout(QTextOption::WrapAnywhere);
+
+ // Now layout
+ ChatLineModel::WrapList wrapList = data(ChatLineModel::WrapListRole).value<ChatLineModel::WrapList>();
+ if(!wrapList.count()) return; // empty chatitem
+ int wordidx = 0;
+ ChatLineModel::Word word = wrapList.at(0);
+
+ qreal h = 0;
+ WrapColumnFinder finder(this);
+ _layout->beginLayout();
+ forever {
+ QTextLine line = _layout->createLine();
+ if (!line.isValid())
+ break;
+
+ int col = finder.nextWrapColumn();
+ line.setNumColumns(col >= 0 ? col - line.textStart() : _layout->text().length());
+
+ h += fontMetrics()->leading();
+ line.setPosition(QPointF(0, h));
+ h += line.height();
+ }
+ _layout->endLayout();
+ }
+ break;
+ }
+}
+
+void ChatItem::clearLayout() {
+ delete _layout;
+ _layout = 0;
+}
+
+void ChatItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
+ Q_UNUSED(option); Q_UNUSED(widget);
+ if(!haveLayout()) updateLayout();
+ _layout->draw(painter, QPointF(0,0), QVector<QTextLayout::FormatRange>(), boundingRect());
+ //painter->drawRect(boundingRect());
+
+}
+
+/*
+void ChatItem::mouseMoveEvent ( QGraphicsSceneMouseEvent * event ) {
+ qDebug() << (void*)this << "moving" << event->pos();
+ if(event->pos().y() < 0) {
+ QTextCursor cursor(document());
+ //cursor.insertText("foo");
+ //cursor.select(QTextCursor::Document);
+ event->ignore();
+ } else QGraphicsTextItem::mouseMoveEvent(event);
+}
+*/
+
+/*************************************************************************************************/
+