diff --git a/src/GUI/MapWidget.cxx b/src/GUI/MapWidget.cxx index 47ec864c0..f5d2cbd71 100644 --- a/src/GUI/MapWidget.cxx +++ b/src/GUI/MapWidget.cxx @@ -397,6 +397,7 @@ MapWidget::MapWidget(int x, int y, int maxX, int maxY) : MapWidget::~MapWidget() { delete _magVar; + clearData(); } void MapWidget::setProperty(SGPropertyNode_ptr prop) @@ -535,10 +536,14 @@ void MapWidget::draw(int dx, int dy) { _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; } @@ -630,14 +635,9 @@ void MapWidget::paintRuler() 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); @@ -1243,13 +1243,13 @@ void MapWidget::drawRunway(FGRunway* rwy) 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); @@ -1311,8 +1311,10 @@ void MapWidget::drawILS(bool tuned, FGRunway* 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); @@ -1680,3 +1682,23 @@ MapData* MapWidget::createDataForKey(void* key) 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); +} diff --git a/src/GUI/MapWidget.hxx b/src/GUI/MapWidget.hxx index 8c3ae0b5b..3f7158250 100644 --- a/src/GUI/MapWidget.hxx +++ b/src/GUI/MapWidget.hxx @@ -73,11 +73,14 @@ private: 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);