+void ChatScene::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) {
+ Q_UNUSED(parent);
+
+ qreal h = 0; // total height of removed items;
+
+ bool atTop = (start == 0);
+ bool atBottom = (end == _lines.count() - 1);
+ bool moveTop = false;
+
+ // remove items from scene
+ QList<ChatLine *>::iterator lineIter = _lines.begin() + start;
+ int lineCount = start;
+ while(lineIter != _lines.end() && lineCount <= end) {
+ h += (*lineIter)->height();
+ delete *lineIter;
+ lineIter = _lines.erase(lineIter);
+ lineCount++;
+ }
+
+ // update rows of remaining chatlines
+ for(int i = start; i < _lines.count(); i++) {
+ _lines.at(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;
+ }
+
+ // neither removing at bottom or top means we have to move items...
+ if(!(atTop || atBottom)) {
+ qreal offset = h;
+ int moveStart = 0;
+ int moveEnd = _lines.count() - 1;
+ ChatLine *line = 0;
+ if(start > _lines.count() - end) {
+ // move top part
+ moveTop = true;
+ moveEnd = start - 1;
+ } else {
+ // move bottom part
+ moveStart = start;
+ offset = -offset;
+ }
+ for(int i = moveStart; i <= moveEnd; i++) {
+ line = _lines.at(i);
+ line->setPos(0, line->pos().y() + offset);
+ }