Correctly handle selections while new ChatLines are being inserted
authorManuel Nickschas <sputnick@quassel-irc.org>
Wed, 13 Aug 2008 10:23:30 +0000 (12:23 +0200)
committerManuel Nickschas <sputnick@quassel-irc.org>
Wed, 13 Aug 2008 10:47:48 +0000 (12:47 +0200)
This should fix most selection-based crashes. Had one caused by something else,
but couldn't reproduce yet. Backtraces welcome :)

src/qtui/chatscene.cpp
src/qtui/chatscene.h

index 7ba7d39..e04784c 100644 (file)
@@ -44,7 +44,6 @@ ChatScene::ChatScene(QAbstractItemModel *model, const QString &idString, QObject
     _model(model),
     _singleBufferScene(false),
     _selectingItem(0),
     _model(model),
     _singleBufferScene(false),
     _selectingItem(0),
-    _lastItem(0),
     _selectionStart(-1),
     _isSelecting(false),
     _fetchingBacklog(false)
     _selectionStart(-1),
     _isSelecting(false),
     _fetchingBacklog(false)
@@ -113,6 +112,15 @@ void ChatScene::rowsInserted(const QModelIndex &index, int start, int end) {
     _lines[i]->setRow(i);
   }
 
     _lines[i]->setRow(i);
   }
 
+  // update selection
+  if(_selectionStart >= 0) {
+    int offset = end - start + 1;
+    if(_selectionStart >= start) _selectionStart += offset;
+    if(_selectionEnd >= start) _selectionEnd += offset;
+    if(_firstSelectionRow >= start) _firstSelectionRow += offset;
+    if(_lastSelectionRow >= start) _lastSelectionRow += offset;
+  }
+
   if(h > 0) {
     _height += h;
     for(int i = end+1; i < _lines.count(); i++) {
   if(h > 0) {
     _height += h;
     for(int i = end+1; i < _lines.count(); i++) {
@@ -205,10 +213,8 @@ void ChatScene::updateSelection(const QPointF &pos) {
       _lines[l]->setSelected(true, minColumn);
     }
   }
       _lines[l]->setSelected(true, minColumn);
     }
   }
-
   int newstart = qMin(curRow, _firstSelectionRow);
   int newend = qMax(curRow, _firstSelectionRow);
   int newstart = qMin(curRow, _firstSelectionRow);
   int newend = qMax(curRow, _firstSelectionRow);
-
   if(newstart < _selectionStart) {
     for(int l = newstart; l < _selectionStart; l++)
       _lines[l]->setSelected(true, minColumn);
   if(newstart < _selectionStart) {
     for(int l = newstart; l < _selectionStart; l++)
       _lines[l]->setSelected(true, minColumn);
index 17c009c..1dae1e2 100644 (file)
@@ -92,8 +92,7 @@ class ChatScene : public QGraphicsScene {
     ColumnHandleItem *firstColHandle, *secondColHandle;
     qreal firstColHandlePos, secondColHandlePos;
 
     ColumnHandleItem *firstColHandle, *secondColHandle;
     qreal firstColHandlePos, secondColHandlePos;
 
-    ChatItem *_selectingItem, *_lastItem;
-    QSet<ChatLine *> _selectedItems;
+    ChatItem *_selectingItem;
     int _selectionStartCol, _selectionMinCol;
     int _selectionStart;
     int _selectionEnd;
     int _selectionStartCol, _selectionMinCol;
     int _selectionStart;
     int _selectionEnd;