158 lines
5.6 KiB
Text
158 lines
5.6 KiB
Text
|
# DirectTo page
|
||
|
#
|
||
|
# Technically this is supposed to be an overlay page, sitting on top of
|
||
|
# whatever page the user was on already. However, to simplify implementation,
|
||
|
# we will assume that the user was on the Map page, and simply display the
|
||
|
# NavigationMap page underneath.
|
||
|
|
||
|
var DirectTo =
|
||
|
{
|
||
|
new : func (mfd, myCanvas, device, svg)
|
||
|
{
|
||
|
var obj = {
|
||
|
parents : [
|
||
|
DirectTo,
|
||
|
MFDPage.new(mfd, myCanvas, device, svg, "DirectTo", "DIRECT TO")
|
||
|
],
|
||
|
symbols : {},
|
||
|
};
|
||
|
|
||
|
obj.crsrIdx = 0;
|
||
|
|
||
|
# Dynamic text elements in the SVG file. In the SVG these have an "DirectTo" prefix.
|
||
|
textelements = [
|
||
|
"Name",
|
||
|
"City",
|
||
|
"Region",
|
||
|
"LocationBRG",
|
||
|
"LocationDIS",
|
||
|
"RangeDisplay"
|
||
|
];
|
||
|
|
||
|
obj.addTextElements(textelements);
|
||
|
|
||
|
obj._SVGGroup.setInt("z-index", 9);
|
||
|
|
||
|
# Data Entry information. Keyed from the name of the element, which must
|
||
|
# be one of the textelements above. Each data element maps to a set of
|
||
|
# text elements in the SVG of the form [PageName][TextElement]{0...n}, each
|
||
|
# representing a single character for data entry.
|
||
|
#
|
||
|
# .size is the number of characters of data entry
|
||
|
# .chars is the set of characters, used to scroll through using the small
|
||
|
# FMS knob.
|
||
|
obj.IDEntry = PFD.DataEntryElement.new(obj.pageName, svg, "ID", "", 4, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
|
||
|
obj.VNVAltEntry = PFD.DataEntryElement.new(obj.pageName, svg, "VNVAlt", "", 5, "0123456789");
|
||
|
obj.VNVOffsetEntry = PFD.DataEntryElement.new(obj.pageName, svg, "VNVOffset", "", 2, "0123456789");
|
||
|
obj.CourseEntry = PFD.DataEntryElement.new(obj.pageName, svg, "Course", "", 3, "0123456789");
|
||
|
obj.Activate = PFD.TextElement.new(obj.pageName, svg, "Activate", "ACTIVATE");
|
||
|
|
||
|
# 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(1045, 485);
|
||
|
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.setController(fg1000.DirectToController.new(obj, svg));
|
||
|
return obj;
|
||
|
},
|
||
|
displayDestination : func(destination) {
|
||
|
|
||
|
if (destination != nil) {
|
||
|
# Display a given location
|
||
|
debug.dump(destination);
|
||
|
me.DirectToChart.setVisible(1);
|
||
|
me.DirectToChart.getController().setPosition(destination.lat,destination.lon);
|
||
|
me.setTextElement("Name", string.uc(destination.name));
|
||
|
me.setTextElement("City", "CITY");
|
||
|
me.setTextElement("Region", "REGION");
|
||
|
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));
|
||
|
} else {
|
||
|
me.DirectToChart.setVisible(1);
|
||
|
me.setTextElement("Name", "");
|
||
|
me.setTextElement("City", "");
|
||
|
me.setTextElement("Region", "");
|
||
|
me.setTextElement("LocationBRG", "_");
|
||
|
me.setTextElement("LocationDIS", "_");
|
||
|
|
||
|
me.IDEntry.setValue("____");
|
||
|
me.VNVAltEntry.setValue("00000");
|
||
|
me.VNVOffsetEntry.setValue("00");
|
||
|
me.CourseEntry.setValue(0);
|
||
|
}
|
||
|
},
|
||
|
setRange : func(range, label) {
|
||
|
me.DirectToChart.setRange(range);
|
||
|
me.DirectToChart.update();
|
||
|
me.setTextElement("RangeDisplay", label);
|
||
|
},
|
||
|
# Clear any cursor, highlights. Used when exiting from CRSR mode
|
||
|
resetCRSR : func() {
|
||
|
me.airportEntry.unhighlightElement();
|
||
|
me.runwaySelect.unhighlightElement();
|
||
|
me.freqSelect.hideCRSR();
|
||
|
},
|
||
|
|
||
|
offdisplay : func() {
|
||
|
me._group.setVisible(0);
|
||
|
me.getController().offdisplay();
|
||
|
me.mfd.NavigationMap.offdisplay(0);
|
||
|
},
|
||
|
ondisplay : func() {
|
||
|
me._group.setVisible(1);
|
||
|
# Display a false title, as underneath we're showing the navigation map.
|
||
|
me.mfd.setPageTitle("MAP - NAVIGATION MAP");
|
||
|
me.getController().ondisplay();
|
||
|
|
||
|
# The DirectTo pages displays over the NavigationMap. This is a hack
|
||
|
# as the page should just magically sit ontop of whatever page the user was
|
||
|
# on. However, we also need to disable the NavMap's own controller so there's
|
||
|
# no confusion.
|
||
|
me.mfd.NavigationMap.ondisplay(0);
|
||
|
},
|
||
|
|
||
|
# When the Direct To display is enabled, nothing is displayed on the softkeys.
|
||
|
topMenu : func(device, pg, menuitem) {
|
||
|
pg.clearMenu();
|
||
|
pg.resetMenuColors();
|
||
|
device.updateMenus();
|
||
|
},
|
||
|
|
||
|
};
|