-public:
- MapAirportFilter(SGPropertyNode_ptr nd)
- {
- _heliports = nd->getBoolValue("show-heliports", false);
- _hardRunwaysOnly = nd->getBoolValue("hard-surfaced-airports", true);
- _minLengthFt = fgGetDouble("/sim/navdb/min-runway-length-ft", 2000);
- }
-
- virtual FGPositioned::Type maxType() const {
- return _heliports ? FGPositioned::HELIPORT : FGPositioned::AIRPORT;
- }
-
- virtual bool passAirport(FGAirport* aApt) const {
- if (_hardRunwaysOnly) {
- return aApt->hasHardRunwayOfLengthFt(_minLengthFt);
- }
-
- return true;
- }
-
-private:
- bool _heliports;
- bool _hardRunwaysOnly;
- double _minLengthFt;
-};
-
-void MapWidget::drawAirports()
-{
- MapAirportFilter af(_root);
- bool partial = false;
- FGPositionedList apts = FGPositioned::findWithinRangePartial(_projectionCenter, _drawRangeNm, &af, partial);
- for (unsigned int i=0; i<apts.size(); ++i) {
- drawAirport((FGAirport*) apts[i].get());
- }
-}
-
-class NavaidFilter : public FGPositioned::Filter
-{
-public:
- NavaidFilter(bool fixesEnabled, bool navaidsEnabled) :
- _fixes(fixesEnabled),
- _navaids(navaidsEnabled)
- {}
-
- virtual bool pass(FGPositioned* aPos) const {
- if (_fixes && (aPos->type() == FGPositioned::FIX)) {
- // ignore fixes which end in digits - expirmental
- if (aPos->ident().length() > 4 && isdigit(aPos->ident()[3]) && isdigit(aPos->ident()[4])) {
- return false;
- }
- }
-
- return true;
- }
-
- virtual FGPositioned::Type minType() const {
- return _fixes ? FGPositioned::FIX : FGPositioned::NDB;
- }
-
- virtual FGPositioned::Type maxType() const {
- return _navaids ? FGPositioned::VOR : FGPositioned::FIX;
- }
-
-private:
- bool _fixes, _navaids;
-};
-
-void MapWidget::drawNavaids()
-{
- bool fixes = _root->getBoolValue("draw-fixes");
- NavaidFilter f(fixes, _root->getBoolValue("draw-navaids"));
-
- if (f.minType() <= f.maxType()) {
- FGPositionedList navs = FGPositioned::findWithinRange(_projectionCenter, _drawRangeNm, &f);
-
- glLineWidth(1.0);
- for (unsigned int i=0; i<navs.size(); ++i) {
- FGPositioned::Type ty = navs[i]->type();
- if (ty == FGPositioned::NDB) {
- drawNDB(false, (FGNavRecord*) navs[i].get());
- } else if (ty == FGPositioned::VOR) {
- drawVOR(false, (FGNavRecord*) navs[i].get());
- } else if (ty == FGPositioned::FIX) {
- drawFix((FGFix*) navs[i].get());
- }
- } // of navaid iteration
- } // of navaids || fixes are drawn test
-}
-
-void MapWidget::drawPOIs()
-{
- FGPositioned::TypeFilter f(FGPositioned::COUNTRY);
- f.addType(FGPositioned::CITY);
- f.addType(FGPositioned::TOWN);
- FGPositionedList poi = FGPositioned::findWithinRange(_projectionCenter, _drawRangeNm, &f);
-
- glLineWidth(1.0);
- for (unsigned int i=0; i<poi.size(); ++i) {
- FGPositioned::Type ty = poi[i]->type();
- if (ty == FGPositioned::COUNTRY) {
- drawCountries((FGNavRecord*) poi[i].get());
- } else if (ty == FGPositioned::CITY) {
- drawCities((FGNavRecord*) poi[i].get());
- } else if (ty == FGPositioned::TOWN) {
- drawTowns((FGNavRecord*) poi[i].get());
- }
- } // of navaid iteration
+ for (unsigned int i=0; i<_itemsToDraw.size(); ++i) {
+ FGPositionedRef p = _itemsToDraw[i];
+ switch (p->type()) {
+ case FGPositioned::AIRPORT:
+ drawAirport((FGAirport*) p.get());
+ break;
+ case FGPositioned::NDB:
+ drawNDB(false, (FGNavRecord*) p.get());
+ break;
+ case FGPositioned::VOR:
+ drawVOR(false, (FGNavRecord*) p.get());
+ break;
+ case FGPositioned::FIX:
+ drawFix((FGFix*) p.get());
+ break;
+ case FGPositioned::TOWN:
+ case FGPositioned::CITY:
+ case FGPositioned::COUNTRY:
+ drawPOI(p);
+ break;
+
+ default:
+ SG_LOG(SG_GENERAL, SG_WARN, "unhandled type in MapWidget::drawPositioned");
+ } // of positioned type switch
+ } // of items to draw iteration