<?xml version="1.0"?> <!-- generic-canvas.map XML: - to be used by dialogs and instruments to add a generic map (navaids, fixes, airports etc) - with each feature put on a separate layer (canvas group) - each layer being controllable via a boolean property NOTE: This is still work in progress, and will be significantly refactored in the time to come Current requirements: (these are subject to change) Dialogs wanting to use this, MUST: - set DIALOG_CANVAS in open block - provide a helper function dialog_property(p) to return a property appended to the dialog root in /sim/gui/dialogs/FOO/ - to set up layer-checkboxes automatically, use canvas.GenericMap.setupGUICheckboxes(DIALOG_CANVAS, gui_group) For example, add this to your dialogs Nasal/open block in "foo.xml": var dialog_name = "foo"; var dialog_property = func(p) return "/sim/gui/dialogs/foo/"~p; var DIALOG_CANVAS = gui.findElementByName(cmdarg(), "airport-selection"); canvas.GenericMap.setupGUICheckboxes(DIALOG_CANVAS, "canvas-control"); TODO: use a single "InitCanvasMapSupport();" helper In the close block, you'll want to call "map.cleanup_listeners()" at the moment --> <PropertyList> <!--FIXME: move somewhere else, this is GUI specific and not useful for canvas maps shown as instruments! --> <checkbox-toggle-template> <name></name> <label></label> <property></property> <binding> <command>dialog-apply</command> <object-name></object-name> </binding> </checkbox-toggle-template> <!-- will be procedurally added to the dialog --> <zoom-template> <button> <name>zoomout</name> <legend>-</legend> <pref-width>22</pref-width> <pref-height>22</pref-height> <binding> <command>property-adjust</command> <property></property> <min>0</min> <step>-1</step> </binding> </button> <text> <label>MMMM</label> <halign>center</halign> <format>Zoom %d</format> <property></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></property> <step>1</step> <max></max> <!-- FIXME: compute dynamically via Nasal size() or just a property--> </binding> </button> <empty><stretch>true</stretch></empty> </zoom-template> <nasal> <load><![CDATA[ var my_canvas = canvas.get(cmdarg()); my_canvas.setColorBackground(0.2, 0.5, 0.2, 0.5); #TODO: support customization in XML var root = my_canvas.createGroup(); # the top level AirportMap element uses a "GenericMap" now: #TODO: features should be procedurally enabled via params (WIP) #TODO: use generic Map and instantiate via XML var map = canvas.GenericMap.new(parent:root, name:dialog_name) # FIXME: We shouldn't be using AirportMap here: # we need a high level wrapper that can instantiate # all sorts of maps, not just AirportMaps .setTranslation(300, 200) # TODO: move to Map class ctor! .setupZoom( dialog:DIALOG_CANVAS ) # TODO: make zooming configurable for non GUI use .pickupFeatures (DIALOG_CANVAS); # set up the features specified in the XML file var offset = [0,0]; my_canvas.addEventListener("drag", func(e) { offset[0] += e.deltaX; offset[1] += e.deltaY; map.setTranslation(300 + offset[0], 200 + offset[1]); }); my_canvas.addEventListener("wheel", func(e) { map.zoom_property.setIntValue(map.zoom_property.getValue() + e.deltaY ); }); canvas.run_callbacks(); # WORKAROUND to run dialog-specific init code - # must be set up via register_callback() in the dialog's open block currently ]]> </load> </nasal> </PropertyList>