Dive pictures: don't repopulate DivePictureModel on deletion

On deletion of a single or multiple pictures, the whole DivePictureModel
was repopulated, which was clearly visible in the UI, owing to the
reconstructing of all images in the profile plot.

To avoid this vexing behavior, implement proper deletion routines in
DivePictureModel and ProfileWidget2. Since this needs sensible erase()
semantics the QList<PictureEntry> member of DivePictureModel was
replaced by a QVector. A QVector should be the default anyway, unless
there are very specific reasons to use a QList (which actually is
a deque, not a classical linked list).

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2018-05-19 21:18:39 +02:00 committed by Lubomir I. Ivanov
parent 3c0c1801cd
commit f47f2773fd
4 changed files with 32 additions and 3 deletions

View file

@ -1118,7 +1118,7 @@ void ProfileWidget2::setProfileState()
#ifndef SUBSURFACE_MOBILE
connect(DivePictureModel::instance(), &DivePictureModel::dataChanged, this, &ProfileWidget2::updatePictures);
connect(DivePictureModel::instance(), SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SLOT(plotPictures()));
connect(DivePictureModel::instance(), SIGNAL(rowsRemoved(const QModelIndex &, int, int)), this, SLOT(plotPictures()));
connect(DivePictureModel::instance(), &DivePictureModel::rowsRemoved, this, &ProfileWidget2::removePictures);
connect(DivePictureModel::instance(), &DivePictureModel::modelReset, this, &ProfileWidget2::plotPictures);
#endif
/* show the same stuff that the profile shows. */
@ -2089,6 +2089,19 @@ void ProfileWidget2::plotPictures()
item->setPos(x, y);
}
}
void ProfileWidget2::removePictures(const QModelIndex &, int first, int last)
{
DivePictureModel *m = DivePictureModel::instance();
first = std::max(0, first - m->rowDDStart);
// Note that last points *to* the last item and not *past* the last item,
// therefore we add 1 to achieve conventional C++ semantics.
last = std::min((int)pictures.size(), last + 1 - m->rowDDStart);
if (first >= (int)pictures.size() || last <= first)
return;
pictures.erase(pictures.begin() + first, pictures.begin() + last);
}
#endif
void ProfileWidget2::dropEvent(QDropEvent *event)