From d214a6fcf805380f2ae6d8141dfebfb0c7af377c Mon Sep 17 00:00:00 2001 From: Stuart Buchanan Date: Tue, 18 Sep 2012 19:28:56 +0100 Subject: [PATCH] Add highlighting of selected runway/parking position. Move tower definition and placement to map.nas. --- Nasal/canvas/map.nas | 25 ++++++++--- gui/dialogs/airports.xml | 89 ++++++++++++++++++++++++++++++++-------- 2 files changed, 91 insertions(+), 23 deletions(-) diff --git a/Nasal/canvas/map.nas b/Nasal/canvas/map.nas index a1c1293bb..0e1196907 100644 --- a/Nasal/canvas/map.nas +++ b/Nasal/canvas/map.nas @@ -45,14 +45,11 @@ var AirportMap = { # Build the graphical representation of the represented airport # # @param layer_runways canvas.Group to attach airport map to - # @param selected [optional] The name of a property containing the - # currently selected runway - build: func(layer_runways, selected = nil) + build: func(layer_runways) { var rws_done = {}; me.grp_apt = layer_runways.createChild("group", "apt-" ~ me._apt.id); - var selected_rwy = (selected) ? getprop(selected) : nil; foreach(var rw; keys(me._apt.runways)) { @@ -86,7 +83,7 @@ var AirportMap = { rw = me._apt.runways[rw]; var icon_rw = - me.grp_apt.createChild("path", "runway") + me.grp_apt.createChild("path", "runway-" ~ rw.id) .setStrokeLineWidth(0.5) .setColor(1.0,1.0,1.0) .setColorFill(0.2, 0.2, 0.2); @@ -157,7 +154,7 @@ var AirportMap = { foreach(var park; me._apt.parking()) { var icon_park = - me.grp_apt.createChild("text") + me.grp_apt.createChild("text", "parking-" ~ park.name) .setDrawMode( canvas.Text.ALIGNMENT + canvas.Text.TEXT ) .setText(park.name) @@ -165,5 +162,21 @@ var AirportMap = { .setGeoPosition(park.lat, park.lon) .setFontSize(15, 1.3); } + + var icon_tower = + me.grp_apt.createChild("path", "tower") + .setStrokeLineWidth(1) + .setScale(1.5) + .setColor(0.2,0.2,1.0) + .moveTo(-3, 0) + .vert(-10) + .line(-3, -10) + .horiz(12) + .line(-3, 10) + .vert(10); + + var pos = me._apt.tower(); + icon_tower.setGeoPosition(pos.lat, pos.lon); + } }; diff --git a/gui/dialogs/airports.xml b/gui/dialogs/airports.xml index 25b6ad8d2..a96032344 100644 --- a/gui/dialogs/airports.xml +++ b/gui/dialogs/airports.xml @@ -31,10 +31,11 @@ - var airport_id = getprop("/sim/presets/airport-id"); setprop("/sim/gui/dialogs/airports/selected-airport/rwy", ""); setprop("/sim/gui/dialogs/airports/selected-airport/parkpos", ""); - + setprop("/sim/gui/dialogs/airports/list", ""); + + var airport_id = getprop("/sim/presets/airport-id"); if (airport_id == nil) { airport_id = "KSFO"; } var dlg = props.globals.getNode("/sim/gui/dialogs/airports", 1); @@ -77,6 +78,8 @@ setprop("/sim/gui/dialogs/airports/selected-airport/location", sprintf("%.3f / %.3f", info.lon, info.lat)); setprop("/sim/gui/dialogs/airports/selected-airport/lon", info.lon); setprop("/sim/gui/dialogs/airports/selected-airport/elevation-ft", 3.28 * info.elevation); + setprop("/sim/gui/dialogs/airports/selected-airport/rwy", ""); + setprop("/sim/gui/dialogs/airports/selected-airport/parkpos", ""); var longest_runway = 0; var runway_string = ""; @@ -136,6 +139,9 @@ } } + + + update_info(); @@ -421,32 +427,23 @@ .setTranslation(300, 200); var layer_runways = map.createChild("group", "runways"); - var icon_tower = - map.createChild("path", "tower") - .setStrokeLineWidth(1) - .setScale(1.5) - .setColor(0.2,0.2,1.0) - .moveTo(-3, 0) - .vert(-10) - .line(-3, -10) - .horiz(12) - .line(-3, 10) - .vert(10); var updateMap = func() { var id = getprop("/sim/gui/dialogs/airports/selected-airport/id"); if (id != "") { var apt = airportinfo(id); + + #map.removeAllChildren(); + #layer_runways = map.createChild("group", "runways"); + var airport = canvas.AirportMap.new(apt); - airport.build(layer_runways, "/sim/gui/dialogs/airports/selected-airport/rwy" ); + airport.build(layer_runways); - var pos = apt.tower(); - icon_tower.setGeoPosition(pos.lat, pos.lon); map._node.getNode("ref-lat", 1).setDoubleValue(apt.lat); map._node.getNode("ref-lon", 1).setDoubleValue(apt.lon); map._node.getNode("hdg", 1).setDoubleValue(0.0); - } + } } var ranges = [0.1, 0.25, 0.5, 1, 2.5, 5]; @@ -462,7 +459,63 @@ settimer(updateZoom, 0.5, 1); }; + var updateRunwayHighlight = func() + { + var selected_rwy = getprop("/sim/gui/dialogs/airports/selected-airport/rwy"); + var selected_apt = getprop("/sim/gui/dialogs/airports/selected-airport/id"); + + var is_heli = substr(selected_rwy, 0, 1) == "H"; + var rw_dir = is_heli ? nil : int(substr(selected_rwy, 0, 2)); + + var rw_rec = ""; + if( rw_dir != nil ) { + rw_rec = sprintf("%02d", math.mod(rw_dir - 18, 36)); + if( size(selected_rwy) == 3 ) { + var map_rec = { + "R": "L", + "L": "R", + "C": "C" + }; + rw_rec ~= map_rec[substr(selected_rwy, 2)]; + } + } + + foreach (var apt; layer_runways.getChildren()) { + if (apt.get("id") == "apt-" ~ selected_apt) { + foreach (var rwy; apt.getChildren()) { + if ((rwy.get("id") == "runway-" ~ selected_rwy) or + (rwy.get("id") == "runway-" ~ rw_rec) ) + { + rwy.setColor(1.0,0.0,0.0); + } else { + rwy.setColor(1.0,1.0,1.0); + } + } + } + } + } + + var updateParkingHighlight = func() + { + var selected_parkpos = getprop("/sim/gui/dialogs/airports/selected-airport/parkpos"); + var selected_apt = getprop("/sim/gui/dialogs/airports/selected-airport/id"); + + foreach (var apt; layer_runways.getChildren()) { + if (apt.get("id") == "apt-" ~ selected_apt) { + foreach (var rwy; apt.getChildren()) { + if (rwy.get("id") == "parking-" ~ selected_parkpos) { + rwy.setColor(1.0,0.0,0.0); + } else { + rwy.setColor(1.0,1.0,1.0); + } + } + } + } + } + var aptlistener = setlistener("/sim/gui/dialogs/airports/selected-airport/id", updateMap); + var rwylistener = setlistener("/sim/gui/dialogs/airports/selected-airport/rwy", updateRunwayHighlight); + var parkposlistener = setlistener("/sim/gui/dialogs/airports/selected-airport/parkpos", updateParkingHighlight); update_info(); updateZoom(); @@ -470,6 +523,8 @@ removelistener(aptlistener); + removelistener(rwylistener); + removelistener(parkposlistener);