diff --git a/Aircraft/Instruments-3d/FG1000/MFDPages/DirectTo.svg b/Aircraft/Instruments-3d/FG1000/MFDPages/DirectTo.svg
index ba818c841..adb06fb55 100644
--- a/Aircraft/Instruments-3d/FG1000/MFDPages/DirectTo.svg
+++ b/Aircraft/Instruments-3d/FG1000/MFDPages/DirectTo.svg
@@ -23,9 +23,9 @@
borderopacity="0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
- inkscape:zoom="2.2962556"
- inkscape:cx="778.1918"
- inkscape:cy="230.23655"
+ inkscape:zoom="3.2473958"
+ inkscape:cx="817.98224"
+ inkscape:cy="351.10971"
inkscape:document-units="px"
inkscape:current-layer="DirectToGroup"
showgrid="true"
@@ -68,6 +68,18 @@
+
+
+
+
+
+
diff --git a/Aircraft/Instruments-3d/FG1000/MFDPages/NavigationMap.svg b/Aircraft/Instruments-3d/FG1000/MFDPages/NavigationMap.svg
index 580ff2caf..596fe1256 100644
--- a/Aircraft/Instruments-3d/FG1000/MFDPages/NavigationMap.svg
+++ b/Aircraft/Instruments-3d/FG1000/MFDPages/NavigationMap.svg
@@ -23,9 +23,9 @@
borderopacity="0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
- inkscape:zoom="2.8284271"
- inkscape:cx="723.45322"
- inkscape:cy="612.12112"
+ inkscape:zoom="1.4142136"
+ inkscape:cx="851.72535"
+ inkscape:cy="412.85117"
inkscape:document-units="px"
inkscape:current-layer="NavigationMapGroup"
showgrid="true"
@@ -69,103 +69,64 @@
-
-
-
+
+
+
+
+ Zoom nm
-
- NORTH UP
-
-
-
-
- Zoom nm
-
- NORTH UP
+ id="NavigationMapRangeDisplay"
+ transform="scale(0.93580798,1.0685953)"
+ inkscape:label="RangeDisplay"
+ sodipodi:linespacing="0%">Zoom nm
+
+ NORTH UP
+
diff --git a/Aircraft/Instruments-3d/FG1000/Nasal/ConfigStore.nas b/Aircraft/Instruments-3d/FG1000/Nasal/ConfigStore.nas
index 1de52c81f..5f2fbf1a7 100644
--- a/Aircraft/Instruments-3d/FG1000/Nasal/ConfigStore.nas
+++ b/Aircraft/Instruments-3d/FG1000/Nasal/ConfigStore.nas
@@ -27,29 +27,32 @@ var ConfigStore = {
# declutter - the maximum declutter level (0-3) that this layer is visible in
# range - the maximum range this layer is visible (configured by user)
# max_range - the maximum range value that a user can configure for this layer.
+ # static - whether this layer should be displayed on static maps (as opposed to the moving maps)
+ # factory - name of the factory to use for creating the layer
+ # priority - layer priority
layerRanges : {
- DTO : { enabled: 0, declutter: 3, range: 2000, max_range: 2000 },
+ DTO : { enabled: 0, declutter: 3, range: 2000, max_range: 2000, static : 0, factory : canvas.SymbolLayer, priority : 4 },
- GRID : { enabled: 0, declutter: 1, range: 20, max_range: 2000 },
- DME : { enabled: 1, declutter: 1, range: 150, max_range: 300 },
- VOR_FG1000 : { enabled: 1, declutter: 1, range: 150, max_range: 300 },
- NDB : { enabled: 1, declutter: 1, range: 15, max_range: 30 },
- FIX : { enabled: 1, declutter: 1, range: 15, max_range: 30 },
- RTE : { enabled: 1, declutter: 3, range: 2000, max_range: 2000 },
- WPT : { enabled: 1, declutter: 3, range: 2000, max_range: 2000 },
+ GRID : { enabled: 0, declutter: 1, range: 20, max_range: 2000, static : 1, factory : canvas.SymbolLayer, priority : 4 },
+ DME : { enabled: 1, declutter: 1, range: 150, max_range: 300, static : 1, factory : canvas.SymbolLayer, priority : 4 },
+ VOR_FG1000 : { enabled: 1, declutter: 1, range: 150, max_range: 300, static : 1, factory : canvas.SymbolLayer, priority : 4 },
+ NDB : { enabled: 1, declutter: 1, range: 15, max_range: 30, static : 1, factory : canvas.SymbolLayer, priority : 4 },
+ FIX : { enabled: 1, declutter: 1, range: 15, max_range: 30, static : 1, factory : canvas.SymbolLayer, priority : 4 },
+ RTE : { enabled: 1, declutter: 3, range: 2000, max_range: 2000, static : 0, factory : canvas.SymbolLayer, priority : 4 },
+ WPT : { enabled: 1, declutter: 3, range: 2000, max_range: 2000, static : 0, factory : canvas.SymbolLayer, priority : 4 },
- APS : { enabled: 1, declutter: 3, range: 2000, max_range: 2000 },
- FLT : { enabled: 1, declutter: 3, range: 2000, max_range: 2000 },
+ FLT : { enabled: 1, declutter: 3, range: 2000, max_range: 2000, static : 1, factory : canvas.SymbolLayer, priority : 4 },
- WXR : { enabled: 1, declutter: 2, range: 2000, max_range: 2000 },
+ WXR : { enabled: 1, declutter: 2, range: 2000, max_range: 2000, static : 1, factory : canvas.SymbolLayer, priority : 4 },
- APT : { enabled: 1, declutter: 2, range: 150, max_range: 300 },
+ APT : { enabled: 1, declutter: 2, range: 150, max_range: 300, static : 1, factory : canvas.SymbolLayer, priority : 4 },
- TFC : { enabled: 0, declutter: 3, range: 150, max_range: 2000},
+ TFC : { enabled: 0, declutter: 3, range: 150, max_range: 2000, static : 1, factory : canvas.SymbolLayer, priority : 4 },
+ APS : { enabled: 1, declutter: 3, range: 2000, max_range: 2000, static : 1, factory : canvas.SymbolLayer, priority : 4 },
- OpenAIP : { enabled: 1, declutter: 1, range: 150, max_range: 300 },
- STAMEN : { enabled: 1, declutter: 3, range: 500, max_range: 2000 },
- STAMEN_terrain : { enabled: 1, declutter: 3, range: 500, max_range: 2000 },
+ STAMEN_terrain : { enabled: 1, declutter: 3, range: 500, max_range: 2000, static : 1, factory : canvas.OverlayLayer, priority : 1 },
+ OpenAIP : { enabled: 1, declutter: 1, range: 150, max_range: 300, static : 1, factory : canvas.OverlayLayer, priority : 1 },
+ STAMEN : { enabled: 1, declutter: 3, range: 500, max_range: 2000, static : 1, factory : canvas.OverlayLayer, priority : 1 },
},
configValues : {
diff --git a/Aircraft/Instruments-3d/FG1000/Nasal/MFD.nas b/Aircraft/Instruments-3d/FG1000/Nasal/MFD.nas
index 3df92bb9e..d0d6c319a 100644
--- a/Aircraft/Instruments-3d/FG1000/Nasal/MFD.nas
+++ b/Aircraft/Instruments-3d/FG1000/Nasal/MFD.nas
@@ -94,9 +94,6 @@ var MFDDisplay =
# If we don't return anything the default font is used
};
- canvas.parsesvg(obj._svg,
- EIS_SVG,
- {'font-mapper': fontmapper});
foreach (var page; MFDPages) {
var svg_file ='/Aircraft/Instruments-3d/FG1000/MFDPages/' ~ page ~ '.svg';
@@ -108,6 +105,10 @@ var MFDDisplay =
}
}
+ canvas.parsesvg(obj._svg,
+ EIS_SVG,
+ {'font-mapper': fontmapper});
+
obj._MFDDevice = canvas.PFD_Device.new(obj._svg, 12, "SoftKey", myCanvas, "MFD");
obj._MFDDevice.device_id = device_id;
obj._MFDDevice.RegisterWithEmesary();
diff --git a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/DirectTo/DirectTo.nas b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/DirectTo/DirectTo.nas
index 234cae5c4..3deb9f9d0 100644
--- a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/DirectTo/DirectTo.nas
+++ b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/DirectTo/DirectTo.nas
@@ -44,7 +44,6 @@ var DirectTo =
"Region",
"LocationBRG",
"LocationDIS",
- "RangeDisplay"
];
obj.addTextElements(textelements);
@@ -74,40 +73,7 @@ var DirectTo =
obj.WaypointSubmenuScroll = PFD.GroupElement.new(obj.pageName, svg, [ "WaypointSubmenuScroll" ] , 4, "WaypointSubmenuScroll", 0, "WaypointSubmenuScrollTrough" , "WaypointSubmenuScrollThumb", 60);
# The Airport Chart
- obj.DirectToChart = obj._group.createChild("map");
- obj.DirectToChart.setInt("z-index", 100);
-
- obj.DirectToChart.setController("Static position", "main");
-
-
- # Initialize a range and screen resolution. Setting a range
- # to 15nm means we pick up a good set of surrounding fixes
- # We will use the screen range for zooming.
- obj.DirectToChart.setRange(8.0);
- obj.DirectToChart.setScreenRange(300/2.0);
- obj.DirectToChart.setTranslation(860, 440);
- obj.DirectToChart.set("clip-frame", canvas.Element.LOCAL);
- obj.DirectToChart.set("clip", "rect(-160px, 160px, 160px, -160px)");
-
- var r = func(name,vis=1,zindex=nil) return caller(0)[0];
- foreach(var type; [r('APT'),r('DME'),r('VOR'),r('NDB'),r('FIX')] ) {
- obj.DirectToChart.addLayer(canvas.SymbolLayer,
- type.name,
- 10,
- obj.Styles.getStyle(type.name),
- obj.Options.getOption(type.name),
- type.vis );
- }
-
- foreach(var type; [ r('STAMEN')]) {
- obj.DirectToChart.addLayer(factory: canvas.OverlayLayer, type_arg: type.name,
- priority: 9,
- style: obj.Styles.getStyle(type.name),
- options: obj.Options.getOption(type.name),
- visible: 1);
- }
-
-
+ obj.DirectToChart = fg1000.NavMap.new(obj, obj.getElement("Map"), [860,440], "rect(-160px, 160px, 160px, -160px)", 0, 2, 1);
obj.setController(fg1000.DirectToController.new(obj, svg));
return obj;
@@ -123,13 +89,13 @@ var DirectTo =
me.setTextElement("Name", string.uc(destination.name));
me.setTextElement("City", "CITY");
me.setTextElement("Region", "REGION");
- me.setTextElement("LocationBRG", "" ~ sprintf("%03d", destination.course));
+ me.setTextElement("LocationBRG", "" ~ sprintf("%03d°", destination.course));
me.setTextElement("LocationDIS", sprintf("%d", destination.range_nm) ~ "nm");
me.IDEntry.setValue(destination.id);
me.VNVAltEntry.setValue("00000");
me.VNVOffsetEntry.setValue("00");
- me.CourseEntry.setValue("" ~ sprintf("%03d", destination.course));
+ me.CourseEntry.setValue("" ~ sprintf("%03d°", destination.course));
} else {
me.DirectToChart.setVisible(1);
me.setTextElement("Name", "");
@@ -145,12 +111,6 @@ var DirectTo =
}
},
- setRange : func(range, label) {
- me.DirectToChart.setRange(range);
- me.DirectToChart.update();
- me.setTextElement("RangeDisplay", label);
- },
-
offdisplay : func() {
me._group.setVisible(0);
me.getController().offdisplay();
@@ -160,6 +120,9 @@ var DirectTo =
me._group.setVisible(1);
# Display a false title, as underneath we're showing the navigation map.
me.mfd.setPageTitle("MAP - NAVIGATION MAP");
+ me.getElement("Map").setVisible(1);
+ me.getElement("Map-bg").setVisible(1);
+ me.DirectToChart.setVisible(1);
me.getController().ondisplay();
# The DirectTo pages displays over the NavigationMap. This is a hack
diff --git a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/DirectTo/DirectToController.nas b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/DirectTo/DirectToController.nas
index cd60c6118..d0008bf0c 100644
--- a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/DirectTo/DirectToController.nas
+++ b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/DirectTo/DirectToController.nas
@@ -17,49 +17,11 @@
# DirectTo Controller
var DirectToController =
{
- # Vertical ranges, and labels.
- # Unlike some other map displays, we keep the range constant at 4nm an change
- # the ScreenRange to zoom in. Otherwise as we zoom in, the center of the
- # runways moves out of the range of the display and they are not drawn.
- # Ranges are scaled to the display height with range 1 displaying 4nm vertically.
- # 2000nm = 12,152,000ft.
- RANGES : [{range: 500/6076.12, label: "500ft"},
- {range: 750/6076.12, label: "750ft"},
- {range: 1000/6076.12, label: "1000ft"},
- {range: 1500/6076.12, label: "1500ft"},
- {range: 2000/6076.12, label: "2000ft"},
- {range: 0.5, label: "0.5nm"},
- {range: 0.75, label: "0.75nm"},
- {range: 1, label: "1nm"},
- {range: 2, label: "2nm"},
- {range: 3, label: "3nm"},
- {range: 4, label: "4nm"},
- {range: 6, label: "6nm"},
- {range: 8, label: "8nm"},
- {range: 10, label: "10nm"},
- {range: 12, label: "12nm"},
- {range: 15, label: "15nm"},
- {range: 20, label: "20nm"},
- {range: 25, label: "25nm"},
- {range: 30, label: "30nm"},
- {range: 40, label: "40nm"},
- {range: 50, label: "50nm"},
- {range: 75, label: "75nm"},
- {range: 100, label: "100nm"},
- {range: 200, label: "200nm"},
- {range: 500, label: "500nm"},
- {range: 1000, label: "1000nm"},
- {range: 1500, label: "1500nm"},
- {range: 2000, label: "2000nm"}, ],
-
new : func (page, svg)
{
var obj = { parents : [ DirectToController, MFDPageController.new(page)] };
obj.id = "";
obj.page = page;
- obj.current_zoom = 13;
-
- obj.setZoom(obj.current_zoom);
obj._cursorElements = [
obj.page.IDEntry,
@@ -96,23 +58,6 @@ var DirectToController =
me.setCursorElement(me._selectedElement + incr_or_decr);
},
- # Control functions for Input
- zoomIn : func() {
- me.setZoom(me.current_zoom -1);
- },
- zoomOut : func() {
- me.setZoom(me.current_zoom +1);
- },
- handleRange : func(val)
- {
- var incr_or_decr = (val > 0) ? 1 : -1;
- me.setZoom(me.current_zoom + incr_or_decr);
- },
- setZoom : func(zoom) {
- if ((zoom < 0) or (zoom > (size(me.RANGES) - 1))) return;
- me.current_zoom = zoom;
- me.page.setRange(me.RANGES[zoom].range, me.RANGES[zoom].label);
- },
handleCRSR : func() {
# No effect, but shouldn't be passed to underlying page?
return emesary.Transmitter.ReceiptStatus_Finished;
diff --git a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NavigationMap/NavigationMap.nas b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NavigationMap/NavigationMap.nas
index d37b2ab54..8706d3a8e 100644
--- a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NavigationMap/NavigationMap.nas
+++ b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NavigationMap/NavigationMap.nas
@@ -26,97 +26,22 @@ var NavigationMap =
],
};
- # Center the map's origin, modified to take into account the surround.
- obj._group.setTranslation(
- fg1000.MAP_FULL.CENTER.X - (1024/2),
- fg1000.MAP_FULL.CENTER.Y - (768/2)
- );
-
- obj.MFDMap = obj._group.createChild("map");
-
- obj.MFDMap.setScreenRange(689/2.0);
-
- # Labels for map range and orientation. Two sets - one for the full display
- # and another for the partial display.
- obj.addTextElements(["RangeDisplay", "Orientation"]);
- obj.addTextElements(["RangeDisplayPartial", "OrientationPartial"]);
-
- obj._labelsFull = svg.getElementById("NavigationMapGroup");
- assert(obj._labelsFull != nil, "Unable to find NavigationMapGroup");
-
- obj._labelsPartial = svg.getElementById("NavigationMapGroupPartial");
- assert(obj._labelsPartial != nil, "Unable to find NavigationMapGroupPartial");
-
- # Initialize the controllers:
- var ctrl_ns = canvas.Map.Controller.get("Aircraft position");
- var source = ctrl_ns.SOURCES["current-pos"];
- if (source == nil) {
- # TODO: amend
- var source = ctrl_ns.SOURCES["current-pos"] = {
- getPosition: func subvec(geo.aircraft_position().latlon(), 0, 2),
- getAltitude: func getprop('/position/altitude-ft'),
- getHeading: func {
- if (me.aircraft_heading)
- getprop('/orientation/heading-deg')
- else 0
- },
- aircraft_heading: 1,
- };
- }
- setlistener("/sim/gui/dialogs/map-canvas/aircraft-heading-up", func(n) {
- source.aircraft_heading = n.getBoolValue();
- }, 1);
- # Make it move with our aircraft:
- obj.MFDMap.setController("Aircraft position", "current-pos"); # from aircraftpos.controller
-
- var r = func(name,vis=1,zindex=nil) return caller(0)[0];
- # TODO: we'll need some z-indexing here, right now it's just random
- foreach(var type; [r('GRID'),r('DTO',0),r('TFC',0),r('APT'),r('DME'),r('VOR_FG1000'),r('NDB'),r('FIX',0),r('GPS'),r('RTE'),r('WPT'),r('FLT'),r('WXR',0),r('APS')] ) {
- obj.MFDMap.addLayer(
- factory: canvas.SymbolLayer,
- type_arg: type.name,
- priority: 4,
- style: obj.Styles.getStyle(type.name),
- options: obj.Options.getOption(type.name),
- visible: type.vis);
- }
-
- foreach(var type; [ r('STAMEN_terrain'),r('STAMEN'), r('OpenAIP') ]) {
- obj.MFDMap.addLayer(
- factory: canvas.OverlayLayer,
- type_arg: type.name,
- priority: 1,
- style: obj.Styles.getStyle(type.name),
- options: obj.Options.getOption(type.name),
- visible: 0);
- }
-
- #obj.topMenu(device, obj, nil);
-
+ obj.MFDMap = fg1000.NavMap.new(
+ obj,
+ obj.getElement("NavMap"),
+ [fg1000.MAP_FULL.CENTER.X, fg1000.MAP_FULL.CENTER.Y],
+ "",
+ zindex=-10);
obj.setController(fg1000.NavigationMapController.new(obj, svg));
return obj;
},
- toggleLayerVisible : func(name) {
- (var l = me.MFDMap.getLayer(name)).setVisible(l.getVisible());
- },
- setLayerVisible : func(name,n=1) {
- me.MFDMap.getLayer(name).setVisible(n);
- },
- setRange : func(range, label) {
- me.MFDMap.setRange(range);
- me.setTextElement("RangeDisplay", label);
- me.setTextElement("RangeDisplayPartial", label);
- },
- setOrientation : func(orientation) {
- me.setTextElement("Orientation", orientation);
- me.setTextElement("OrientationPartial", orientation);
- },
- setScreenRange : func(range) {
- me.MFDMap.setScreenRange(range);
- },
+
offdisplay : func(controller=1) {
me._group.setVisible(0);
+ me.getElement("NavMap").setVisible(0);
+ me.getElement("NavMap-bg").setVisible(0);
+ me.MFDMap.setVisible(0);
# Reset the menu colours. Shouldn't have to do this here, but
# there's not currently an obvious other location to do so.
@@ -129,15 +54,19 @@ var NavigationMap =
},
ondisplay : func(controller=1) {
me._group.setVisible(1);
+ me.getElement("Group").setVisible(1);
+ me.getElement("NavMap").setVisible(1);
+ me.getElement("NavMap-bg").setVisible(1);
+ me.getElement("Legend").setVisible(1);
+ me.MFDMap.setVisible(1);
# Center the map's origin, modified to take into account the surround.
- me.MFDMap.setTranslation(
+ me.getElement("NavMap").setTranslation(
fg1000.MAP_FULL.CENTER.X,
fg1000.MAP_FULL.CENTER.Y
);
- me._labelsFull.setVisible(1);
- me._labelsPartial.setVisible(0);
+ me.getElement("Legend").setTranslation(0,0);
me.mfd.setPageTitle(me.title);
if (controller == 1) me.getController().ondisplay();
@@ -147,18 +76,27 @@ var NavigationMap =
# page - e.g. NearestAirports.
ondisplayPartial : func() {
me._group.setVisible(1);
- me.MFDMap.setTranslation(
+ me.getElement("Group").setVisible(1);
+ me.getElement("NavMap").setVisible(1);
+ me.getElement("NavMap-bg").setVisible(1);
+ me.getElement("Legend").setVisible(1);
+ me.MFDMap.setVisible(1);
+
+ # Center the map's origin, modified to take into account the surround.
+ me.getElement("NavMap").setTranslation(
fg1000.MAP_PARTIAL.CENTER.X,
fg1000.MAP_PARTIAL.CENTER.Y
);
- me._labelsFull.setVisible(0);
- me._labelsPartial.setVisible(1);
-
- #me.getController().ondisplayPartial();
+ me.getElement("Legend").setTranslation(-300,0);
},
offdisplayPartial : func() {
me._group.setVisible(0);
+ me.getElement("Group").setVisible(0);
+ me.getElement("NavMap").setVisible(0);
+ me.getElement("NavMap-bg").setVisible(0);
+ me.getElement("Legend").setVisible(0);
+ me.MFDMap.setVisible(0);
#me.getController().offdisplayPartial();
},
@@ -172,7 +110,7 @@ var NavigationMap =
pg.resetMenuColors();
pg.addMenuItem(0, "ENGINE", pg, pg.mfd.EIS.engineMenu);
pg.addMenuItem(2, "MAP", pg, pg.mfd.NavigationMap.mapMenu);
- pg.addMenuItem(8, "DCLTR", pg, func(dev, pg, mi) { pg.getController().incrDCLTR(dev, mi); } );
+ pg.addMenuItem(8, "DCLTR", pg, func(dev, pg, mi) { pg.mfd.NavigationMap.MFDMap.incrDCLTR(dev, mi); } );
#pg.addMenuItem(9, "SHW CHRT", pg); # Optional
#pg.addMenuItem(10, "CHKLIST", pg); # Optional
device.updateMenus();
@@ -182,22 +120,22 @@ var NavigationMap =
pg.clearMenu();
pg.resetMenuColors();
pg.addMenuItem(0, "TRAFFIC", pg,
- func(dev, pg, mi) { pg.mfd.NavigationMap.getController().toggleLayer("TFC"); device.updateMenus(); }, # callback
+ func(dev, pg, mi) { pg.mfd.NavigationMap.MFDMap.toggleLayer("TFC"); device.updateMenus(); }, # callback
func(svg, mi) { pg.mfd.NavigationMap.display_toggle(device, svg, mi, "TFC"); }
);
pg.addMenuItem(1, "PROFILE", pg);
pg.addMenuItem(2, "TOPO", pg,
- func(dev, pg, mi) { pg.mfd.NavigationMap.getController().toggleLayer("STAMEN"); device.updateMenus(); }, # callback
+ func(dev, pg, mi) { pg.mfd.NavigationMap.MFDMap.toggleLayer("STAMEN"); device.updateMenus(); }, # callback
func(svg, mi) { pg.mfd.NavigationMap.display_toggle(device, svg, mi, "STAMEN"); }
);
pg.addMenuItem(3, "TERRAIN", pg,
- func(dev, pg, mi) { pg.mfd.NavigationMap.getController().toggleLayer("STAMEN_terrain"); device.updateMenus(); }, # callback
+ func(dev, pg, mi) { pg.mfd.NavigationMap.MFDMap.toggleLayer("STAMEN_terrain"); device.updateMenus(); }, # callback
func(svg, mi) { pg.mfd.NavigationMap.display_toggle(device, svg, mi, "STAMEN_terrain"); }
);
- pg.addMenuItem(4, "AIRWAYS", pg, func(dev, pg, mi) { pg.mfd.NavigationMap.getController().incrAIRWAYS(dev, mi); } );
+ pg.addMenuItem(4, "AIRWAYS", pg, func(dev, pg, mi) { pg.mfd.NavigationMap.MFDMap.incrAIRWAYS(dev, mi); } );
#pg.addMenuItem(5, "STRMSCP", pg); Optional
#pg.addMenuItem(6, "PRECIP", pg); Optional, or NEXRAD
#pg.addMenuItem(7, "XM LTNG", pg); Optional, or DL LTNG
@@ -211,7 +149,7 @@ var NavigationMap =
# on whether a particular layer is enabled or not.
display_toggle : func(device, svg, mi, layer) {
var bg_name = sprintf("SoftKey%d-bg",mi.menu_id);
- if (me.getController().isEnabled(layer)) {
+ if (me.MFDMap.isEnabled(layer)) {
device.svg.getElementById(bg_name).setColorFill(0.5,0.5,0.5);
svg.setColor(0.0,0.0,0.0);
} else {
diff --git a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NavigationMap/NavigationMapController.nas b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NavigationMap/NavigationMapController.nas
index 4a9e34493..52f21345f 100644
--- a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NavigationMap/NavigationMapController.nas
+++ b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NavigationMap/NavigationMapController.nas
@@ -17,8 +17,6 @@
# Navigation Map Controller
var NavigationMapController =
{
-
-
# TODO: Add STAMEN topo layer, which is visible on all levels as opposed to
# roads, railways, boundaries, cities which are only visible on declutter 0.
@@ -31,94 +29,21 @@ var NavigationMapController =
new : func (page, svg)
{
var obj = { parents : [ NavigationMapController, MFDPageController.new(page) ] };
- obj.current_zoom = 13;
- obj.declutter = 0;
- obj.airways = 0;
obj.page = page;
- obj.setZoom(obj.current_zoom);
- obj.setOrientation(fg1000.ORIENTATIONS[0]);
-
return obj;
},
- zoomIn : func() {
- me.setZoom(me.current_zoom -1);
- },
- zoomOut : func() {
- me.setZoom(me.current_zoom +1);
- },
- setZoom : func(zoom) {
- if ((zoom < 0) or (zoom > (size(fg1000.RANGES) - 1))) return;
- me.current_zoom = zoom;
- # Ranges above represent vertical ranges, but the display is a rectangle, so
- # we need to use the diagonal range of the 1024 x 689, which is 617px.
- # 617px is 1.8 x 689/2, so we need to increase the range values by x1.8
- me.page.setRange(fg1000.RANGES[zoom].range, fg1000.RANGES[zoom].label);
- me.updateVisibility();
- },
- setOrientation : func(orientation) {
- me.page.setOrientation(orientation.label);
- },
- updateVisibility : func() {
- # Determine which layers should be visible.
- foreach (var layer_name; me.page.mfd.ConfigStore.getLayerNames()) {
- var layer = me.page.mfd.ConfigStore.getLayer(layer_name);
- if (layer.enabled and
- (fg1000.RANGES[me.current_zoom].range <= layer.range) and
- (me.declutter <= layer.declutter) )
- {
- me.page.MFDMap.getLayer(layer_name).setVisible(1);
- } else {
- me.page.MFDMap.getLayer(layer_name).setVisible(0);
- }
- }
- },
- isEnabled : func(layer) {
- return me.page.mfd.ConfigStore.isLayerEnabled(layer);
- },
- toggleLayer : func(layer) {
- me.page.mfd.ConfigStore.toggleLayerEnabled(layer);
- me.updateVisibility();
- },
-
- # Increment through the de-clutter levels, which impact what layers are
- # displayed. We also need to update the declutter menu item.
- incrDCLTR : func(device, menuItem) {
- me.declutter = math.mod(me.declutter +1, 4);
- menuItem.title = me.DCLTR[me.declutter];
- device.updateMenus();
- me.updateVisibility();
- },
-
- getDCLTRTitle : func() {
- return me.DCLTR[me.declutter];
- },
-
- # Increment through the AIRWAYS levels. At present this doesn't do anything
- # except change the label. It should enable/disable different airways
- # information.
- incrAIRWAYS : func(device, menuItem) {
- me.airways = math.mod(me.airways +1, 4);
- menuItem.title = me.AIRWAYS[me.airways];
- device.updateMenus();
- me.updateVisibility();
- },
- getAIRWAYSTitle : func() {
- return me.AIRWAYS[me.airways];
- },
# Set the DTO line target
setDTOLineTarget : func(lat, lon) {
- me.page.MFDMap.getLayer("DTO").controller.setTarget(lat,lon);
+ me.page.MFDMap.setDTOLineTarget(lat, lon);
},
enableDTO : func(enable) {
- me.page.mfd.ConfigStore.setLayerEnabled("DTO", enable);
- me.updateVisibility();
+ me.page.MFDMap.enableDTO(enable)
},
handleRange : func(val)
{
- var incr_or_decr = (val > 0) ? 1 : -1;
- me.setZoom(me.current_zoom + incr_or_decr);
+ me.page.MFDMap.handleRange(val);
},
# Reset controller if required when the page is displayed or hidden
@@ -128,5 +53,4 @@ var NavigationMapController =
offdisplay : func() {
me.DeRegisterWithEmesary();
},
-
};
diff --git a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NearestAirports/NearestAirports.nas b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NearestAirports/NearestAirports.nas
index 0831321d7..c9f16e979 100644
--- a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NearestAirports/NearestAirports.nas
+++ b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NearestAirports/NearestAirports.nas
@@ -144,8 +144,7 @@ var NearestAirports =
var crsAndDst = courseAndDistance(apt);
# Display the course and distance in NM .
- # 248 is the extended ASCII code for the degree symbol
- var crs = sprintf("%i%c", crsAndDst[0], 248);
+ var crs = sprintf("%i°", crsAndDst[0]);
var dst = sprintf("%.1fnm", crsAndDst[1]);
# Convert into something we can pass straight to the UIGroup.
diff --git a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NearestAirports/NearestAirportsController.nas b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NearestAirports/NearestAirportsController.nas
index ea56e680a..0241ec74d 100644
--- a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NearestAirports/NearestAirportsController.nas
+++ b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/NearestAirports/NearestAirportsController.nas
@@ -173,7 +173,7 @@ var NearestAirportsController =
handleRange : func(val)
{
# Pass any range entries to the NavMapController
- me.page.mfd.NavigationMap.controller.handleZoom(val);
+ me.page.mfd.NavigationMap.getController().handleRange(val);
},
diff --git a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/PFDInstruments/PFDInstruments.nas b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/PFDInstruments/PFDInstruments.nas
index 6b12fd28d..510a47b7a 100644
--- a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/PFDInstruments/PFDInstruments.nas
+++ b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/PFDInstruments/PFDInstruments.nas
@@ -78,10 +78,7 @@ var PFDInstruments =
obj.device.svg.getElementById("PFDInstruments" ~ id).set("clip", clip);
}
- #obj.insetMap = fg1000.NavMap.new(obj, [130,170], "rect(-160px, 160px, 160px, -160px)", -100, 2);
obj._SVGGroup.setInt("z-index", 10);
- #obj._SVGGroup.setVisible(0);
- #obj.insetMap = fg1000.NavMap.new(obj, [119,601], "rect(-109px, 109px, 109px, -109px)", 50, 2);
obj.insetMap = fg1000.NavMap.new(obj, obj.getElement("PFD-Map-Display"), [119,601], "rect(-109px, 109px, 109px, -109px)", 0, 2);
#obj.topMenu(device, obj, nil);
@@ -247,7 +244,7 @@ var PFDInstruments =
me.getController().offdisplay();
},
ondisplay : func() {
- me._group.setVisible(1);
+ me._group.setVisible(1);
me.getController().ondisplay();
},
diff --git a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/Surround/Surround.nas b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/Surround/Surround.nas
index 5119664c3..c4f2b78e3 100644
--- a/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/Surround/Surround.nas
+++ b/Aircraft/Instruments-3d/FG1000/Nasal/MFDPages/Surround/Surround.nas
@@ -57,10 +57,10 @@ var PAGE_GROUPS = [
# Mapping for header labels to specific FMS or ADC messages, and sprintf formatting
# to use
var HEADER_MAPPING = {
- "BRG" : { message : "FMSLegBearingMagDeg", format : "%d"},
+ "BRG" : { message : "FMSLegBearingMagDeg", format : "%d°"},
"XTK" : { message : "FMSLegCourseError", format : "%.1fnm"},
"DIS" : { message : "FMSDistance", format : "%.1fnm"},
- "DTK" : { message : "FMSLegDesiredTrack", format : "%d"},
+ "DTK" : { message : "FMSLegDesiredTrack", format : "%d°"},
"END" : { message : "EnduranceHrs", format : "%.1fhrs"},
"ESA" : { message : "EnRouteSafeAltitude", format : "%dft"}, # TODO
"ETA" : { message : "FMSEstimatedTimeArrival", format : ""}, # TODO
@@ -70,8 +70,8 @@ var HEADER_MAPPING = {
"GS" : { message : "FMSGroundspeed", format : "%dkts"},
"MSA" : { message : "MinimumSafeAltitude", format : "%dft"}, # TODO
"TAS" : { message : "ADCTrueAirspeed", format : "%dkts"},
- "TKE" : { message : "FMSLegTrackErrorAngle", format : "%d"},
- "TRK" : { message : "FMSLegTrack", format : "%d"},
+ "TKE" : { message : "FMSLegTrackErrorAngle", format : "%d°"},
+ "TRK" : { message : "FMSLegTrack", format : "%d°"},
"VSR" : { message : "FMSLegVerticalSpeedRequired", format : "%dfpm"}, # TODO
};
diff --git a/Aircraft/Instruments-3d/FG1000/Nasal/NavMap.nas b/Aircraft/Instruments-3d/FG1000/Nasal/NavMap.nas
index db515c61a..b2d8b5493 100644
--- a/Aircraft/Instruments-3d/FG1000/Nasal/NavMap.nas
+++ b/Aircraft/Instruments-3d/FG1000/Nasal/NavMap.nas
@@ -23,7 +23,7 @@ var NavMap = {
# Airways levels.
AIRWAYS : [ "AIRWAYS", "AIRWY ON", "AIRWY LO", "AIRWY HI"],
- new : func(page, element, center, clip="", zindex=0, vis_shift=0 )
+ new : func(page, element, center, clip="", zindex=0, vis_shift=0, static=0 )
{
var obj = {
parents : [ NavMap ],
@@ -52,26 +52,30 @@ var NavMap = {
if (obj._orientationDisplay == nil) die("Unable to find element " ~ obj._pageName ~ "OrientationDisplay");
# Initialize the controllers:
- var ctrl_ns = canvas.Map.Controller.get("Aircraft position");
- var source = ctrl_ns.SOURCES["current-pos"];
- if (source == nil) {
- # TODO: amend
- var source = ctrl_ns.SOURCES["current-pos"] = {
- getPosition: func subvec(geo.aircraft_position().latlon(), 0, 2),
- getAltitude: func getprop('/position/altitude-ft'),
- getHeading: func {
- if (me.aircraft_heading)
- getprop('/orientation/heading-deg')
- else 0
- },
- aircraft_heading: 1,
- };
+ if (static) {
+ obj.Map.setController("Static position", "main");
+ } else {
+ var ctrl_ns = canvas.Map.Controller.get("Aircraft position");
+ var source = ctrl_ns.SOURCES["current-pos"];
+ if (source == nil) {
+ # TODO: amend
+ var source = ctrl_ns.SOURCES["current-pos"] = {
+ getPosition: func subvec(geo.aircraft_position().latlon(), 0, 2),
+ getAltitude: func getprop('/position/altitude-ft'),
+ getHeading: func {
+ if (me.aircraft_heading)
+ getprop('/orientation/heading-deg')
+ else 0
+ },
+ aircraft_heading: 1,
+ };
+ }
+ setlistener("/sim/gui/dialogs/map-canvas/aircraft-heading-up", func(n) {
+ source.aircraft_heading = n.getBoolValue();
+ }, 1);
+ # Make it move with our aircraft:
+ obj.Map.setController("Aircraft position", "current-pos"); # from aircraftpos.controller
}
- setlistener("/sim/gui/dialogs/map-canvas/aircraft-heading-up", func(n) {
- source.aircraft_heading = n.getBoolValue();
- }, 1);
- # Make it move with our aircraft:
- obj.Map.setController("Aircraft position", "current-pos"); # from aircraftpos.controller
if (clip != "") {
obj.Map.set("clip-frame", canvas.Element.LOCAL);
@@ -82,26 +86,22 @@ var NavMap = {
element.setInt("z-index", zindex);
}
- var r = func(name,vis=1,zindex=nil) return caller(0)[0];
+ var r = func(name,on_static=1, vis=1,zindex=nil) return caller(0)[0];
# TODO: we'll need some z-indexing here, right now it's just random
- foreach(var type; [r('GRID'),r('DTO',0),r('TFC',0),r('APT'),r('DME'),r('VOR_FG1000'),r('NDB'),r('FIX',0),r('GPS'),r('RTE'),r('WPT'),r('FLT'),r('WXR',0),r('APS')] ) {
- obj.Map.addLayer(
- factory: canvas.SymbolLayer,
- type_arg: type.name,
- priority: 4,
- style: obj.Styles.getStyle(type.name),
- options: obj.Options.getOption(type.name),
- visible: type.vis);
- }
+ foreach (var layer_name; obj._page.mfd.ConfigStore.getLayerNames()) {
+ var layer = obj._page.mfd.ConfigStore.getLayer(layer_name);
- foreach(var type; [ r('STAMEN_terrain'),r('STAMEN'), r('OpenAIP') ]) {
+ if ((static == 0) or (layer.static == 1)) {
+ # Not all layers are displayed for all map types. Specifically,
+ # some layers are not displayed on static maps - e.g. DirectTo
obj.Map.addLayer(
- factory: canvas.OverlayLayer,
- type_arg: type.name,
- priority: 1,
- style: obj.Styles.getStyle(type.name),
- options: obj.Options.getOption(type.name),
+ factory: layer.factory,
+ type_arg: layer_name,
+ priority: layer.priority,
+ style: obj.Styles.getStyle(layer_name),
+ options: obj.Options.getOption(layer_name),
visible: 0);
+ }
}
obj.setZoom(obj.current_zoom);
@@ -110,6 +110,14 @@ var NavMap = {
return obj;
},
+ setController : func(type, controller ) {
+ me.Map.setController(type, controller);
+ },
+
+ getController : func() {
+ return me.Map.getController();
+ },
+
toggleLayerVisible : func(name) {
(var l = me.Map.getLayer(name)).setVisible(l.getVisible());
},
@@ -155,6 +163,8 @@ var NavMap = {
foreach (var layer_name; me._page.mfd.ConfigStore.getLayerNames()) {
var layer = me._page.mfd.ConfigStore.getLayer(layer_name);
+ if (me.Map.getLayer(layer_name) == nil) continue;
+
# Layers are only displayed if:
# 1) the user has enabled them.
# 2) The current zoom level is _less_ than the maximum range for the layer
@@ -165,7 +175,7 @@ var NavMap = {
var effective_range = fg1000.RANGES[effective_zoom].range;
if (layer.enabled and
(effective_range <= layer.range) and
- (me.declutter <= layer.declutter) )
+ (me.declutter <= layer.declutter) )
{
me.Map.getLayer(layer_name).setVisible(1);
} else {