MapWidget::~MapWidget()
{
delete _magVar;
+ clearData();
}
void MapWidget::setProperty(SGPropertyNode_ptr prop)
{
_aircraft = SGGeod::fromDeg(fgGetDouble("/position/longitude-deg"),
fgGetDouble("/position/latitude-deg"));
- _magneticHeadings = _root->getBoolValue("magnetic-headings");
-
- if (_hasPanned)
- {
+
+ bool mag = _root->getBoolValue("magnetic-headings");
+ if (mag != _magneticHeadings) {
+ clearData(); // flush cached data text, since it often includes heading
+ _magneticHeadings = mag;
+ }
+
+ if (_hasPanned) {
_root->setBoolValue("centre-on-aircraft", false);
_hasPanned = false;
}
double dist, az, az2;
SGGeodesy::inverse(_aircraft, _clickGeod, az, az2, dist);
- if (_magneticHeadings) {
- az -= _magVar->get_magvar();
- SG_NORMALIZE_RANGE(az, 0.0, 360.0);
- }
-
char buffer[1024];
::snprintf(buffer, 1024, "%03d/%.1fnm",
- SGMiscd::roundToInt(az), dist * SG_METER_TO_NM);
+ displayHeading(az), dist * SG_METER_TO_NM);
MapData* d = getOrCreateDataForKey((void*) RULER_LEGEND_KEY);
d->setLabel(buffer);
setAnchorForKey(rwy, (p1 + p2) * 0.5);
return;
}
-
+
char buffer[1024];
- ::snprintf(buffer, 1024, "%s/%s\n%3.0f/%3.0f\n%.0f'",
+ ::snprintf(buffer, 1024, "%s/%s\n%03d/%03d\n%.0f'",
rwy->ident().c_str(),
rwy->reciprocalRunway()->ident().c_str(),
- rwy->headingDeg(),
- rwy->reciprocalRunway()->headingDeg(),
+ displayHeading(rwy->headingDeg()),
+ displayHeading(rwy->reciprocalRunway()->headingDeg()),
rwy->lengthFt());
MapData* d = createDataForKey(rwy);
}
char buffer[1024];
- ::snprintf(buffer, 1024, "%s\n%s\n%3.2fMHz",
- loc->name().c_str(), loc->ident().c_str(),loc->get_freq()/100.0);
+ ::snprintf(buffer, 1024, "%s\n%s\n%03d - %3.2fMHz",
+ loc->ident().c_str(), loc->name().c_str(),
+ displayHeading(radial),
+ loc->get_freq()/100.0);
MapData* d = createDataForKey(loc);
d->setPriority(40);
d->resetAge();
return d;
}
+
+void MapWidget::clearData()
+{
+ KeyDataMap::iterator it = _mapData.begin();
+ for (; it != _mapData.end(); ++it) {
+ delete it->second;
+ }
+
+ _mapData.clear();
+}
+
+int MapWidget::displayHeading(double h) const
+{
+ if (_magneticHeadings) {
+ h -= _magVar->get_magvar() * SG_RADIANS_TO_DEGREES;
+ }
+
+ SG_NORMALIZE_RANGE(h, 0.0, 360.0);
+ return SGMiscd::roundToInt(h);
+}
MapData* getOrCreateDataForKey(void* key);
MapData* createDataForKey(void* key);
void setAnchorForKey(void* key, const SGVec2d& anchor);
+ void clearData();
SGVec2d project(const SGGeod& geod) const;
SGGeod unproject(const SGVec2d& p) const;
double currentScale() const;
+ int displayHeading(double trueHeading) const;
+
void circleAt(const SGVec2d& center, int nSides, double r);
void circleAtAlt(const SGVec2d& center, int nSides, double r, double r2);
void drawLine(const SGVec2d& p1, const SGVec2d& p2);