Skip to content

Commit

Permalink
[TASK] be very defensive in list models (dev)
Browse files Browse the repository at this point in the history
  • Loading branch information
jonaseberle committed Jun 27, 2023
1 parent 6606387 commit 013ce5f
Show file tree
Hide file tree
Showing 8 changed files with 78 additions and 35 deletions.
1 change: 1 addition & 0 deletions src/dialogs/BookedAtcDialog.cpp
Expand Up @@ -36,6 +36,7 @@ BookedAtcDialog::BookedAtcDialog(QWidget* parent)
_bookedAtcSortModel = new BookedAtcSortFilter;
_bookedAtcSortModel->setDynamicSortFilter(true);
_bookedAtcSortModel->setSourceModel(_bookedAtcModel);
_bookedAtcSortModel->setSortRole(Qt::UserRole);
treeBookedAtc->setUniformRowHeights(true);
treeBookedAtc->setModel(_bookedAtcSortModel);
treeBookedAtc->sortByColumn(0, Qt::AscendingOrder);
Expand Down
15 changes: 11 additions & 4 deletions src/models/AirportDetailsArrivalsModel.cpp
@@ -1,7 +1,6 @@
#include "AirportDetailsArrivalsModel.h"

#include "src/Airport.h"
#include "src/NavData.h"
#include "src/Settings.h"

#include <QFont>
Expand Down Expand Up @@ -43,7 +42,10 @@ QVariant AirportDetailsArrivalsModel::data(const QModelIndex &index, int role) c
if (!index.isValid() || index.row() >= _pilots.size()) {
return QVariant();
}
Pilot* p = _pilots[index.row()];
Pilot* p = _pilots.value(index.row(), nullptr);
if (p == nullptr) {
return QVariant();
}

