diff --git a/Translations/en/menu.xml b/Translations/en/menu.xml index a21e90682..940d1dd5c 100644 --- a/Translations/en/menu.xml +++ b/Translations/en/menu.xml @@ -27,9 +27,8 @@ <!-- Location menu --> <location>Location</location> - <position-on-ground>Position Aircraft On Ground</position-on-ground> <position-in-air>Position Aircraft In Air</position-in-air> - <goto-airport>Select Airport From List</goto-airport> + <goto-airport>Select Airport</goto-airport> <random-attitude>Random Attitude</random-attitude> <tower-position>Tower Position</tower-position> diff --git a/gui/dialogs/airports.xml b/gui/dialogs/airports.xml index 75fb36749..8bb959074 100644 --- a/gui/dialogs/airports.xml +++ b/gui/dialogs/airports.xml @@ -31,20 +31,90 @@ <nasal> <open> - var id = ""; - var node = props.globals.getNode("/sim/gui/dialogs/airports", 1); - if (node.getNode("list") == nil) - node.getNode("list", 1).setValue(""); + var airport_id = getprop("/sim/presets/airport-id"); + setprop("/sim/gui/dialogs/airports/selected-airport/rwy", ""); + setprop("/sim/gui/dialogs/airports/selected-airport/parkpos", ""); - node = node.getNode("list"); + if (airport_id == nil) { airport_id = "KSFO"; } + + var dlg = props.globals.getNode("/sim/gui/dialogs/airports", 1); + var avail_runways = dlg.getNode("available-runways", 1); + var avail_parking = dlg.getNode("available-parking", 1); + + if (dlg.getNode("list") == nil) + dlg.getNode("list", 1).setValue(""); + + var airportlist = dlg.getNode("list"); + + var mode = { + runway: dlg.getNode("use_runway", 1), + bestrunway: dlg.getNode("use_best_runway", 1), + parkpos: dlg.getNode("use_parkpos", 1) + }; + + var set_radio = func(m) { + foreach (k; keys(mode)) { + mode[k].setBoolValue(m == k); + } + } + + var initialized = 0; + foreach (k; keys(mode)) { + if (mode[k].getType() == "NONE" or initialized) { + mode[k].setBoolValue(0); + } else { + initialized += mode[k].getBoolValue(); + } + } + if (!initialized) { + set_radio("bestrunway"); + } + + var update_info = func { + var info = airportinfo(airport_id); + setprop("/sim/gui/dialogs/airports/selected-airport/id", airport_id); + setprop("/sim/gui/dialogs/airports/selected-airport/name", info.name ~ " (" ~ airport_id ~ ")"); + 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); + + var longest_runway = 0; + var runway_string = ""; + var runways = info.runways; + + avail_runways.removeChildren("value"); + avail_parking.removeChildren("value"); + var runway_keys = sort(keys(runways), string.icmp); + var i = 0; + + foreach(var rwy; runway_keys) { + runway_string = runway_string ~ rwy ~ " "; + longest_runway = math.max(longest_runway, runways[rwy].length * 3.28); + avail_runways.getNode("value[" ~ i ~ "]", 1).setValue(rwy); + i += 1; + } + + i = 0; + foreach (var park; info.parking()) { + avail_parking.getNode("value[" ~ i ~ "]", 1).setValue(park.name); + i += 1; + } + + setprop("/sim/gui/dialogs/airports/selected-airport/longest-runway", longest_runway); + + gui.dialog_update("airports", "runway-list"); + gui.dialog_update("airports", "parking-list"); + } var listbox = func { - id = pop(split(" ", node.getValue())); - id = substr(id, 1, size(id) - 2); # strip parentheses + airport_id = pop(split(" ", airportlist.getValue())); + airport_id = substr(airport_id, 1, size(airport_id) - 2); # strip parentheses + + update_info(); } var apply = func { - setprop("/sim/presets/airport-id", id); + setprop("/sim/presets/airport-id", airport_id); setprop("/sim/presets/longitude-deg", -9999); setprop("/sim/presets/latitude-deg", -9999); setprop("/sim/presets/altitude-ft", -9999); @@ -53,79 +123,567 @@ setprop("/sim/presets/offset-azimuth-deg", 0); setprop("/sim/presets/glideslope-deg", 0); setprop("/sim/presets/heading-deg", 0); - setprop("/sim/presets/runway", ""); - setprop("/sim/presets/parkpos", ""); - } + + if (mode["bestrunway"].getBoolValue()) { + setprop("/sim/presets/runway", ""); + setprop("/sim/presets/parkpos", ""); + } else if (mode["runway"].getBoolValue()) { + setprop("/sim/presets/runway", getprop("/sim/gui/dialogs/airports/selected-airport/rwy")); + setprop("/sim/presets/parkpos", ""); + } else { + setprop("/sim/presets/runway", ""); + setprop("/sim/presets/parkpos", getprop("/sim/gui/dialogs/airports/selected-airport/parkpos")); + } + + } </open> </nasal> - - <airport-list> - <name>airport-list</name> - <pref-width>440</pref-width> - <pref-height>360</pref-height> - <halign>fill</halign> - <valign>fill</valign> - <stretch>true</stretch> - <property>/sim/gui/dialogs/airports/list</property> - <binding> - <command>dialog-apply</command> - <object-name>airport-list</object-name> - </binding> - <binding> - <command>nasal</command> - <script>listbox()</script> - </binding> - </airport-list> - + <group> <layout>hbox</layout> <default-padding>4</default-padding> + + <group> + <layout>vbox</layout> - <text> - <label>Airport:</label> - <pref-width>60</pref-width> - </text> + <group> + <layout>hbox</layout> + <default-padding>4</default-padding> - <input> - <name>input</name> - <pref-width>280</pref-width> - <halign>fill</halign> - <stretch>true</stretch> - <property>/sim/gui/dialogs/airports/list</property> - <binding> - <command>dialog-apply</command> - <object-name>input</object-name> - </binding> - <binding> - <command>dialog-update</command> - <object-name>airport-list</object-name> - </binding> - </input> + <text> + <label>Airport:</label> + </text> - <button> - <legend>Search</legend> - <binding> - <command>dialog-apply</command> - <object-name>input</object-name> - </binding> - <binding> - <command>dialog-update</command> - <object-name>airport-list</object-name> - </binding> - </button> + <input> + <name>input</name> + <pref-width>200</pref-width> + <halign>fill</halign> + <stretch>true</stretch> + <property>/sim/gui/dialogs/airports/list</property> + <binding> + <command>dialog-apply</command> + <object-name>input</object-name> + </binding> + <binding> + <command>dialog-update</command> + <object-name>airport-list</object-name> + </binding> + </input> + + <button> + <legend>Clear</legend> + <binding> + <command>property-assign</command> + <property>/sim/gui/dialogs/airports/list</property> + <value></value> + </binding> + <binding> + <command>dialog-update</command> + <object-name>input</object-name> + </binding> + <binding> + <command>dialog-update</command> + <object-name>airport-list</object-name> + </binding> + </button> + + <button> + <legend>Search</legend> + <default>true</default> + <binding> + <command>dialog-apply</command> + <object-name>input</object-name> + </binding> + <binding> + <command>dialog-update</command> + <object-name>airport-list</object-name> + </binding> + </button> + + </group> + + <airport-list> + <name>airport-list</name> + <pref-width>300</pref-width> + <pref-height>260</pref-height> + <halign>fill</halign> + <valign>fill</valign> + <stretch>true</stretch> + <property>/sim/gui/dialogs/airports/list</property> + <binding> + <command>dialog-apply</command> + <object-name>airport-list</object-name> + </binding> + <binding> + <command>nasal</command> + <script>listbox()</script> + </binding> + </airport-list> + + <hrule/> + + <group> + <layout>table</layout> + + <text> + <row>0</row> + <col>0</col> + <width>200</width> + <halign>right</halign> + <label>Airport:</label> + </text> + <text> + <row>0</row> + <col>1</col> + <colspan>3</colspan> + <halign>left</halign> + <live>true</live> + <property>/sim/gui/dialogs/airports/selected-airport/name</property> + </text> + + <text> + <row>1</row> + <col>0</col> + <halign>right</halign> + <label>Lon/Lat:</label> + </text> + <text> + <row>1</row> + <col>1</col> + <halign>left</halign> + <live>true</live> + <property>/sim/gui/dialogs/airports/selected-airport/location</property> + </text> + + <text> + <row>1</row> + <col>3</col> + <halign>right</halign> + <label>Elevation (ft):</label> + </text> + <text> + <row>1</row> + <col>4</col> + <halign>left</halign> + <live>true</live> + <format>%.0f</format> + <property>/sim/gui/dialogs/airports/selected-airport/elevation-ft</property> + </text> + + <text> + <row>2</row> + <col>0</col> + <halign>right</halign> + <label>Longest runway (ft):</label> + </text> + <text> + <row>2</row> + <col>1</col> + <halign>left</halign> + <live>true</live> + <format>%.0f</format> + <property>/sim/gui/dialogs/airports/selected-airport/longest-runway</property> + </text> + + </group> + + <hrule/> + + <group> + <layout>table</layout> + <halign>center</halign> + + <radio> + <row>2</row><col>0</col> + <property>/sim/gui/dialogs/airports/use_best_runway</property> + <live>true</live> + <binding> + <command>nasal</command> + <script>set_radio("bestrunway")</script> + </binding> + </radio> + + <text> + <row>2</row><col>1</col> + <halign>right</halign> + <label>Best runway</label> + <enable> + <property>/sim/gui/dialogs/airports/use_best_runway</property> + </enable> + </text> + <text> + <row>2</row><col>2</col> + <halign>right</halign> + <label>(based on wind)</label> + <enable> + <property>/sim/gui/dialogs/airports/use_best_runway</property> + </enable> + </text> + + <radio> + <row>3</row><col>0</col> + <property>/sim/gui/dialogs/airports/use_runway</property> + <live>true</live> + <binding> + <command>nasal</command> + <script>set_radio("runway")</script> + </binding> + </radio> + + <text> + <row>3</row><col>1</col> + <halign>right</halign> + <label>Runway:</label> + <enable> + <property>/sim/gui/dialogs/airports/use_runway</property> + </enable> + </text> + + <combo> + <name>runway-list</name> + <row>3</row><col>2</col> + <pref-width>85</pref-width> + <enable> + <property>/sim/gui/dialogs/airports/use_runway</property> + </enable> + <property>/sim/gui/dialogs/airports/selected-airport/rwy</property> + <editable>false</editable> + <properties>sim/gui/dialogs/airports/available-runways</properties> + <binding> + <command>dialog-apply</command> + <object-name>runway-list</object-name> + </binding> + </combo> + + <radio> + <row>4</row><col>0</col> + <property>/sim/gui/dialogs/airports/use_parkpos</property> + <live>true</live> + <binding> + <command>nasal</command> + <script>set_radio("parkpos")</script> + </binding> + </radio> + + <text> + <row>4</row><col>1</col> + <halign>right</halign> + <label>Parking:</label> + <enable> + <property>/sim/gui/dialogs/airports/use_parkpos</property> + </enable> + </text> + + <combo> + <name>parking-list</name> + <row>4</row><col>2</col> + <pref-width>85</pref-width> + <enable> + <property>/sim/gui/dialogs/airports/use_parkpos</property> + </enable> + <property>/sim/gui/dialogs/airports/selected-airport/parkpos</property> + <editable>false</editable> + <properties>sim/gui/dialogs/airports/available-parking</properties> + <binding> + <command>dialog-apply</command> + <object-name>parking-list</object-name> + </binding> + </combo> + </group> + + </group> + + <vrule/> + + <group> + <layout>vbox</layout> + + <canvas> + <name>map-dialog</name> + <valign>fill</valign> + <halign>fill</halign> + <stretch>true</stretch> + <pref-width>600</pref-width> + <pref-height>400</pref-height> + <view n="0">600</view> + <view n="1">400</view> + + <nasal> + + + <load><![CDATA[ + var Runway = { + new: func(rwy) + { + return { + parents: [Runway], + rwy: rwy + }; + }, + pointOffCenterline: func(pos, off = 0) + { + var coord = geo.Coord.new(); + coord.set_latlon(me.rwy.lat, me.rwy.lon); + coord.apply_course_distance(me.rwy.heading, pos - 0.5 * me.rwy.length); + + if( off ) + coord.apply_course_distance(me.rwy.heading + 90, off); + + return ["N" ~ coord.lat(), "E" ~ coord.lon()]; + } + }; + + var AirportMap = { + new: func(apt) + { + return { + parents: [AirportMap], + _apt: apt + }; + }, + build: func(layer_runways) + { + var rws_done = {}; + + me.grp_apt = layer_runways.createChild("group", "apt-" ~ me._apt.id); + var selected_rwy = getprop("/sim/gui/dialogs/airports/selected-airport/rwy"); + + foreach(var rw; keys(me._apt.runways)) + { + var is_heli = substr(rw, 0, 1) == "H"; + var rw_dir = is_heli ? nil : int(substr(rw, 0, 2)); + + var rw_rec = ""; + var thresh_rec = 0; + if( rw_dir != nil ) + { + rw_rec = sprintf("%02d", math.mod(rw_dir - 18, 36)); + if( size(rw) == 3 ) + { + var map_rec = { + "R": "L", + "L": "R", + "C": "C" + }; + rw_rec ~= map_rec[substr(rw, 2)]; + } + + if( rws_done[rw_rec] != nil ) + continue; + + var rw_rec = me._apt.runways[rw_rec]; + if( rw_rec != nil ) + thresh_rec = rw_rec.threshold; + } + + rws_done[rw] = 1; + + rw = me._apt.runways[rw]; + var icon_rw = me.grp_apt.createChild("path", "runway"); + + icon_rw.setStrokeLineWidth(0.5); + icon_rw.setColor(1.0,1.0,1.0); + icon_rw.setColorFill(0.2, 0.2, 0.2); + icon_rw.setFill(1); + + var rwy = Runway.new(rw); + var beg_thr = rwy.pointOffCenterline(rw.threshold); + var beg_thr1 = rwy.pointOffCenterline(rw.threshold, 0.5 * rw.width); + var beg_thr2 = rwy.pointOffCenterline(rw.threshold, -0.5 * rw.width); + var beg1 = rwy.pointOffCenterline(0, 0.5 * rw.width); + var beg2 = rwy.pointOffCenterline(0, -0.5 * rw.width); + + var end_thr = rwy.pointOffCenterline(rw.length - thresh_rec); + var end_thr1 = rwy.pointOffCenterline(rw.length - thresh_rec, 0.5 * rw.width); + var end_thr2 = rwy.pointOffCenterline(rw.length - thresh_rec, -0.5 * rw.width); + var end1 = rwy.pointOffCenterline(rw.length, 0.5 * rw.width); + var end2 = rwy.pointOffCenterline(rw.length, -0.5 * rw.width); + + icon_rw.setDataGeo + ( + [ canvas.Path.VG_MOVE_TO, + canvas.Path.VG_LINE_TO, + canvas.Path.VG_LINE_TO, + canvas.Path.VG_LINE_TO, + canvas.Path.VG_CLOSE_PATH ], + [ beg1[0], beg1[1], + beg2[0], beg2[1], + end2[0], end2[1], + end1[0], end1[1] ] + ); + + if( rw.length / rw.width > 3 and !is_heli ) + { + # only runways which are much longer than wide are + # real runways, otherwise it's probably a heliport. + var icon_cl = me.grp_apt.createChild("path", "centerline"); + icon_cl.setStrokeLineWidth(0.5); + icon_cl.setColor(1,1,1); + icon_cl.setStrokeDashArray([15, 10]); + + icon_cl.setDataGeo + ( + [ canvas.Path.VG_MOVE_TO, + canvas.Path.VG_LINE_TO ], + [ beg_thr[0], beg_thr[1], + end_thr[0], end_thr[1] ] + ); + + var icon_thr = me.grp_apt.createChild("path", "threshold"); + icon_thr.setStrokeLineWidth(1.5); + icon_thr.setColor(1,1,1); + + icon_thr.setDataGeo + ( + [ canvas.Path.VG_MOVE_TO, + canvas.Path.VG_LINE_TO, + canvas.Path.VG_MOVE_TO, + canvas.Path.VG_LINE_TO ], + [ beg_thr1[0], beg_thr1[1], + beg_thr2[0], beg_thr2[1], + end_thr1[0], end_thr1[1], + end_thr2[0], end_thr2[1] ] + ); + } + } + + foreach(var park; me._apt.parking()) + { + var icon_park = me.grp_apt.createChild("text"); + icon_park.setDrawMode(9); + icon_park.setText(park.name); + icon_park.setFont("LiberationFonts/LiberationMono-Bold.ttf"); + icon_park.setGeoPosition(park.lat, park.lon); + icon_park.setFontSize(15, 1.3); + } + } + }; + + var my_canvas = canvas.get(cmdarg()); + my_canvas.setColorBackground(0.2, 0.5, 0.2, 0.5); + + var root = my_canvas.createGroup(); + + var map = root.createChild("map", "map-test"); + map.setTranslation(300, 200); + + var layer_runways = map.createChild("group", "runways"); + var icon_tower = map.createChild("path", "tower"); + icon_tower.setStrokeLineWidth(1); + icon_tower.setScale(1.5); + icon_tower.setColor(0.2,0.2,1.0); + + icon_tower.setData + ( + [ canvas.Path.VG_MOVE_TO, + canvas.Path.VG_VLINE_TO_REL, + canvas.Path.VG_LINE_TO_REL, + canvas.Path.VG_HLINE_TO_REL, + canvas.Path.VG_LINE_TO_REL, + canvas.Path.VG_VLINE_TO_REL ], + [ -3, 0, + -10, + -3, -10, + 12, + -3, 10, + 10 ] + ); + + var updateMap = func() { + var id = getprop("/sim/gui/dialogs/airports/selected-airport/id"); + + if (id != "") { + var apt = airportinfo(id); + var airport = AirportMap.new(apt); + 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]; + + var updateZoom = func() + { + var z = getprop("/sim/gui/dialogs/airports/zoom"); + if( z == nil ) + z = 0; + var zoom = ranges[4 - z]; + map._node.getNode("range", 1).setDoubleValue(zoom); + + settimer(updateZoom, 0.5); + }; + + var aptlistener = setlistener("/sim/gui/dialogs/airports/selected-airport/id", updateMap); + + update_info(); + updateZoom(); + ]]> + </load> + <close> + removelistener(aptlistener); + </close> + </nasal> + </canvas> + + <hrule/> + + <group> + <layout>hbox</layout> + + <button> + <name>zoomout</name> + <legend>-</legend> + <pref-width>22</pref-width> + <pref-height>22</pref-height> + + <binding> + <command>property-adjust</command> + <property>/sim/gui/dialogs/airports/zoom</property> + <min>0</min> + <step>-1</step> + </binding> + </button> + + <text> + <label>MMM</label> + <format>Zoom %d</format> + <property>/sim/gui/dialogs/airports/zoom</property> + <live>true</live> + </text> + + <button> + <name>zoomin</name> + <legend>+</legend> + <pref-width>22</pref-width> + <pref-height>22</pref-height> + + <binding> + <command>property-adjust</command> + <property>//sim/gui/dialogs/airports/zoom</property> + <step>1</step> + <max>4</max> + </binding> + </button> + </group> + </group> </group> - + <hrule/> - + <group> <layout>hbox</layout> <default-padding>10</default-padding> + <empty><stretch>true</stretch></empty> <button> - <legend>Apply</legend> + <legend>OK</legend> <equal>true</equal> - <default>true</default> <binding> <command>dialog-apply</command> <object-name>airport-list</object-name> @@ -137,12 +695,15 @@ <binding> <command>presets-commit</command> </binding> + <binding> + <command>dialog-close</command> + </binding> </button> <empty><stretch>true</stretch></empty> <button> - <legend>Close</legend> + <legend>Cancel</legend> <equal>true</equal> <key>Esc</key> <binding> diff --git a/gui/dialogs/location-on-ground.xml b/gui/dialogs/location-on-ground.xml deleted file mode 100644 index 2e58660f9..000000000 --- a/gui/dialogs/location-on-ground.xml +++ /dev/null @@ -1,303 +0,0 @@ -<?xml version="1.0"?> - -<PropertyList> - <name>location-on-ground</name> - <layout>vbox</layout> - - <group> - <layout>hbox</layout> - <empty><stretch>1</stretch></empty> - - <text> - <label>Position Aircraft On Ground</label> - </text> - - <empty><stretch>1</stretch></empty> - - <button> - <pref-width>16</pref-width> - <pref-height>16</pref-height> - <legend></legend> - <keynum>27</keynum> - <border>2</border> - <binding> - <command>dialog-close</command> - </binding> - </button> - </group> - - <hrule/> - - <nasal> - <open> - var dlg = props.globals.getNode("/sim/gui/dialogs/location-on-ground", 1); - var apt = dlg.getNode("airport", 1); - var aptname = dlg.getNode("airport-name", 1); - apt.setValue(getprop("/sim/presets/airport-id")); - var rwy = dlg.getNode("runway", 1); - rwy.setValue(""); - var parkpos = dlg.getNode("parkpos", 1); - parkpos.setValue(""); - - var mode = { - runway: dlg.getNode("use_runway", 1), - bestrunway: dlg.getNode("use_best_runway", 1), - parkpos: dlg.getNode("use_parkpos", 1) - }; - - var set_radio = func(m) { - foreach (k; keys(mode)) { - mode[k].setBoolValue(m == k); - } - } - - var initialized = 0; - foreach (k; keys(mode)) { - if (mode[k].getType() == "NONE" or initialized) { - mode[k].setBoolValue(0); - } else { - initialized += mode[k].getBoolValue(); - } - } - if (!initialized) { - set_radio("bestrunway"); - } - - var runways = dlg.getNode("available-runways", 1); - var parking = dlg.getNode("available-parking", 1); - - var updateAirport = func { - var icao = apt.getValue(); - runways.removeChildren("value"); - parking.removeChildren("value"); - - var a = airportinfo(icao); - if (a == nil) { - aptname.setValue(""); - return; - } - - aptname.setValue(a.name); - var i=0; - foreach (var rwy; keys(a.runways)) { - runways.getNode("value[" ~ i ~ "]", 1).setValue(rwy); - i += 1; - } - - i = 0; - foreach (var park; a.parking()) { - parking.getNode("value[" ~ i ~ "]", 1).setValue(park.name); - i += 1; - } - - gui.dialog_update("location-on-ground"); - } - - updateAirport(); - </open> - </nasal> - - <group> - <layout>table</layout> - <halign>center</halign> - - <text> - <row>0</row><col>1</col> - <halign>right</halign> - <label>Airport:</label> - </text> - - <input> - <row>0</row><col>2</col> - <live>true</live> - <property>/sim/gui/dialogs/location-on-ground/airport</property> - <binding> - <command>dialog-apply</command> - </binding> - <binding> - <command>nasal</command> - <script> - updateAirport(); - </script> - </binding> - </input> - - <text> - <row>1</row> - <col>1</col> - <format>%s</format> - <property>/sim/gui/dialogs/location-on-ground/airport-name</property> - <live>true</live> - <stretch>true</stretch> - <halign>fill</halign> - </text> - - <radio> - <row>2</row><col>0</col> - <property>/sim/gui/dialogs/location-on-ground/use_best_runway</property> - <live>true</live> - <binding> - <command>nasal</command> - <script>set_radio("bestrunway")</script> - </binding> - </radio> - - <text> - <row>2</row><col>1</col> - <halign>right</halign> - <label>Best runway</label> - <enable> - <property>/sim/gui/dialogs/location-on-ground/use_best_runway</property> - </enable> - </text> - <text> - <row>2</row><col>2</col> - <halign>right</halign> - <label>(based on wind)</label> - <enable> - <property>/sim/gui/dialogs/location-on-ground/use_best_runway</property> - </enable> - </text> - - <radio> - <row>3</row><col>0</col> - <property>/sim/gui/dialogs/location-on-ground/use_runway</property> - <live>true</live> - <binding> - <command>nasal</command> - <script>set_radio("runway")</script> - </binding> - </radio> - - <text> - <row>3</row><col>1</col> - <halign>right</halign> - <label>Runway:</label> - <enable> - <property>/sim/gui/dialogs/location-on-ground/use_runway</property> - </enable> - </text> - - <combo> - <name>runway</name> - <row>3</row><col>2</col> - <pref-width>85</pref-width> - <enable> - <property>/sim/gui/dialogs/location-on-ground/use_runway</property> - </enable> - <property>sim/gui/dialogs/location-on-ground/runway</property> - <editable>false</editable> - <properties>sim/gui/dialogs/location-on-ground/available-runways</properties> - <binding> - <command>dialog-apply</command> - <object-name>runway</object-name> - </binding> - </combo> - - <radio> - <row>4</row><col>0</col> - <property>/sim/gui/dialogs/location-on-ground/use_parkpos</property> - <live>true</live> - <binding> - <command>nasal</command> - <script>set_radio("parkpos")</script> - </binding> - </radio> - - <text> - <row>4</row><col>1</col> - <halign>right</halign> - <label>Parking:</label> - <enable> - <property>/sim/gui/dialogs/location-on-ground/use_parkpos</property> - </enable> - </text> - - <combo> - <name>parking</name> - <row>4</row><col>2</col> - <pref-width>85</pref-width> - <enable> - <property>/sim/gui/dialogs/location-on-ground/use_parkpos</property> - </enable> - <property>/sim/gui/dialogs/location-on-ground/parkpos</property> - <editable>false</editable> - <properties>sim/gui/dialogs/location-on-ground/available-parking</properties> - <binding> - <command>dialog-apply</command> - <object-name>parking</object-name> - </binding> - </combo> - </group> - - <hrule/> - - <group> - <layout>hbox</layout> - <default-padding>10</default-padding> - <empty><stretch>true</stretch></empty> - - <button> - <legend>OK</legend> - <default>true</default> - <equal>true</equal> - <binding> - <command>dialog-apply</command> - </binding> - <enable> - <not> - <and> - <property>/sim/gui/dialogs/location-on-ground/use_runway</property> - <equals> - <property>/sim/gui/dialogs/location-on-ground/runway</property> - <value></value> - </equals> - </and> - </not> - </enable> - <binding> - <command>nasal</command> - <script> - setprop("/sim/presets/airport-id", apt.getValue()); - if (mode["bestrunway"].getBoolValue()) { - setprop("/sim/presets/runway", ""); - setprop("/sim/presets/parkpos", ""); - } else if (mode["runway"].getBoolValue()) { - setprop("/sim/presets/runway", rwy.getValue()); - setprop("/sim/presets/parkpos", ""); - } else { - setprop("/sim/presets/runway", ""); - setprop("/sim/presets/parkpos", parkpos.getValue()); - } - setprop("/sim/presets/longitude-deg", -9999); - setprop("/sim/presets/latitude-deg", -9999); - setprop("/sim/presets/altitude-ft", -9999); - setprop("/sim/presets/airspeed-kt", 0); - setprop("/sim/presets/offset-distance-nm", 0); - setprop("/sim/presets/offset-azimuth-nm", 0); - setprop("/sim/presets/glideslope-deg", 0); - setprop("/sim/presets/heading-deg", 9999); - </script> - </binding> - <binding> - <command>presets-commit</command> - </binding> - <binding> - <command>dialog-close</command> - </binding> - </button> - - <empty><stretch>true</stretch></empty> - - <button> - <legend>Cancel</legend> - <equal>true</equal> - <key>Esc</key> - <binding> - <command>dialog-close</command> - </binding> - </button> - - <empty><stretch>true</stretch></empty> - </group> -</PropertyList> diff --git a/gui/menubar.xml b/gui/menubar.xml index 2d074f404..c6bdf4a69 100644 --- a/gui/menubar.xml +++ b/gui/menubar.xml @@ -172,14 +172,6 @@ <menu> <name>location</name> - <item> - <name>position-on-ground</name> - <binding> - <command>dialog-show</command> - <dialog-name>location-on-ground</dialog-name> - </binding> - </item> - <item> <name>position-in-air</name> <binding>