QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
GeoTagImageModel.cc
Go to the documentation of this file.
1#include "GeoTagImageModel.h"
3
4#include <QtCore/QFileInfo>
5
6QGC_LOGGING_CATEGORY(GeoTagImageModelLog, "AnalyzeView.GeoTagImageModel")
7
9 : QAbstractListModel(parent)
10{
11}
12
13GeoTagImageModel::~GeoTagImageModel()
14{
15}
16
17int GeoTagImageModel::rowCount(const QModelIndex &parent) const
18{
19 Q_UNUSED(parent);
20 return static_cast<int>(_images.count());
21}
22
23QVariant GeoTagImageModel::data(const QModelIndex &index, int role) const
24{
25 if (!index.isValid() || index.row() < 0 || index.row() >= _images.count()) {
26 return QVariant();
27 }
28
29 const ImageInfo &info = _images.at(index.row());
30
31 switch (role) {
32 case FileNameRole:
33 return info.fileName;
34 case FilePathRole:
35 return info.filePath;
36 case StatusRole:
37 return static_cast<int>(info.status);
38 case StatusStringRole:
39 return statusToString(info.status);
40 case ErrorMessageRole:
41 return info.errorMessage;
42 case CoordinateRole:
43 return QVariant::fromValue(info.coordinate);
44 default:
45 return QVariant();
46 }
47}
48
49QHash<int, QByteArray> GeoTagImageModel::roleNames() const
50{
51 return {
52 {FileNameRole, "fileName"},
53 {FilePathRole, "filePath"},
54 {StatusRole, "status"},
55 {StatusStringRole, "statusString"},
56 {ErrorMessageRole, "errorMessage"},
57 {CoordinateRole, "coordinate"}
58 };
59}
60
61void GeoTagImageModel::clear()
62{
63 if (_images.isEmpty()) {
64 return;
65 }
66
67 beginResetModel();
68 _images.clear();
69 endResetModel();
70
71 emit countChanged();
72}
73
74void GeoTagImageModel::addImage(const QString &filePath)
75{
76 const int row = _images.count();
77 beginInsertRows(QModelIndex(), row, row);
78
79 ImageInfo info;
80 info.filePath = filePath;
81 info.fileName = QFileInfo(filePath).fileName();
82 info.status = Pending;
83 _images.append(info);
84
85 endInsertRows();
86 emit countChanged();
87}
88
89void GeoTagImageModel::setStatus(int index, Status status, const QString &errorMessage)
90{
91 if (index < 0 || index >= _images.count()) {
92 return;
93 }
94
95 ImageInfo &info = _images[index];
96 if (info.status != status || info.errorMessage != errorMessage) {
97 info.status = status;
98 info.errorMessage = errorMessage;
99
100 const QModelIndex modelIndex = createIndex(index, 0);
101 emit dataChanged(modelIndex, modelIndex, {StatusRole, StatusStringRole, ErrorMessageRole});
102 }
103}
104
105void GeoTagImageModel::setCoordinate(int index, const QGeoCoordinate &coordinate)
106{
107 if (index < 0 || index >= _images.count()) {
108 return;
109 }
110
111 ImageInfo &info = _images[index];
112 if (info.coordinate != coordinate) {
113 info.coordinate = coordinate;
114
115 const QModelIndex modelIndex = createIndex(index, 0);
116 emit dataChanged(modelIndex, modelIndex, {CoordinateRole});
117 }
118}
119
120void GeoTagImageModel::setStatusByPath(const QString &filePath, Status status, const QString &errorMessage)
121{
122 for (int i = 0; i < _images.count(); ++i) {
123 if (_images.at(i).filePath == filePath) {
124 setStatus(i, status, errorMessage);
125 return;
126 }
127 }
128}
129
130void GeoTagImageModel::setAllStatus(Status status)
131{
132 if (_images.isEmpty()) {
133 return;
134 }
135
136 for (int i = 0; i < _images.count(); ++i) {
137 _images[i].status = status;
138 _images[i].errorMessage.clear();
139 }
140
141 emit dataChanged(createIndex(0, 0), createIndex(_images.count() - 1, 0),
142 {StatusRole, StatusStringRole, ErrorMessageRole});
143}
144
145QString GeoTagImageModel::statusToString(Status status)
146{
147 switch (status) {
148 case Pending:
149 return tr("Pending");
150 case Processing:
151 return tr("Processing");
152 case Tagged:
153 return tr("Tagged");
154 case Skipped:
155 return tr("Skipped");
156 case Failed:
157 return tr("Failed");
158 }
159 return QString();
160}
#define QGC_LOGGING_CATEGORY(name, categoryStr)
Model for displaying geotagging image status in QML.
QString errorMessage(const QNetworkReply *reply)