+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();
+ }
+}
+
+/*************************************************************************************************/
+
+/*************************************************************************************************/
+
+void SenderChatItem::updateLayout() {
+ if(!haveLayout()) setLayout(createLayout(QTextOption::WrapAnywhere, Qt::AlignRight));
+ ChatItem::updateLayout();
+}
+
+/*************************************************************************************************/
+
+ContentsChatItem::ContentsChatItem(QAbstractItemModel *model, QGraphicsItem *parent) : ChatItem(column(), model, parent),
+ _layoutData(0)
+{
+
+}
+
+ContentsChatItem::~ContentsChatItem() {
+ delete _layoutData;
+}
+
+qreal ContentsChatItem::computeHeight() {
+ int lines = 1;
+ WrapColumnFinder finder(this);
+ while(finder.nextWrapColumn() > 0) lines++;
+ return lines * fontMetrics()->lineSpacing();
+}
+
+void ContentsChatItem::setLayout(QTextLayout *layout) {
+ if(!_layoutData) {
+ _layoutData = new LayoutData;
+ _layoutData->clickables = findClickables();
+ } else {
+ delete _layoutData->layout;
+ }
+ _layoutData->layout = layout;
+}
+
+void ContentsChatItem::clearLayout() {
+ delete _layoutData;
+ _layoutData = 0;
+}
+
+void ContentsChatItem::updateLayout() {
+ if(!haveLayout()) setLayout(createLayout(QTextOption::WrapAnywhere));