aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--profile-widget/profilewidget2.cpp15
-rw-r--r--profile-widget/profilewidget2.h1
-rw-r--r--qt-models/divepicturemodel.cpp17
-rw-r--r--qt-models/divepicturemodel.h2
4 files changed, 32 insertions, 3 deletions
diff --git a/profile-widget/profilewidget2.cpp b/profile-widget/profilewidget2.cpp
index 85653d1fc..e8291e8e9 100644
--- a/profile-widget/profilewidget2.cpp
+++ b/profile-widget/profilewidget2.cpp
@@ -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)
diff --git a/profile-widget/profilewidget2.h b/profile-widget/profilewidget2.h
index 545c6475d..91774c9a9 100644
--- a/profile-widget/profilewidget2.h
+++ b/profile-widget/profilewidget2.h
@@ -110,6 +110,7 @@ slots: // Necessary to call from QAction's signals.
void replot(dive *d = 0);
#ifndef SUBSURFACE_MOBILE
void plotPictures();
+ void removePictures(const QModelIndex &, int first, int last);
void setPlanState();
void setAddState();
void changeGas();
diff --git a/qt-models/divepicturemodel.cpp b/qt-models/divepicturemodel.cpp
index 3fa1a07f4..48fa652c9 100644
--- a/qt-models/divepicturemodel.cpp
+++ b/qt-models/divepicturemodel.cpp
@@ -149,7 +149,22 @@ void DivePictureModel::removePictures(const QVector<QString> &fileUrls)
copy_dive(current_dive, &displayed_dive);
mark_divelist_changed(true);
- updateDivePictures();
+ for (int i = 0; i < pictures.size(); ++i) {
+ // Find range [i j) of pictures to remove
+ if (std::find(fileUrls.begin(), fileUrls.end(), pictures[i].filename) == fileUrls.end())
+ continue;
+ int j;
+ for (j = i + 1; j < pictures.size(); ++j) {
+ if (std::find(fileUrls.begin(), fileUrls.end(), pictures[j].filename) == fileUrls.end())
+ break;
+ }
+
+ // Qt's model-interface is surprisingly idiosyncratic: you don't pass [first last), but [first last] ranges.
+ // For example, an empty list would be [0 -1].
+ beginRemoveRows(QModelIndex(), i, j - 1);
+ pictures.erase(pictures.begin() + i, pictures.begin() + j);
+ endRemoveRows();
+ }
}
int DivePictureModel::rowCount(const QModelIndex &parent) const
diff --git a/qt-models/divepicturemodel.h b/qt-models/divepicturemodel.h
index 61eb1d984..a7a3d7180 100644
--- a/qt-models/divepicturemodel.h
+++ b/qt-models/divepicturemodel.h
@@ -30,7 +30,7 @@ public slots:
void updateThumbnail(QString filename, QImage thumbnail);
private:
DivePictureModel();
- QList<PictureEntry> pictures;
+ QVector<PictureEntry> pictures;
int findPictureId(const QString &filename); // Return -1 if not found
double zoomLevel; // -1.0: minimum, 0.0: standard, 1.0: maximum
int size;