+void ChatItem::mousePressEvent(QGraphicsSceneMouseEvent *event) {
+ if(event->buttons() == Qt::LeftButton) {
+ chatScene()->setSelectingItem(this);
+ _selectionStart = _selectionEnd = posToCursor(event->pos());
+ _selectionMode = NoSelection; // will be set to PartialSelection by mouseMoveEvent
+ update();
+ event->accept();
+ } else {
+ event->ignore();
+ }
+}
+
+void ChatItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
+ if(event->buttons() == Qt::LeftButton) {
+ if(contains(event->pos())) {
+ qint16 end = posToCursor(event->pos());
+ if(end != _selectionEnd) {
+ _selectionEnd = end;
+ _selectionMode = (_selectionStart != _selectionEnd ? PartialSelection : NoSelection);
+ update();
+ }
+ } else {
+ setFullSelection();
+ chatScene()->startGlobalSelection(this, event->pos());
+ }
+ event->accept();
+ } else {
+ event->ignore();
+ }
+}
+
+void ChatItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) {
+ if(_selectionMode != NoSelection && !event->buttons() & Qt::LeftButton) {
+ _selectionEnd = posToCursor(event->pos());
+ QString selection
+ = data(MessageModel::DisplayRole).toString().mid(qMin(_selectionStart, _selectionEnd), qAbs(_selectionStart - _selectionEnd));
+ chatScene()->putToClipboard(selection);
+ event->accept();
+ } else {
+ event->ignore();
+ }
+}
+
+// ************************************************************
+// SenderChatItem
+// ************************************************************
+
+// ************************************************************
+// ContentsChatItem
+// ************************************************************
+ContentsChatItem::ContentsChatItem(const qreal &width, const QPointF &pos, QGraphicsItem *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);
+}
+
+qreal ContentsChatItem::setGeometryByWidth(qreal w) {
+ if(w != width()) {
+ setWidth(w);
+ // compute height
+ int lines = 1;
+ WrapColumnFinder finder(this);
+ while(finder.nextWrapColumn() > 0)
+ lines++;
+ setHeight(lines * fontMetrics()->lineSpacing());
+ }
+ return height();
+}
+
+void ContentsChatItem::updateLayout() {
+ if(!privateData()) {
+ ContentsChatItemPrivate *data = new ContentsChatItemPrivate(createLayout(QTextOption::WrapAnywhere),
+ findClickables());
+ // data->clickables = findClickables();
+ setPrivateData(data);
+ }