X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fchatscene.cpp;h=43ff2480214db982911d5fc37438d5a94700cd11;hp=6dbe17109f9966be9b11ab4debe174c131b96d1b;hb=ddba2696fe051b472d6670e225e67c2f6f1972ce;hpb=bd37d2c94e49e791d2ba44baab4270e030442832 diff --git a/src/qtui/chatscene.cpp b/src/qtui/chatscene.cpp index 6dbe1710..43ff2480 100644 --- a/src/qtui/chatscene.cpp +++ b/src/qtui/chatscene.cpp @@ -25,6 +25,7 @@ #include "buffer.h" #include "chatitem.h" +#include "chatline.h" #include "chatlinemodelitem.h" #include "chatscene.h" #include "columnhandleitem.h" @@ -47,7 +48,7 @@ ChatScene::ChatScene(QAbstractItemModel *model, const QString &idString, QObject connect(model, SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SLOT(rowsInserted(const QModelIndex &, int, int))); connect(model, SIGNAL(modelAboutToBeReset()), this, SLOT(modelReset())); for(int i = 0; i < model->rowCount(); i++) { - ChatLine *line = new ChatLine(model->index(i, 0)); + ChatLine *line = new ChatLine(i, model); _lines.append(line); addItem(line); } @@ -88,7 +89,7 @@ void ChatScene::rowsInserted(const QModelIndex &index, int start, int end) { qreal y = 0; if(_width && start > 0) y = _lines.value(start - 1)->y() + _lines.value(start - 1)->height(); for(int i = start; i <= end; i++) { - ChatLine *line = new ChatLine(model()->index(i, 0)); + ChatLine *line = new ChatLine(i, model()); _lines.insert(i, line); addItem(line); if(_width > 0) { @@ -96,6 +97,11 @@ void ChatScene::rowsInserted(const QModelIndex &index, int start, int end) { h += line->setGeometry(_width, firstColHandlePos, secondColHandlePos); } } + // update existing items + for(int i = end+1; i < _lines.count(); i++) { + _lines[i]->setRow(i); + } + if(h > 0) { _height += h; for(int i = end+1; i < _lines.count(); i++) { @@ -160,8 +166,8 @@ void ChatScene::setSelectingItem(ChatItem *item) { } void ChatScene::startGlobalSelection(ChatItem *item, const QPointF &itemPos) { - _selectionStart = _selectionEnd = item->index().row(); - _selectionStartCol = _selectionMinCol = item->index().column(); + _selectionStart = _selectionEnd = item->row(); + _selectionStartCol = _selectionMinCol = item->column(); _isSelecting = true; _lines[_selectionStart]->setSelected(true, (ChatLineModel::ColumnType)_selectionMinCol); updateSelection(item->mapToScene(itemPos)); @@ -173,7 +179,7 @@ void ChatScene::updateSelection(const QPointF &pos) { ChatItem *contentItem = static_cast(itemAt(QPointF(secondColHandlePos + secondColHandle->width()/2, pos.y()))); if(!contentItem) return; - int curRow = contentItem->index().row(); + int curRow = contentItem->row(); int curColumn; if(pos.x() > secondColHandlePos + secondColHandle->width()/2) curColumn = ChatLineModel::ContentsColumn; else if(pos.x() > firstColHandlePos) curColumn = ChatLineModel::SenderColumn; @@ -252,14 +258,20 @@ void ChatScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { //!\brief Convert current selection to human-readable string. QString ChatScene::selectionToString() const { //TODO Make selection format configurable! - if(!_isSelecting) return ""; + if(!_isSelecting) return QString(); + int start = qMin(_selectionStart, _selectionEnd); + int end = qMax(_selectionStart, _selectionEnd); + if(start < 0 || end >= _lines.count()) { + qDebug() << "Invalid selection range:" << start << end; + return QString(); + } QString result; - for(int l = _selectionStart; l <= _selectionEnd; l++) { + for(int l = start; l <= end; l++) { if(_selectionMinCol == ChatLineModel::TimestampColumn) - result += _lines[l]->item(ChatLineModel::TimestampColumn)->data(MessageModel::DisplayRole).toString() + " "; + result += _lines[l]->item(ChatLineModel::TimestampColumn).data(MessageModel::DisplayRole).toString() + " "; if(_selectionMinCol <= ChatLineModel::SenderColumn) - result += _lines[l]->item(ChatLineModel::SenderColumn)->data(MessageModel::DisplayRole).toString() + " "; - result += _lines[l]->item(ChatLineModel::ContentsColumn)->data(MessageModel::DisplayRole).toString() + "\n"; + result += _lines[l]->item(ChatLineModel::SenderColumn).data(MessageModel::DisplayRole).toString() + " "; + result += _lines[l]->item(ChatLineModel::ContentsColumn).data(MessageModel::DisplayRole).toString() + "\n"; } return result; }