if (index.column() == 8) {
const bool isFilteredArrival = Settings::filterTraffic() && (
Expand Down Expand Up @@ -146,7 +148,12 @@ QVariant AirportDetailsArrivalsModel::data(const QModelIndex &index, int role) c
}

void AirportDetailsArrivalsModel::modelSelected(const QModelIndex& index) const {
if (_pilots[index.row()]->hasPrimaryAction()) {
_pilots[index.row()]->primaryAction();
Pilot* p = _pilots.value(index.row(), nullptr);
if (p == nullptr) {
return;
}

if (p->hasPrimaryAction()) {
p->primaryAction();
}
}
14 changes: 11 additions & 3 deletions src/models/AirportDetailsDeparturesModel.cpp
Expand Up @@ -41,7 +41,10 @@ QVariant AirportDetailsDeparturesModel::data(const QModelIndex &index, int role)
return QVariant();
}

Pilot* p = _pilots[index.row()];
Pilot* p = _pilots.value(index.row(), nullptr);
if (p == nullptr) {
return QVariant();
}

if (index.column() == 6) {
const bool isFilteredDep = Settings::filterTraffic()
Expand Down Expand Up @@ -125,7 +128,12 @@ QVariant AirportDetailsDeparturesModel::data(const QModelIndex &index, int role)
}

void AirportDetailsDeparturesModel::modelSelected(const QModelIndex& index) const {
if (_pilots[index.row()]->hasPrimaryAction()) {
_pilots[index.row()]->primaryAction();
Pilot* p = _pilots.value(index.row(), nullptr);
if (p == nullptr) {
return;
}

if (p->hasPrimaryAction()) {
p->primaryAction();
}
}
22 changes: 13 additions & 9 deletions src/models/BookedAtcDialogModel.cpp
Expand Up @@ -35,13 +35,18 @@ QVariant BookedAtcDialogModel::data(const QModelIndex &index, int role) const {
return QVariant();
}

BookedController* c = _controllers.value(index.row(), nullptr);
if (c == nullptr) {
return QVariant();
}

if (role == Qt::FontRole) {
BookedController* c = _controllers[index.row()];
QFont result;
result.setBold(c->isFriend());
return result;
} else if (role == Qt::DisplayRole) {
BookedController* c = _controllers[index.row()];
}

if (role == Qt::DisplayRole) {
switch (index.column()) {
case 0: return c->callsign;
case 1: return c->facilityString();
Expand All @@ -51,17 +56,16 @@ QVariant BookedAtcDialogModel::data(const QModelIndex &index, int role) const {
case 5: return c->ends().time().toString("HHmm'z'");
case 6: return c->bookingInfoStr;
}
} else if (role == Qt::EditRole) { // we are faking "EditRole" to access raw data and for sorting
BookedController* c = _controllers[index.row()];
return QVariant();
}

if (role == Qt::UserRole) { // for sorting
switch (index.column()) {
case 0: return c->callsign;
case 1: return c->facilityString();
case 2: return c->realName();
case 3: return c->starts();
case 4: return c->starts();
case 5: return c->ends();
case 6: return c->bookingInfoStr;
}
return data(index, Qt::DisplayRole);
}

return QVariant();
Expand Down
13 changes: 8 additions & 5 deletions src/models/ListClientsDialogModel.cpp
Expand Up @@ -122,10 +122,13 @@ int ListClientsDialogModel::columnCount(const QModelIndex&) const {
}

void ListClientsDialogModel::modelSelected(const QModelIndex& index) {
if (_clients[index.row()] != 0) {
MapObject* m = dynamic_cast<MapObject*>(_clients[index.row()]);
if (m != 0 && m->hasPrimaryAction()) {
m->primaryAction();
}
Client* c = _clients.value(index.row(), nullptr);
if (c == nullptr) {
return;
}

MapObject* m = dynamic_cast<MapObject*>(c);
if (m != 0 && m->hasPrimaryAction()) {
m->primaryAction();
}
}
16 changes: 13 additions & 3 deletions src/models/MetarModel.cpp
Expand Up @@ -32,7 +32,10 @@ QVariant MetarModel::data(const QModelIndex &index, int role) const {
return QString("Too many airports match your search (%1)").arg(_airportList.size());
}

Airport* a = _metarList[index.row()];
Airport* a = _metarList.value(index.row(), nullptr);
if (a == nullptr) {
return QVariant();
}
switch (index.column()) {
case 0: return a->metar.encoded; break;
}
Expand All @@ -43,7 +46,10 @@ QVariant MetarModel::data(const QModelIndex &index, int role) const {
return QString("Too many airports match your search (%1)").arg(_airportList.size());
}

Airport* a = _metarList[index.row()];
Airport* a = _metarList.value(index.row(), nullptr);
if (a == nullptr) {
return QVariant();
}
switch (index.column()) {
case 0: return a->metar.humanHtml(); break;
}
Expand Down Expand Up @@ -88,7 +94,11 @@ void MetarModel::setAirports(const QList<Airport*>& airports) {

// remove all entries from metarList with invalid or dead METARs
for (int i = _metarList.size() - 1; i >= 0; i--) {
if (_metarList[i]->metar.needsRefresh() || _metarList[i]->metar.doesNotExist()) {
Airport* a = _metarList.value(i, nullptr);
if (a == nullptr) {
continue;
}
if (a->metar.needsRefresh() || a->metar.doesNotExist()) {
_metarList.removeAt(i);
}
}
Expand Down
15 changes: 10 additions & 5 deletions src/models/PlanFlightRoutesModel.cpp
Expand Up @@ -47,9 +47,12 @@ QVariant PlanFlightRoutesModel::data(const QModelIndex &index, int role) const {
if (!index.isValid() || index.row() >= _routes.size()) {
return QVariant();
}
Route* r = _routes.value(index.row(), nullptr);
if (r == nullptr) {
return QVariant();
}

if (role == Qt::DecorationRole) {
Route* r = _routes[index.row()];
switch (index.column()) {
case 0:
return QPixmap(
Expand All @@ -59,7 +62,10 @@ QVariant PlanFlightRoutesModel::data(const QModelIndex &index, int role) const {
)
.scaled(QSize(50, 25), Qt::KeepAspectRatio, Qt::SmoothTransformation);
}
} else if (role == Qt::DisplayRole) {
return QVariant();
}

if (role == Qt::DisplayRole) {
Route* r = _routes[index.row()];
switch (index.column()) {
case 1: return r->provider;
Expand All @@ -72,17 +78,16 @@ QVariant PlanFlightRoutesModel::data(const QModelIndex &index, int role) const {
QDateTime lastChange = QDateTime::fromString(r->lastChange, "yyyyMMddHHmmss");
if (lastChange.isValid()) {
return lastChange.date();
} else {
return r->lastChange;
}
return r->lastChange;
}
return QVariant();
}

return QVariant();
}

bool PlanFlightRoutesModel::setData(const QModelIndex&, const QVariant&, int) {
//qDebug() << "setData" << role << value;
return true;
}

Expand Down
17 changes: 11 additions & 6 deletions src/models/SearchResultModel.cpp
Expand Up @@ -21,8 +21,8 @@ QVariant SearchResultModel::data(const QModelIndex &index, int role) const {
}

if (role == Qt::DisplayRole || role == Qt::ToolTipRole) {
MapObject* o = _content[index.row()];
if (o == 0) {
MapObject* o = _content.value(index.row(), nullptr);
if (o == nullptr) {
return QVariant();
}
switch (index.column()) {
Expand All @@ -34,8 +34,8 @@ QVariant SearchResultModel::data(const QModelIndex &index, int role) const {

if (role == Qt::FontRole) {
QFont result;
MapObject* o = _content[index.row()];
if (o == 0) {
MapObject* o = _content.value(index.row(), nullptr);
if (o == nullptr) {
return result;
}
// prefiled italic
Expand Down Expand Up @@ -86,7 +86,12 @@ void SearchResultModel::setSearchResults(const QList<MapObject*> &searchResult)
}

void SearchResultModel::modelClicked(const QModelIndex& index) {
if (_content[index.row()]->hasPrimaryAction()) {
_content[index.row()]->primaryAction();
MapObject* o = _content.value(index.row(), nullptr);
if (o == nullptr) {
return;
}

if (o->hasPrimaryAction()) {
o->primaryAction();
}
}

0 comments on commit 013ce5f

Please sign in to comment.