diff --git a/Nasal/canvas/MapStructure.nas b/Nasal/canvas/MapStructure.nas
index 0afdcd2..326dd85 100644
--- a/Nasal/canvas/MapStructure.nas
+++ b/Nasal/canvas/MapStructure.nas
@@ -180,7 +180,8 @@ var getpos_fromghost = func(positioned_g)
# (geo.Coord and positioned ghost currently)
Symbol.Controller.getpos = func(obj) {
if (typeof(obj) == 'ghost')
- if (ghosttype(obj) == 'positioned' or ghosttype(obj) == 'Navaid' or ghosttype(obj)=='Fix' or ghosttype(obj)=='flightplan-leg')
+ # FIXME: use a foreach/vector here ?
+ if (ghosttype(obj) == 'positioned' or ghosttype(obj) == 'Navaid' or ghosttype(obj)=='Fix' or ghosttype(obj)=='flightplan-leg' or ghosttype(obj)=='FGAirport' )
return getpos_fromghost(obj);
else
die("bad ghost of type '"~ghosttype(obj)~"'");
@@ -480,7 +481,8 @@ var load_MapStructure = func {
load(FG_ROOT~"/Nasal/canvas/map/"~name~".scontroller", name);
}
- foreach( var name; ['VOR','FIX','NDB','DME','WPT','TFC'] )
+ # add your own MapStructure layers here, see the wiki for details
+ foreach( var name; ['APT','VOR','FIX','NDB','DME','WPT','TFC',] )
load_deps( name );
load(FG_ROOT~"/Nasal/canvas/map/aircraftpos.controller", name);
diff --git a/Nasal/canvas/map/APT.lcontroller b/Nasal/canvas/map/APT.lcontroller
new file mode 100644
index 0000000..32c2a93
--- /dev/null
+++ b/Nasal/canvas/map/APT.lcontroller
@@ -0,0 +1,31 @@
+# Class things:
+var name = 'APT';
+var parents = [SymbolLayer.Controller];
+var __self__ = caller(0)[0];
+SymbolLayer.Controller.add(name, __self__);
+SymbolLayer.add(name, {
+ parents: [SymbolLayer],
+ type: name, # Symbol type
+ df_controller: __self__, # controller to use by default -- this one
+});
+var a_instance = nil;
+var new = func(layer) {
+ var m = {
+ parents: [__self__],
+ layer: layer,
+ listeners: [],
+ };
+ __self__.a_instance = m;
+ return m;
+};
+var del = func() {
+ #print(name,".lcontroller.del()");
+ foreach (var l; me.listeners)
+ removelistener(l);
+};
+
+var searchCmd = func {
+ #print("Running query:", name);
+ return positioned.findAirportsWithinRange( me.query_range() ); # FIXME: the range should also be exposed, it will typically be controlled via a GUI widget or NavDisplay switch
+};
+
diff --git a/Nasal/canvas/map/APT.scontroller b/Nasal/canvas/map/APT.scontroller
new file mode 100644
index 0000000..1248bc4
--- /dev/null
+++ b/Nasal/canvas/map/APT.scontroller
@@ -0,0 +1,12 @@
+# Class things:
+var name = 'APT';
+var parents = [Symbol.Controller];
+var __self__ = caller(0)[0];
+Symbol.Controller.add(name, __self__);
+Symbol.registry[ name ].df_controller = __self__;
+var new = func(model) ; # this controller doesn't need an instance
+var LayerController = SymbolLayer.Controller.registry[ name ];
+var isActive = func(model) LayerController.a_instance.isActive(model);
+var query_range = func()
+ die( name~".scontroller.query_range /MUST/ be provided by implementation" );
+
diff --git a/Nasal/canvas/map/APT.symbol b/Nasal/canvas/map/APT.symbol
new file mode 100644
index 0000000..105d969
--- /dev/null
+++ b/Nasal/canvas/map/APT.symbol
@@ -0,0 +1,51 @@
+# Class things:
+var name = 'APT';
+var parents = [DotSym];
+var __self__ = caller(0)[0];
+DotSym.makeinstance( name, __self__ );
+
+var element_type = "group"; # we want a group, becomes "me.element"
+var icon_fix = nil;
+var text_fix = nil;
+
+# add the draw routine from airports-nd.draw here
+var draw = func {
+ if (me.icon_fix != nil) return;
+ var icon_apt = me.element.createChild("path", name ~ " icon" )
+ .moveTo(-17,0)
+ .arcSmallCW(17,17,0,34,0)
+ .arcSmallCW(17,17,0,-34,0)
+ .close()
+ .setColor(0,0.6,0.85)
+ .setStrokeLineWidth(3);
+ var text_apt = me.element.createChild("text", name ~ " label")
+ .setDrawMode( canvas.Text.TEXT )
+ .setTranslation(17,35)
+ .setText(me.model.id)
+ .setFont("LiberationFonts/LiberationSans-Regular.ttf")
+ .setColor(0,0.6,0.85)
+ .setFontSize(28);
+ #me.element.setGeoPosition(lat, lon)
+ # .set("z-index",1); # FIXME: this needs to be configurable!!
+
+# disabled:
+if(0) {
+ # the fix symbol
+ me.icon_fix = me.element.createChild("path")
+ .moveTo(-15,15)
+ .lineTo(0,-15)
+ .lineTo(15,15)
+ .close()
+ .setStrokeLineWidth(3)
+ .setColor(0,0.6,0.85)
+ .setScale(0.5,0.5); # FIXME: do proper LOD handling here - we need to scale according to current texture dimensions vs. original/design dimensions
+ # the fix label
+ me.text_fix = me.element.createChild("text")
+ .setDrawMode( canvas.Text.TEXT )
+ .setText(me.model.id)
+ .setFont("LiberationFonts/LiberationSans-Regular.ttf")
+ .setFontSize(28)
+ .setTranslation(5,25);
+ }
+};
+
diff --git a/Nasal/canvas/map/DME.lcontroller b/Nasal/canvas/map/DME.lcontroller
index b2d3c71..3ac267d 100644
--- a/Nasal/canvas/map/DME.lcontroller
+++ b/Nasal/canvas/map/DME.lcontroller
@@ -14,7 +14,7 @@ var new = func(layer) {
parents: [__self__],
layer: layer,
listeners: [],
- query_range_nm: 25,
+ # query_range_nm: 25,
query_type:'dme',
};
__self__.a_instance = m;
@@ -27,6 +27,6 @@ var del = func() {
var searchCmd = func {
#print("Running query:", me.query_type);
- return positioned.findWithinRange(me.query_range_nm, me.query_type); # the range should also be exposed, it will typically be controlled via a GUI widget or NavDisplay switch
+ return positioned.findWithinRange(me.query_range(), me.query_type); # the range should also be exposed, it will typically be controlled via a GUI widget or NavDisplay switch
};
diff --git a/Nasal/canvas/map/FIX.lcontroller b/Nasal/canvas/map/FIX.lcontroller
index ed89fb0..4da89e4 100644
--- a/Nasal/canvas/map/FIX.lcontroller
+++ b/Nasal/canvas/map/FIX.lcontroller
@@ -14,7 +14,7 @@ var new = func(layer) {
parents: [__self__],
layer: layer,
listeners: [],
- query_range_nm: 25,
+ #query_range_nm: 25,
query_type:'fix',
};
__self__.a_instance = m;
@@ -28,6 +28,6 @@ var del = func() {
var searchCmd = func {
#print("Running query:", me.query_type);
- return positioned.findWithinRange(me.query_range_nm, me.query_type); # the range should also be exposed, it will typically be controlled via a GUI widget or NavDisplay switch
+ return positioned.findWithinRange(me.query_range(), me.query_type); # the range should also be exposed, it will typically be controlled via a GUI widget or NavDisplay switch
};
diff --git a/Nasal/canvas/map/NDB.lcontroller b/Nasal/canvas/map/NDB.lcontroller
index 3250fc0..605525d 100644
--- a/Nasal/canvas/map/NDB.lcontroller
+++ b/Nasal/canvas/map/NDB.lcontroller
@@ -13,7 +13,7 @@ var new = func(layer) {
parents: [__self__],
layer: layer,
listeners: [],
- query_range_nm: 25,
+ #query_range_nm: 25,
query_type:'ndb',
};
return m;
@@ -25,6 +25,6 @@ var del = func() {
var searchCmd = func {
#print("Running query:", me.query_type);
- return positioned.findWithinRange(me.query_range_nm, me.query_type); # the range should also be exposed, it will typically be controlled via a GUI widget or NavDisplay switch
+ return positioned.findWithinRange(me.query_range(), me.query_type); # the range should also be exposed, it will typically be controlled via a GUI widget or NavDisplay switch
};
diff --git a/Nasal/canvas/map/VOR.lcontroller b/Nasal/canvas/map/VOR.lcontroller
index e7adb3d..b393387 100644
--- a/Nasal/canvas/map/VOR.lcontroller
+++ b/Nasal/canvas/map/VOR.lcontroller
@@ -50,6 +50,6 @@ var changed_freq = func(update=1) {
};
var searchCmd = func {
printlog(_MP_dbg_lvl, "Running query:", me.query_type);
- return positioned.findWithinRange(100, me.query_type); # the range should also be exposed, it will typically be controlled via a GUI widget or NavDisplay switch
+ return positioned.findWithinRange(me.query_range(), me.query_type); # FIXME: the range should also be exposed, it will typically be controlled via a GUI widget or NavDisplay switch
};
diff --git a/Nasal/canvas/map/navdisplay.mfd b/Nasal/canvas/map/navdisplay.mfd
index 8b14ebd..f5bcc46 100644
--- a/Nasal/canvas/map/navdisplay.mfd
+++ b/Nasal/canvas/map/navdisplay.mfd
@@ -89,7 +89,7 @@ var NDStyles = {
} layer._view.setVisible(visible);
},
},
- { name:'airports-nd', update_on:['toggle_range','toggle_airports','toggle_display_mode'],
+ { name:'airports-nd', disabled:1, update_on:['toggle_range','toggle_airports','toggle_display_mode'],
predicate: func(nd, layer) {
# print("Running airports-nd predicate");
var visible = nd.get_switch('toggle_airports') and nd.in_mode('toggle_display_mode', ['MAP']);
@@ -100,6 +100,20 @@ var NDStyles = {
}, # end of layer update predicate
}, # end of airports layer
+ { name:'APT', isMapStructure:1, update_on:['toggle_range','toggle_airports','toggle_display_mode'],
+ predicate: func(nd, layer) {
+ # print("Running APT layer predicate");
+ # toggle visibility here
+ var visible=nd.get_switch('toggle_airports') and nd.in_mode('toggle_display_mode', ['MAP']);
+ layer.group.setVisible( nd.get_switch('toggle_airports') );
+ if (visible) {
+ #print("Updating MapStructure ND layer: APT");
+ # (Hopefully) smart update
+ layer.update();
+ }
+ }, # end of layer update predicate
+ }, # end of APT layer
+
# Should distinct between low and high altitude navaids. Hiding above 40 NM for now, to prevent clutter/lag.
{ name:'vor', disabled:1, update_on:['toggle_range','toggle_stations','toggle_display_mode'],
predicate: func(nd, layer) {
@@ -883,7 +897,12 @@ var NavDisplay = {
get_position: get_current_position,
};
- # FIXME: MapStructure: big hack
+ # FIXME: MapStructure: big hack @Philosopher: I don't think we need both lines here ??
+ foreach(var hack; var monster_hack = ['APT', 'DME','FIX','NDB','VOR',]) {
+ canvas.SymbolLayer.Controller.get( hack ).query_range = controller.query_range;
+ canvas.Symbol.Controller.get( hack ).query_range = controller.query_range;
+ }
+
canvas.Symbol.Controller.get("VOR").query_range = controller.query_range;
canvas.Symbol.Controller.get("VOR").get_tuned_course = controller.get_tuned_course;
canvas.Symbol.Controller.get("DME").is_tuned = controller.is_tuned;