24#include <QAbstractListModel>
27#include <QQmlComponent>
30#include <simgear/misc/strutils.hxx>
31#include <simgear/structure/exception.hxx>
59 for (
const auto& pos : posList) {
61 vm.insert(
"ident", QString::fromStdString(pos->ident()));
62 vm.insert(
"type", pos->type());
63 vm.insert(
"lat", pos->geod().getLatitudeDeg());
64 vm.insert(
"lon", pos->geod().getLongitudeDeg());
72 QVariantList vl = v.toList();
74 result.reserve(
static_cast<size_t>(vl.size()));
77 Q_FOREACH(QVariant v, vl) {
78 QVariantMap vm = v.toMap();
79 std::string ident(vm.value(
"ident").toString().toStdString());
80 double lat = vm.value(
"lat").toDouble();
81 double lon = vm.value(
"lon").toDouble();
85 SGGeod::fromDeg(lon, lat),
88 result.push_back(pos);
97 qmlRegisterUncreatableType<QmlPositionedModel>(
"FlightGear.Launcher", 1, 0,
"QmlPositionedModel",
"no");
128 connect(m_config, &
LaunchConfig::save,
this, &LocationController::onSaveCurrentLocation);
138void LocationController::onRestoreCurrentLocation()
140 QVariantMap vm = m_config->
getValueForKey(
"",
"current-location", QVariantMap()).toMap();
147void LocationController::onSaveCurrentLocation()
149 m_config->setValueForKey(
"",
"current-location",
saveLocation());
154 if (m_airportLocation) {
155 if (m_useAvailableParking)
170 const bool altIsPositive = (m_altitude.value > 0);
172 if (m_locationIsLatLon) {
173 return m_altitudeEnabled && altIsPositive;
176 if (m_airportLocation) {
177 const bool onRunway =
181 if (onRunway && m_onFinal) {
191 return m_altitudeEnabled && altIsPositive;
196 return m_offsetRadial;
201 if (m_locationIsLatLon && (m_geodLocation == geod.
geod()))
205 m_locationIsLatLon =
true;
206 m_geodLocation = geod.
geod();
212 return m_carrierName;
217 const auto cIndex = m_carriersModel->indexOf(
name);
220 qWarning() <<
"invalid carrier name:" <<
name;
224 m_locationIsCarrier =
true;
225 m_carrierName =
name;
226 m_geodLocation = m_carriersModel->geodForIndex(cIndex);
227 m_carrierParkings = m_carriersModel->parkingsForIndex(cIndex);
232void LocationController::clearLocation()
234 m_locationIsLatLon =
false;
235 m_locationIsCarrier =
false;
238 m_carrierName.clear();
239 m_airportLocation.clear();
240 m_detailLocation.clear();
243 m_carrierParkings.clear();
244 m_carrierParking.clear();
245 m_runwaysModel->
clear();
246 m_helipadsModel->
clear();
247 m_parkingsModel->
clear();
258 if (pos->
inner() == m_location)
262 m_location = pos->
inner();
263 m_baseQml->setGuid(pos->
guid());
266 m_airportLocation =
static_cast<FGAirport*
>(m_location.ptr());
268 if (m_airportLocation->isHeliport()) {
270 m_useActiveRunway =
false;
273 updateAirportModels();
275 m_airportLocation.clear();
282void LocationController::updateAirportModels()
284 m_runwaysModel->
setValues(m_airportLocation->getRunways());
287 for (
unsigned int r = 0; r < m_airportLocation->numHelipads(); ++r) {
288 helipads.push_back(m_airportLocation->getHelipadByIndex(r));
291 m_helipadsModel->setValues(helipads);
292 m_parkingsModel->setValues(m_airportLocation->groundNetwork()->allParkings());
297 if (pos && (pos->
inner() == m_detailLocation))
301 m_detailLocation.clear();
302 m_detailQml->setInner({});
304 m_detailLocation = pos->
inner();
305 m_useActiveRunway =
false;
306 m_useAvailableParking =
false;
307 m_detailQml->setInner(pos->
inner());
315 if (m_locationIsLatLon || m_locationIsCarrier)
316 return m_geodLocation;
319 return QmlGeod(m_location->geod());
326 return m_airportLocation;
331 if (b == m_useActiveRunway)
334 m_useActiveRunway = b;
335 if (m_useActiveRunway) {
336 m_detailLocation.clear();
337 m_useAvailableParking =
false;
353 const std::string tutorialICAO =
"PHTO";
356 auto it = std::remove_if(locs.begin(), locs.end(),
359 return (pos->ident() == defaultICAO) || (pos->ident() == tutorialICAO);
361 locs.erase(it, locs.end());
366 locs.insert(locs.begin(), apt);
368 qWarning() << Q_FUNC_INFO <<
"couldn't find tutorial airport for:" << QString::fromStdString(tutorialICAO);
373 locs.insert(locs.begin(), apt);
375 qWarning() << Q_FUNC_INFO <<
"couldn't find default airport for:" << QString::fromStdString(defaultICAO);
380 m_searchModel->setItems(locs);
386 if (!simgear::strutils::parseStringAsGeod(
string.toStdString(), &g)) {
395 if (!m_locationIsCarrier)
397 return m_carrierParking;
402 if (!m_locationIsCarrier) {
403 qWarning() <<
"active location is not a carrier";
407 if (m_carrierParking ==
name)
410 if (!m_carrierParkings.contains(
name)) {
411 qWarning() <<
"parking '" <<
name <<
"' not found in carrier parking list";
415 m_carrierParking =
name;
416 m_useCarrierFLOLS =
false;
432 return m_carrierParkings;
446 if (m_offsetDistance == d)
449 m_offsetDistance = d;
486 if (m_useAvailableParking) {
487 m_detailLocation.clear();
488 m_useActiveRunway =
false;
495 if (!m_locationIsCarrier) {
496 qWarning() <<
"location is not a carrier";
504 m_carrierParking.clear();
519 m_altitudeEnabled = l.contains(
"altitude");
520 m_speedEnabled = l.contains(
"speed");
521 m_headingEnabled = l.contains(
"heading");
523 m_altitude = l.value(
"altitude", QVariant::fromValue(m_defaultAltitude)).value<
QuantityValue>();
524 m_airspeed = l.
value(
"speed", QVariant::fromValue(m_defaultAirspeed)).value<
QuantityValue>();
525 m_heading = l.
value(
"heading", QVariant::fromValue(m_defaultHeading)).value<
QuantityValue>();
527 m_offsetEnabled = l.
value(
"offset-enabled").toBool();
528 m_offsetRadial = l.value(
"offset-bearing", QVariant::fromValue(m_defaultOffsetRadial)).value<
QuantityValue>();
529 m_offsetDistance = l.
value(
"offset-distance", QVariant::fromValue(m_defaultOffsetDistance)).value<
QuantityValue>();
530 m_tuneNAV1 = l.
value(
"tune-nav1-radio").toBool();
532 if (l.contains(
"carrier")) {
534 if (l.contains(
"carrier-flols")) {
536 setAbeam(l.value(
"abeam").toBool());
538 m_offsetDistance = l.value(
"location-carrier-flols-distance", QVariant::fromValue(m_defaultOffsetDistance)).value<
QuantityValue>();
539 }
else if (l.contains(
"carrier-parking")) {
542 }
else if (l.contains(
"location-apt")) {
543 const auto icao = l.value(
"location-apt").toString().toStdString();
545 m_location = m_airportLocation;
546 m_baseQml->setInner(m_location);
547 }
else if (l.contains(
"location-navaid")) {
548 const auto ident = l.value(
"location-navaid").toString().toStdString();
551 const SGGeod vicinity = SGGeod::fromDeg(l.value(
"vicinity-lon").toDouble(),
552 l.value(
"vicinity-lat").toDouble());
556 const auto isTacan = l.value(
"location-is-tacan").toBool();
566 m_baseQml->setInner(m_location);
567 }
else if (l.contains(
"location-lat")) {
568 m_locationIsLatLon =
true;
569 m_geodLocation = SGGeod::fromDeg(l.value(
"location-lon").toDouble(),
570 l.value(
"location-lat").toDouble());
573 if (m_airportLocation) {
574 m_useActiveRunway =
false;
575 m_useAvailableParking =
false;
577 if (l.contains(
"location-apt-runway")) {
578 QString runway = l.value(
"location-apt-runway").toString().toUpper();
579 const auto runwayStr = runway.toStdString();
580 if (runway == QStringLiteral(
"ACTIVE")) {
581 m_useActiveRunway =
true;
582 }
else if (m_airportLocation->isHeliport()) {
583 m_detailLocation = m_airportLocation->getHelipadByIdent(runwayStr);
586 if (m_airportLocation->hasHelipadWithIdent(runwayStr)) {
587 m_detailLocation = m_airportLocation->getHelipadByIdent(runwayStr);
589 m_detailLocation = m_airportLocation->getRunwayByIdent(runwayStr);
592 }
else if (l.contains(
"location-apt-parking")) {
593 QString parking = l.value(
"location-apt-parking").toString();
594 if (parking == QStringLiteral(
"AVAILABLE")) {
595 m_useAvailableParking =
true;
597 m_detailLocation = m_airportLocation->groundNetwork()->findParkingByName(parking.toStdString());
601 if (m_detailLocation) {
602 m_detailQml->setInner(m_detailLocation);
605 m_onFinal = l.value(
"location-on-final").toBool();
606 setAbeam(l.value(
"abeam").toBool());
607 m_offsetDistance = l.value(
"location-apt-final-distance", QVariant::fromValue(m_defaultOffsetDistance)).value<
QuantityValue>();
608 updateAirportModels();
611 }
catch (
const sg_exception&) {
612 qWarning() <<
"Errors restoring saved location, clearing";
623 if (m_useCarrierFLOLS) {
631 if (m_airportLocation) {
641 QVariantMap locationSet;
642 if (m_locationIsLatLon) {
643 locationSet.insert(
"location-lat", m_geodLocation.getLatitudeDeg());
644 locationSet.insert(
"location-lon", m_geodLocation.getLongitudeDeg());
645 }
else if (m_locationIsCarrier) {
646 locationSet.insert(
"carrier", m_carrierName);
647 if (m_useCarrierFLOLS) {
648 locationSet.insert(
"carrier-flols",
true);
649 locationSet.insert(
"location-carrier-flols-distance", QVariant::fromValue(m_offsetDistance));
650 locationSet.insert(
"abeam", m_abeam);
651 }
else if (!m_carrierParking.isEmpty()) {
652 locationSet.insert(
"carrier-parking", m_carrierParking);
654 }
else if (m_location) {
655 if (m_airportLocation) {
656 locationSet.insert(
"location-apt", QString::fromStdString(m_airportLocation->ident()));
657 locationSet.insert(
"location-on-final", m_onFinal);
658 locationSet.insert(
"location-apt-final-distance", QVariant::fromValue(m_offsetDistance));
659 locationSet.insert(
"abeam", m_abeam);
660 if (m_useActiveRunway) {
661 locationSet.insert(
"location-apt-runway",
"ACTIVE");
662 }
else if (m_useAvailableParking) {
663 locationSet.insert(
"location-apt-parking",
"AVAILABLE");
664 }
else if (m_detailLocation) {
665 const auto detailType = m_detailLocation->type();
667 locationSet.insert(
"location-apt-runway", QString::fromStdString(m_detailLocation->ident()));
669 locationSet.insert(
"location-apt-parking", QString::fromStdString(m_detailLocation->ident()));
674 locationSet.insert(
"location-navaid", QString::fromStdString(m_location->ident()));
678 locationSet.insert(
"location-is-tacan",
true);
680 locationSet.insert(
"vicinity-lat", m_location->geod().getLatitudeDeg());
681 locationSet.insert(
"vicinity-lon", m_location->geod().getLongitudeDeg());
686 if (m_altitudeEnabled) {
687 locationSet.insert(
"altitude", QVariant::fromValue(m_altitude));
690 if (m_speedEnabled) {
691 locationSet.insert(
"speed", QVariant::fromValue(m_airspeed));
694 if (m_headingEnabled) {
695 locationSet.insert(
"heading", QVariant::fromValue(m_heading));
698 if (m_offsetEnabled) {
699 locationSet.insert(
"offset-enabled", m_offsetEnabled);
700 locationSet.insert(
"offset-bearing", QVariant::fromValue(m_offsetRadial));
701 locationSet.insert(
"offset-distance", QVariant::fromValue(m_offsetDistance));
705 locationSet.insert(
"tune-nav1-radio", m_tuneNAV1);
712 SGPropertyNode_ptr presets =
fgGetNode(
"/sim/presets",
true);
714 QStringList props = QStringList() <<
"vor-id"
718 <<
"runway-requested"
720 <<
"offset-azimuth-deg"
721 <<
"offset-distance-nm"
730 <<
"carrier-position";
732 Q_FOREACH(QString s, props) {
733 SGPropertyNode* c = presets->getChild(s.toStdString());
739 if (m_locationIsLatLon) {
740 fgSetDouble(
"/sim/presets/latitude-deg", m_geodLocation.getLatitudeDeg());
741 fgSetDouble(
"/position/latitude-deg", m_geodLocation.getLatitudeDeg());
742 fgSetDouble(
"/sim/presets/longitude-deg", m_geodLocation.getLongitudeDeg());
743 fgSetDouble(
"/position/longitude-deg", m_geodLocation.getLongitudeDeg());
745 applyPositionOffset();
756 if (m_locationIsCarrier) {
757 fgSetString(
"/sim/presets/carrier", m_carrierName.toStdString());
759 if (m_useCarrierFLOLS) {
761 fgSetString(
"/sim/presets/carrier-position",
"abeam");
763 fgSetString(
"/sim/presets/carrier-position",
"FLOLS");
768 }
else if (!m_carrierParking.isEmpty()) {
769 fgSetString(
"/sim/presets/carrier-position", m_carrierParking.toStdString());
774 qInfo() <<
"Implement TACAN tuning";
783 if (m_airportLocation) {
784 fgSetString(
"/sim/presets/airport-id", m_airportLocation->ident());
785 fgSetBool(
"/sim/presets/on-ground",
true);
786 fgSetBool(
"/sim/presets/airport-requested",
true);
787 fgSetBool(
"/sim/presets/abeam", m_abeam);
791 if (m_useActiveRunway) {
794 }
else if (m_useAvailableParking) {
796 }
else if (onRunway) {
799 fgSetString(
"/sim/presets/runway", m_detailLocation->ident() );
800 fgSetBool(
"/sim/presets/runway-requested",
true );
804 if (m_tuneNAV1 && runway->
ILS()) {
807 fgSetDouble(
"/instrumentation/nav[0]/frequencies/selected-mhz", mhz);
813 fgSetBool(
"/sim/presets/on-ground",
false);
817 fgSetString(
"/sim/presets/runway", m_detailLocation->ident() );
818 fgSetBool(
"/sim/presets/runway-requested",
true );
820 }
else if (atParking) {
822 fgSetString(
"/sim/presets/parkpos", m_detailLocation->ident());
825 updateAirportModels();
837 fgSetString(
"/sim/presets/vor-id", m_location->ident());
842 fgSetString(
"/sim/presets/ndb-id", m_location->ident());
847 fgSetString(
"/sim/presets/fix", m_location->ident());
852 fgSetString(
"/sim/presets/tacan-id", m_location->ident());
860 globals->get_props()->setIntValue(
"/sim/presets/navaid-id",
861 static_cast<int>(m_location->guid()));
863 applyPositionOffset();
869void LocationController::applyAirspeed()
873 m_config->
setArg(
"vc", QString::number(m_airspeed.
value));
875 const double vc = m_airspeed.convertToUnit(
Units::Knots).value;
876 m_config->setArg(
"vc", QString::number(vc));
878 m_config->setArg(
"mach", QString::number(m_airspeed.value));
880 qWarning() << Q_FUNC_INFO <<
"unsupported airpseed unit" << m_airspeed.unit;
885void LocationController::applyPositionOffset()
889 m_config->setArg(
"heading", QString::number(m_heading.value));
891 qWarning() << Q_FUNC_INFO <<
"unsupported heading unit" << m_heading.unit;
895 if (m_offsetEnabled) {
899 int offsetAzimuth =
static_cast<int>(m_offsetRadial.value) - 180;
900 m_config->setArg(
"offset-azimuth", QString::number(offsetAzimuth));
902 m_config->setArg(
"offset-distance", QString::number(offsetNm));
906void LocationController::applyAltitude()
908 if (!m_altitudeEnabled)
911 switch (m_altitude.unit) {
913 qWarning() << Q_FUNC_INFO <<
"unsupported altitude unit";
916 m_config->setArg(
"altitude", QString::number(m_altitude.value));
921 m_config->setArg(
"altitude", QString::number(m_altitude.value));
926 m_config->setArg(
"altitude", QString::number(m_altitude.value * 100));
930 m_config->setArg(
"altitude", QString::number(m_altitude.value));
934 const double ftMSL = m_altitude.convertToUnit(
Units::FeetMSL).value;
935 m_config->setArg(
"altitude", QString::number(ftMSL));
940void LocationController::applyOnFinal()
943 if (!m_altitudeEnabled) {
944 m_config->setArg(
"glideslope", std::string(
"3.0"));
948 m_config->setArg(
"offset-distance", QString::number(offsetNm));
949 m_config->setArg(
"in-air", std::string(
""));
956void LocationController::onCollectConfig()
958 if (m_skipFromArgs) {
959 qWarning() << Q_FUNC_INFO <<
"skipping argument collection";
963 if (m_locationIsLatLon) {
964 m_config->setArg(
"lat", QString::number(m_geodLocation.getLatitudeDeg(),
'f', 8));
965 m_config->setArg(
"lon", QString::number(m_geodLocation.getLongitudeDeg(),
'f', 8));
966 applyPositionOffset();
972 if (m_locationIsCarrier) {
973 m_config->setArg(
"carrier", m_carrierName);
975 if (!m_carrierParking.isEmpty()) {
976 m_config->setArg(
"carrier-position", m_carrierParking);
977 }
else if (m_useCarrierFLOLS) {
979 m_config->setArg(
"carrier-position", QStringLiteral(
"abeam"));
981 m_config->setArg(
"carrier-position", QStringLiteral(
"FLOLS"));
984 m_config->setArg(
"offset-distance", QString::number(offsetNm));
997 if (m_airportLocation) {
998 m_config->setArg(
"airport", QString::fromStdString(m_airportLocation->ident()));
1003 if (m_useActiveRunway) {
1006 }
else if (m_useAvailableParking) {
1007 m_config->setArg(
"parking-id", QStringLiteral(
"AVAILABLE"));
1008 }
else if (onRunway) {
1010 m_config->setArg(
"runway", QString::fromStdString(m_detailLocation->ident()));
1015 if (runway->ILS()) {
1016 double mhz = runway->ILS()->get_freq() / 100.0;
1017 m_config->setArg(
"nav1", QString(
"%1:%2").arg(runway->headingDeg()).arg(mhz));
1024 m_config->setArg(
"runway", QString::fromStdString(m_detailLocation->ident()));
1026 }
else if (atParking) {
1028 m_config->setArg(
"parking-id", QString::fromStdString(m_detailLocation->ident()));
1039 m_config->setArg(
"vor", m_location->ident());
1040 setNavRadioOption();
1044 m_config->setArg(
"ndb", m_location->ident());
1045 setNavRadioOption();
1049 m_config->setArg(
"fix", m_location->ident());
1053 m_config->setArg(
"tacan", m_location->ident());
1061 m_config->setProperty(
"/sim/presets/navaid-id", QString::number(m_location->guid()));
1062 applyPositionOffset();
1068void LocationController::setNavRadioOption()
1075 double mhz = nav->get_freq() / 100.0;
1077 QString navOpt = QString(
"%1:%2").arg(
heading).arg(mhz);
1078 m_config->setArg(
"nav1", navOpt);
1081 int khz = nav->get_freq() / 100;
1083 QString adfOpt = QString(
"%1:%2").arg(
heading).arg(khz);
1084 m_config->setArg(
"adf1", adfOpt);
1088QString LocationController::compassPointFromHeading(
int heading)
const
1090 const int labelArc = 360 / 8;
1092 SG_NORMALIZE_RANGE(
heading, 0, 359);
1096 case 0:
return tr(
"N");
1097 case 1:
return tr(
"NE");
1098 case 2:
return tr(
"E");
1099 case 3:
return tr(
"SE");
1100 case 4:
return tr(
"S");
1101 case 5:
return tr(
"SW");
1102 case 6:
return tr(
"W");
1103 case 7:
return tr(
"NW");
1114 if (m_locationIsLatLon) {
1115 const auto s = simgear::strutils::formatGeodAsString(m_geodLocation,
1116 simgear::strutils::LatLonFormat::DECIMAL_DEGREES,
1117 simgear::strutils::DegreeSymbol::UTF8_DEGREE);
1118 return tr(
"at position %1").arg(QString::fromStdString(s));
1121 if (m_locationIsCarrier) {
1122 QString pennant = m_carriersModel->pennantForIndex(m_carriersModel->indexOf(m_carrierName));
1123 QString locationToCarrier;
1125 locationToCarrier = tr(
"%1nm abeam").arg(offsetNm);
1126 }
else if (m_useCarrierFLOLS) {
1127 locationToCarrier = tr(
"on %1nm final to").arg(offsetNm);
1129 locationToCarrier = tr(
"on deck at %1 on").arg(m_carrierParking);
1131 return tr(
"%1 carrier %2 (%3)").arg(locationToCarrier).arg(m_carrierName).arg(pennant);
1134 return tr(
"No location selected");
1137 QString ident = QString::fromStdString(m_location->ident()),
1138 name = QString::fromStdString(m_location->name());
1142 if (m_airportLocation) {
1148 QString locationOnAirport;
1150 if (m_useActiveRunway) {
1152 locationOnAirport = tr(
"on %1-mile final to active runway").arg(offsetNm);
1154 locationOnAirport = tr(
"on active runway");
1156 }
else if (m_useAvailableParking) {
1157 locationOnAirport = tr(
"at an available parking position");
1158 }
else if (onRunway) {
1159 QString runwayName = tr(
"runway %1").arg(QString::fromStdString(m_detailLocation->ident()));
1162 locationOnAirport = tr(
"on %2-mile final to %1").arg(runwayName).arg(offsetNm);
1164 locationOnAirport = tr(
"on %1").arg(runwayName);
1167 locationOnAirport = tr(
"on pad %1").arg(QString::fromStdString(m_detailLocation->ident()));
1168 }
else if (atParking) {
1169 locationOnAirport = tr(
"at parking position %1").arg(QString::fromStdString(m_detailLocation->ident()));
1172 return tr(
"%2 (%1): %3").arg(ident).arg(
name).arg(locationOnAirport);
1174 QString offsetDesc = tr(
"at");
1175 if (m_offsetEnabled) {
1176 offsetDesc = tr(
"%1nm %2 of").
1177 arg(offsetNm, 0,
'f', 1).
1178 arg(compassPointFromHeading(
static_cast<int>(m_offsetRadial.value)));
1182 switch (m_location->type()) {
1184 navaidType = QString(
"VOR");
break;
1186 navaidType = QString(
"NDB");
break;
1188 navaidType = QString(
"TACAN");
1191 return tr(
"%2 waypoint %1").arg(ident).arg(offsetDesc);
1197 return tr(
"%4 %1 %2 (%3)").arg(navaidType).arg(ident).arg(
name).arg(offsetDesc);
1210 auto it = std::find(m_recentLocations.begin(),
1211 m_recentLocations.end(), pos);
1212 if (it != m_recentLocations.end()) {
1213 m_recentLocations.erase(it);
1217 m_recentLocations.pop_back();
1220 m_recentLocations.insert(m_recentLocations.begin(), pos);
1222 settings.setValue(
"recent-locations",
savePositionList(m_recentLocations));
FGPositionedList loadPositionedList(QVariant v)
QVariant savePositionList(const FGPositionedList &posList)
const unsigned int MAX_RECENT_LOCATIONS
QString fixNavaidName(QString s)
SGSharedPtr< FGAirport > FGAirportRef
static FGAirportRef findByIdent(const std::string &aIdent)
Helper to look up an FGAirport instance by unique ident.
static FGPositionedRef findClosestWithIdent(const std::string &aIdent, const SGGeod &aPos, Filter *aFilter=NULL)
static bool isAirportType(FGPositioned *pos)
@ PARKING
parking position - might be a gate, or stand
@ DME
important that DME & TACAN are adjacent to keep the TacanFilter efficient - DMEs are proxies for TACA...
double headingDeg() const
Runway heading in degrees.
FGNavRecord * ILS() const
Q_INVOKABLE void setArg(QString name, QString value=QString(), Origin origin=Launcher)
Q_INVOKABLE QVariant getValueForKey(QString group, QString key, QVariant defaultValue=QVariant()) const
void setLaunchConfig(LaunchConfig *config)
QuantityValue offsetRadial
void restoreLocation(QVariantMap l)
void setUseCarrierFLOLS(bool useCarrierFLOLS)
QStringList carrierParkings
void setCarrierParking(QString name)
bool isAirborneLocation() const
used to automatically select aircraft state
bool shouldStartPaused() const
void setAbeam(bool abeam)
void setOnFinal(bool onFinal)
QmlPositioned * baseLocation() const
Q_INVOKABLE void showHistoryInSearchModel()
Q_INVOKABLE void addToRecent(QmlPositioned *pos)
void setOffsetRadial(QuantityValue offsetRadial)
void setUseAvailableParking(bool useAvailableParking)
void setBaseLocation(FGPositionedRef ref)
void restoreSearchHistory()
void setBaseGeod(QmlGeod geod)
void setOffsetEnabled(bool offsetEnabled)
QVariantMap saveLocation() const
Q_INVOKABLE QmlGeod parseStringAsGeod(QString string) const
void descriptionChanged()
void setLocationProperties()
void setOffsetDistance(QuantityValue offsetNm)
bool isParkedLocation() const
used to automatically select aircraft state
void baseLocationChanged()
void setUseActiveRunway(bool b)
LocationController(QObject *parent=nullptr)
void setTuneNAV1(bool tuneNAV1)
QString carrierName() const
Q_INVOKABLE void setDetailLocation(QmlPositioned *pos)
void setCarrierLocation(QString name)
Expose an SGGeod as Qml-friendly class.
void setValues(const FGPositionedList &posItems)
FGPositionedRef inner() const
void setGuid(qlonglong guid)
@ FeetAboveFieldElevation
FGPositionedRef findClosestWithIdent(const std::string &aIdent, const SGGeod &aPos, FGPositioned::Filter *aFilter)
static NavDataCache * instance()
FlightPlan.hxx - defines a full flight-plan object, including departure, cruise, arrival information ...
SGSharedPtr< FGPositioned > FGPositionedRef
std::string defaultAirportICAO()
SGSharedPtr< FGNavRecord > FGNavRecordRef
T * fgpositioned_cast(FGPositioned *p)
std::vector< FGPositionedRef > FGPositionedList
bool fgSetDouble(const char *name, double defaultValue)
Set a double value for a property.
bool fgSetBool(char const *name, bool val)
Set a bool value for a property.
bool fgSetString(char const *name, char const *str)
Set a string value for a property.
SGPropertyNode * fgGetNode(const char *path, bool create)
Get a property node.