media: turn DivePictureModel::pictures into std::vector

QVector doesn't have a function to insert a range of pictures,
which we will need for undo of image adding/deletion.

Moreover, std::vector gives us stronger guarantees. For example,
if capacity is large enough, it guarantees that there will be
no reallocation and thus iterators stay valid. I have not found
such a guarantee in the Qt docs.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2020-04-17 22:43:43 +02:00 committed by Dirk Hohndel
parent fe82cb32b9
commit 9962d47b56
2 changed files with 7 additions and 8 deletions

View file

@ -52,7 +52,7 @@ void DivePictureModel::updateThumbnails()
void DivePictureModel::updateDivePictures()
{
beginResetModel();
if (!pictures.isEmpty()) {
if (!pictures.empty()) {
pictures.clear();
Thumbnailer::instance()->clearWorkQueue();
}
@ -61,7 +61,7 @@ void DivePictureModel::updateDivePictures()
struct dive *dive;
for_each_dive (i, dive) {
if (dive->selected) {
int first = pictures.count();
size_t first = pictures.size();
FOR_EACH_PICTURE(dive)
pictures.push_back({ dive, picture->filename, {}, picture->offset.seconds, {.seconds = 0}});
@ -141,11 +141,11 @@ void DivePictureModel::removePictures(const QVector<QString> &fileUrlsIn)
copy_dive(current_dive, &displayed_dive);
mark_divelist_changed(true);
for (int i = 0; i < pictures.size(); ++i) {
for (size_t 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;
size_t j;
for (j = i + 1; j < pictures.size(); ++j) {
if (std::find(fileUrls.begin(), fileUrls.end(), pictures[j].filename) == fileUrls.end())
break;
@ -162,12 +162,12 @@ void DivePictureModel::removePictures(const QVector<QString> &fileUrlsIn)
int DivePictureModel::rowCount(const QModelIndex&) const
{
return pictures.count();
return (int)pictures.size();
}
int DivePictureModel::findPictureId(const std::string &filename)
{
for (int i = 0; i < pictures.size(); ++i)
for (int i = 0; i < (int)pictures.size(); ++i)
if (pictures[i].filename == filename)
return i;
return -1;

View file

@ -6,7 +6,6 @@
#include <QAbstractTableModel>
#include <QImage>
#include <QFuture>
// We use std::string instead of QString to use the same character-encoding
// as in the C core (UTF-8). This is crucial to guarantee the same sort-order.
@ -36,7 +35,7 @@ public slots:
void pictureOffsetChanged(dive *d, const QString filename, offset_t offset);
private:
DivePictureModel();
QVector<PictureEntry> pictures;
std::vector<PictureEntry> pictures;
int findPictureId(const std::string &filename); // Return -1 if not found
double zoomLevel; // -1.0: minimum, 0.0: standard, 1.0: maximum
int size;