Skip to content

Commit

Permalink
[FEATURE] mark filtered arrivals/departures in airport details dialog
Browse files Browse the repository at this point in the history
This visually highlights arrivals/departures that match the
arrivals/departure filter.

It also fixes sorting in the "TTG" (aka "ETA") column.

It also locates prefiled flights at the departure airport, giving us
"correct" distance to destination although the user has not yet
connected.
  • Loading branch information
jonaseberle committed Jun 25, 2023
1 parent e4fecbd commit 708ece4
Show file tree
Hide file tree
Showing 9 changed files with 90 additions and 36 deletions.
8 changes: 4 additions & 4 deletions src/Airac.cpp
Expand Up @@ -311,13 +311,13 @@ Waypoint* Airac::waypointNearby(const QString& input, double lat, double lon, do
if (NavData::instance()->airports.contains(input)) { // trying aerodromes
double d = NavData::distance(
lat, lon,
NavData::instance()->airports[input]->lat,
NavData::instance()->airports[input]->lon
NavData::instance()->airports.value(input)->lat,
NavData::instance()->airports.value(input)->lon
);
if ((d < minDist) && (d < maxDist)) {
result = new Waypoint(
input, NavData::instance()->airports[input]->lat,
NavData::instance()->airports[input]->lon
input, NavData::instance()->airports.value(input)->lat,
NavData::instance()->airports.value(input)->lon
);
minDist = d;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Metar.cpp
Expand Up @@ -338,7 +338,7 @@ QString Metar::humanHtml() const {
}

// LOWW 012020Z 35006KT 320V040 9999 -RA FEW060 SCT070 BKN080 08/05 Q1014 NOSIG
Airport* a = NavData::instance()->airports[tokens.first()];
Airport* a = NavData::instance()->airports.value(tokens.first());
if (a == 0) {
result = tokens.first();
} else {
Expand Down
21 changes: 11 additions & 10 deletions src/NavData.cpp
Expand Up @@ -62,7 +62,7 @@ void NavData::loadAirports(const QString& filename) {
continue;
}

airports[airport->id] = airport;
airports.insert(airport->id, airport);
}

if (countMissingCountry != 0) {
Expand Down Expand Up @@ -224,7 +224,7 @@ void NavData::updateData(const WhazzupData& whazzupData) {
if (p == 0) {
continue;
}
Airport* dep = airports.value(p->planDep, 0);
Airport* dep = p->depAirport();
if (dep != 0) {
dep->addDeparture(p);
newActiveAirportsSet.insert(dep);
Expand All @@ -242,20 +242,21 @@ void NavData::updateData(const WhazzupData& whazzupData) {
newActiveAirportsSet.insert(a);
}
}
Airport* dest = airports.value(p->planDest, 0);
Airport* dest = p->destAirport();
if (dest != 0) {
dest->addArrival(p);
newActiveAirportsSet.insert(dest);
if (
!Settings::filterTraffic()
|| (
(p->distanceToDestination() < Settings::filterDistance())
|| (p->eet().hour() + p->eet().minute() / 60. < Settings::filterArriving())
(
!Settings::filterTraffic()
|| (
(p->distanceToDestination() < Settings::filterDistance())
|| (p->eet().hour() + p->eet().minute() / 60. < Settings::filterArriving())
)
)
&& (p->flightStatus() != Pilot::FlightStatus::BLOCKED && p->flightStatus() != Pilot::FlightStatus::GROUND_ARR)
) {
if (p->flightStatus() != Pilot::FlightStatus::BLOCKED && p->flightStatus() != Pilot::FlightStatus::GROUND_ARR) {
dest->nMaybeFilteredArrivals++;
}
dest->nMaybeFilteredArrivals++;
}
}
}
Expand Down
8 changes: 8 additions & 0 deletions src/Pilot.cpp
Expand Up @@ -357,6 +357,14 @@ double Pilot::distanceToDestination() const {
return 0;
}

if (flightStatus() == Pilot::PREFILED) {
Airport* dep = depAirport();
if (dep == 0) {
return 0;
}
return NavData::distance(dep->lat, dep->lon, dest->lat, dest->lon);
}

return NavData::distance(lat, lon, dest->lat, dest->lon);
}

Expand Down
2 changes: 1 addition & 1 deletion src/QuteScoop.cpp
Expand Up @@ -111,7 +111,7 @@ int main(int argc, char* argv[]) {
route.prepend(depString);
QTextStream(stdout) << "\n# Flightplan route:\n" << route.join(" ") << Qt::endl;

const auto dep = NavData::instance()->airports[depString];
const auto dep = NavData::instance()->airports.value(depString, 0);
if (dep == 0) {
QTextStream(stdout) << "ERROR: departure aerodrome not found in database" << Qt::endl;
return 1;
Expand Down
14 changes: 3 additions & 11 deletions src/Route.cpp
Expand Up @@ -8,17 +8,9 @@ Route::Route() {}
Route::~Route() {}

void Route::calculateWaypointsAndDistance() {
Airport* depAirport;
if (NavData::instance()->airports.contains(dep)) {
depAirport = NavData::instance()->airports[dep];
} else {
return;
}

Airport* destAirport;
if (NavData::instance()->airports.contains(dest)) {
destAirport = NavData::instance()->airports[dest];
} else {
Airport* depAirport = NavData::instance()->airports.value(dep, 0);
Airport* destAirport = NavData::instance()->airports.value(dest, 0);
if (depAirport == 0 || destAirport == 0) {
return;
}

Expand Down
6 changes: 6 additions & 0 deletions src/WhazzupData.cpp
Expand Up @@ -88,6 +88,12 @@ WhazzupData::WhazzupData(QByteArray* bytes, WhazzupType type)
for (int i = 0; i < prefilesArray.size(); ++i) {
QJsonObject prefileObject = prefilesArray[i].toObject();
Pilot* p = new Pilot(prefileObject, this);
// currently not possible. Logic relies on lat=0, lon=0 for prefiles
// auto* a = p->depAirport();
// if (a != 0) {
// p->lat = a->lat;
// p->lon = a->lon;
// }
bookedPilots[p->callsign] = p;
}
}
Expand Down
49 changes: 41 additions & 8 deletions src/models/AirportDetailsArrivalsModel.cpp
@@ -1,6 +1,8 @@
#include "AirportDetailsArrivalsModel.h"

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

#include <QFont>

Expand Down Expand Up @@ -43,6 +45,22 @@ QVariant AirportDetailsArrivalsModel::data(const QModelIndex &index, int role) c
}
Pilot* p = _pilots[index.row()];

if (index.column() == 8) {
const bool isFilteredArrival = Settings::filterTraffic() && (
(p->distanceToDestination() < Settings::filterDistance())
|| (p->eet().hour() + p->eet().minute() / 60. < Settings::filterArriving())
)
&& (p->flightStatus() != Pilot::FlightStatus::BLOCKED && p->flightStatus() != Pilot::FlightStatus::GROUND_ARR);

if (isFilteredArrival) {
if (role == Qt::ForegroundRole) {
return QGuiApplication::palette().window();
} else if (role == Qt::BackgroundRole) {
return QGuiApplication::palette().text();
}
}
}

if (role == Qt::FontRole) {
QFont result;
if (p->flightStatus() == Pilot::PREFILED) {
Expand All @@ -51,8 +69,11 @@ QVariant AirportDetailsArrivalsModel::data(const QModelIndex &index, int role) c
if (p->isFriend()) {
result.setBold(true);
}

return result;
} else if (role == Qt::TextAlignmentRole) {
}

if (role == Qt::TextAlignmentRole) {
switch (index.column()) {
case 6:
case 7:
Expand All @@ -65,7 +86,9 @@ QVariant AirportDetailsArrivalsModel::data(const QModelIndex &index, int role) c
}

return Qt::AlignLeft;
} else if (role == Qt::DisplayRole) {
}

if (role == Qt::DisplayRole) {
switch (index.column()) {
case 0:
return p->callsign;
Expand All @@ -82,10 +105,10 @@ QVariant AirportDetailsArrivalsModel::data(const QModelIndex &index, int role) c
case 6:
return p->altitude == 0? QString(""): p->humanAlt();
case 7:
if (p->flightStatus() == Pilot::PREFILED) {
return "";
if (p->distanceToDestination() < 3) {
return "-";
} else {
return QString("%1 NM").arg(p->distanceToDestination() < 3? 0: (int) p->distanceToDestination());
return QString("%1 NM").arg((int) p->distanceToDestination());
}
case 8:
if (p->flightStatus() == Pilot::GROUND_ARR || p->flightStatus() == Pilot::BLOCKED) {
Expand All @@ -100,10 +123,20 @@ QVariant AirportDetailsArrivalsModel::data(const QModelIndex &index, int role) c
case 10:
return p->flightStatusShortString();
}
} else if (role == Qt::UserRole) { // used for sorting

return QVariant();
}

if (role == Qt::UserRole) { // used for sorting
switch (index.column()) {
case 7:
return p->flightStatus() == Pilot::PREFILED? -1: p->distanceToDestination();
return p->distanceToDestination();
case 8:
auto eta = p->eta();
if (!eta.isValid()) {
return 0;
}
return eta.toSecsSinceEpoch();
}

return data(index, Qt::DisplayRole);
Expand Down
16 changes: 15 additions & 1 deletion src/models/AirportDetailsDeparturesModel.cpp
@@ -1,6 +1,7 @@
#include "AirportDetailsDeparturesModel.h"

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

#include <QFont>

Expand Down Expand Up @@ -42,6 +43,19 @@ QVariant AirportDetailsDeparturesModel::data(const QModelIndex &index, int role)

Pilot* p = _pilots[index.row()];

if (index.column() == 6) {
const bool isFilteredDep = Settings::filterTraffic()
&& p->distanceFromDeparture() < Settings::filterDistance();

if (isFilteredDep) {
if (role == Qt::ForegroundRole) {
return QGuiApplication::palette().window();
} else if (role == Qt::BackgroundRole) {
return QGuiApplication::palette().text();
}
}
}

if (role == Qt::FontRole) {
QFont result;
if (p->flightStatus() == Pilot::PREFILED) {
Expand Down

0 comments on commit 708ece4

Please sign in to comment.