658b1fe6ce
These are then attached to buttons on the checklist dialog allowing the user to ask the computer to execute the checklist step, which they can observe.
448 lines
14 KiB
XML
448 lines
14 KiB
XML
<?xml version="1.0"?>
|
|
|
|
<PropertyList>
|
|
<name>checklist</name>
|
|
<layout>vbox</layout>
|
|
<x>-5</x>
|
|
<y>5</y>
|
|
<default-padding>1</default-padding>
|
|
|
|
<color>
|
|
<red type="float">0.41</red>
|
|
<green type="float">0.4</green>
|
|
<blue type="float">0.42</blue>
|
|
<alpha type="float">1.0</alpha>
|
|
<alpha type="float">1.0</alpha>
|
|
</color>
|
|
|
|
<nasal>
|
|
<open><![CDATA[
|
|
|
|
var dlgRoot = cmdarg();
|
|
var checklists = props.globals.getNode("/sim/checklists", 1).getChildren("checklist");
|
|
var checklist_size = {};
|
|
|
|
|
|
if (size(checklists) > 0) {
|
|
|
|
setprop("sim/gui/dialogs/checklist/selected-checklist", checklists[0].getNode("title", 1).getValue());
|
|
setprop("sim/gui/dialogs/checklist/selected-page", 0);
|
|
|
|
var combo = gui.findElementByName(dlgRoot, "checklist-combo");
|
|
var group = gui.findElementByName(dlgRoot, "checklist-table-group");
|
|
|
|
var table_count = 0;
|
|
|
|
forindex (var idx; checklists) {
|
|
var checklist_name = checklists[idx].getNode("title", 1).getValue();
|
|
combo.getChild("value", idx, 1).setValue(checklist_name);
|
|
|
|
# Checklist may consist of one or more pages.
|
|
var pages = checklists[idx].getChildren("page");
|
|
|
|
if (size(pages) == 0) {
|
|
# Or no pages at all, in which case we need to create a checklist of one page
|
|
append(pages, checklists[idx]);
|
|
}
|
|
|
|
checklist_size[checklist_name] = size(pages);
|
|
|
|
if (idx == 0) {
|
|
setprop("/sim/gui/dialogs/checklist/next-available", 1);
|
|
setprop("/sim/gui/dialogs/checklist/selected-checklist-max-pages", checklist_size[checklist_name]);
|
|
setprop("/sim/gui/dialogs/checklist/selected-page-text", "1 / " ~ checklist_size[checklist_name]);
|
|
}
|
|
|
|
forindex (var p; pages) {
|
|
var c = pages[p];
|
|
var row = 0;
|
|
|
|
# Set up a new table, only visible when this checklist is selected.
|
|
var table = group.getChild("group", table_count, 1);
|
|
table.getNode("row", 1).setValue(0);
|
|
table.getNode("col", 1).setValue(0);
|
|
table.getNode("default-padding", 1).setValue(4);
|
|
table.getNode("layout", 1).setValue("table");
|
|
table.getNode("valign", 1).setValue("top");
|
|
|
|
# Set up conditional to only display when the checklist is selected
|
|
# and the page is correct.
|
|
var vis = table.getNode("visible", 1).getNode("and", 1);
|
|
var e = vis.getChild("equals", 0, 1);
|
|
e.getNode("property", 1).setValue("sim/gui/dialogs/checklist/selected-checklist");
|
|
e.getNode("value", 1).setValue(checklists[idx].getNode("title").getValue());
|
|
e = vis.getChild("equals", 1, 1);
|
|
e.getNode("property", 1).setValue("sim/gui/dialogs/checklist/selected-page");
|
|
e.getNode("value", 1).setValue(p);
|
|
|
|
var items = c.getChildren("item");
|
|
var txtcount = 0;
|
|
var btncount = 0;
|
|
|
|
forindex (var i; items) {
|
|
var item = items[i];
|
|
|
|
var t = table.getChild("text", txtcount, 1);
|
|
txtcount += 1;
|
|
|
|
var values = item.getChildren("value");
|
|
|
|
if (size(values) == 0) {
|
|
# Single name element with no values. Used as title
|
|
t.getNode("halign", 1).setValue("center");
|
|
t.getNode("row", 1).setValue(row);
|
|
t.getNode("col", 1).setValue(0);
|
|
t.getNode("colspan", 1).setValue(2);
|
|
t.getNode("label", 1).setValue(item.getNode("name", 1).getValue());
|
|
row = row + 1;
|
|
} else {
|
|
t.getNode("halign", 1).setValue("left");
|
|
t.getNode("row", 1).setValue(row);
|
|
t.getNode("col", 1).setValue(0);
|
|
t.getNode("label", 1).setValue(item.getNode("name", 1).getValue());
|
|
|
|
forindex (var v; values) {
|
|
var t = table.getChild("text", txtcount, 1);
|
|
txtcount += 1;
|
|
t.getNode("halign", 1).setValue("right");
|
|
t.getNode("row", 1).setValue(row);
|
|
if (v > 0) {
|
|
# The second row of values can overlap with the
|
|
# first column if required - helps keep the
|
|
# checklist dialog as compact as possible
|
|
t.getNode("col", 1).setValue(0);
|
|
t.getNode("colspan", 1).setValue(2);
|
|
} else {
|
|
t.getNode("col", 1).setValue(1);
|
|
}
|
|
|
|
t.getNode("label", 1).setValue(values[v].getValue());
|
|
|
|
# If there's a complete node, it contains a condition
|
|
# that can be checked to ensure the checklist item is
|
|
# complete. We display this item in yellow while the
|
|
# condition is not met, and green once it is complete.
|
|
|
|
var condition = item.getNode("condition");
|
|
|
|
if (condition != nil) {
|
|
var vis = t.getNode("visible", 1);
|
|
props.copy(condition, vis);
|
|
var c = t.getNode("color", 1);
|
|
c.getNode("red", 1).setValue(0.2);
|
|
c.getNode("green", 1).setValue(1.0);
|
|
c.getNode("blue", 1).setValue(0.2);
|
|
|
|
# Now create an yellow version for when the condition
|
|
# is not met.
|
|
t = table.getChild("text", txtcount, 1);
|
|
txtcount += 1;
|
|
|
|
t.getNode("halign", 1).setValue("right");
|
|
t.getNode("row", 1).setValue(row);
|
|
if (v > 0) {
|
|
# The second row of values can overlap with the
|
|
# first column if required - helps keep the
|
|
# checklist dialog as compact as possible
|
|
t.getNode("col", 1).setValue(0);
|
|
t.getNode("colspan", 1).setValue(2);
|
|
} else {
|
|
t.getNode("col", 1).setValue(1);
|
|
}
|
|
|
|
t.getNode("label", 1).setValue(values[v].getValue());
|
|
|
|
c = t.getNode("color", 1);
|
|
c.getNode("red", 1).setValue(1.0);
|
|
c.getNode("green", 1).setValue(1.0);
|
|
c.getNode("blue", 1).setValue(0.2);
|
|
|
|
vis = t.getNode("visible", 1).getNode("not", 1);
|
|
props.copy(condition, vis);
|
|
}
|
|
|
|
# If there is a marker node we display a small
|
|
# button that enables the marker.
|
|
var marker = item.getNode("marker");
|
|
|
|
if ((v == 0) and (marker != nil)) {
|
|
var s = marker.getNode("scale");
|
|
var scale = s != nil ? s.getValue() : 1;
|
|
|
|
var btn = table.getChild("button", btncount, 1);
|
|
btncount += 1;
|
|
btn.getNode("row", 1).setValue(row);
|
|
btn.getNode("col", 1).setValue(2);
|
|
btn.getNode("pref-width", 1).setValue(20);
|
|
btn.getNode("pref-height", 1).setValue(20);
|
|
btn.getNode("padding", 1).setValue(0);
|
|
btn.getNode("legend", 1).setValue("?");
|
|
var binding = btn.getNode("binding", 1);
|
|
binding.getNode("command", 1).setValue("nasal");
|
|
binding.getNode("script", 1).setValue(
|
|
"placeMarker(" ~ marker.getNode("x-m", 1).getValue() ~ ", " ~
|
|
marker.getNode("y-m", 1).getValue() ~ ", " ~
|
|
marker.getNode("z-m", 1).getValue() ~ ", " ~
|
|
scale ~ ");");
|
|
}
|
|
|
|
# If there's one or more binding nodes we display a
|
|
# small button that executes the binding. Used to
|
|
# demonstrate the checklist item
|
|
var bindings = item.getChildren("binding");
|
|
|
|
if ((v == 0) and (size(bindings) > 0)) {
|
|
var btn = table.getChild("button", btncount, 1);
|
|
btncount += 1;
|
|
btn.getNode("row", 1).setValue(row);
|
|
btn.getNode("col", 1).setValue(3);
|
|
btn.getNode("pref-width", 1).setValue(20);
|
|
btn.getNode("pref-height", 1).setValue(20);
|
|
btn.getNode("padding", 1).setValue(1);
|
|
btn.getNode("legend", 1).setValue(">");
|
|
|
|
forindex (var bdg; bindings) {
|
|
var binding = btn.getChild("binding", bdg, 1);
|
|
props.copy(bindings[bdg], binding);
|
|
}
|
|
}
|
|
|
|
row = row + 1;
|
|
}
|
|
|
|
table_count = table_count + 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
setprop("sim/gui/dialogs/checklist/selected-checklist",
|
|
checklists[0].getNode("title").getValue());
|
|
} else {
|
|
var group = gui.findElementByName(dlgRoot, "checklist-table-group");
|
|
var table = group.getNode("text", 1);
|
|
table.getNode("row", 1).setValue(0);
|
|
table.getNode("col", 1).setValue(0);
|
|
table.getNode("default-padding", 1).setValue(4);
|
|
table.getNode("layout", 1).setValue("table");
|
|
table.getNode("valign", 1).setValue("top");
|
|
table.getNode("halign", 1).setValue("center");
|
|
table.getNode("label", 1).setValue("No checklists exist for this aircraft");
|
|
}
|
|
|
|
var placeMarker = func(x,y,z,scale) {
|
|
var markerN = props.globals.getNode("/sim/model/marker", 1);
|
|
|
|
markerN.setValues({
|
|
"x/value": x,
|
|
"y/value": y,
|
|
"z/value": z,
|
|
"scale/value": scale,
|
|
"arrow-enabled": 1,
|
|
});
|
|
}
|
|
|
|
var nextPage = func() {
|
|
var currentPage = getprop("/sim/gui/dialogs/checklist/selected-page");
|
|
var s = getprop("/sim/gui/dialogs/checklist/selected-checklist");
|
|
|
|
if (currentPage < (checklist_size[s] - 1)) {
|
|
setprop("/sim/gui/dialogs/checklist/selected-page", currentPage + 1);
|
|
}
|
|
|
|
if (currentPage == (checklist_size[s] - 2)) {
|
|
setprop("/sim/gui/dialogs/checklist/next-available", 0);
|
|
}
|
|
|
|
setprop("/sim/gui/dialogs/checklist/selected-page-text", (currentPage + 2) ~ " / " ~ checklist_size[s]);
|
|
}
|
|
|
|
var previousPage = func() {
|
|
var currentPage = getprop("/sim/gui/dialogs/checklist/selected-page");
|
|
|
|
if (currentPage > 0) {
|
|
setprop("/sim/gui/dialogs/checklist/selected-page", currentPage - 1);
|
|
}
|
|
|
|
setprop("/sim/gui/dialogs/checklist/next-available", 1);
|
|
setprop("/sim/gui/dialogs/checklist/selected-page-text", currentPage ~ " / " ~ checklist_size[s]);
|
|
}
|
|
|
|
var setTransparency = func(updateDialog){
|
|
var alpha = (getprop("/sim/gui/dialogs/checklist/transparent") or 0);
|
|
dlgRoot.getNode("color/alpha").setValue(1-alpha*0.3);
|
|
dlgRoot.getNode("color/red").setValue(0.41-alpha*0.2);
|
|
dlgRoot.getNode("color/green").setValue(0.4-alpha*0.2);
|
|
dlgRoot.getNode("color/blue").setValue(0.42-alpha*0.2);
|
|
var n = props.Node.new({ "dialog-name": "checklist" });
|
|
if (updateDialog)
|
|
{
|
|
fgcommand("dialog-close", n);
|
|
fgcommand("dialog-show", n);
|
|
}
|
|
}
|
|
setTransparency(0);
|
|
|
|
]]></open>
|
|
|
|
<close><![CDATA[
|
|
# Hide the marker.
|
|
setprop("/sim/model/marker/arrow-enabled", 0);
|
|
]]></close>
|
|
</nasal>
|
|
|
|
<group>
|
|
<layout>hbox</layout>
|
|
<empty><stretch>1</stretch></empty>
|
|
|
|
<text>
|
|
<label>Aircraft Checklists</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/>
|
|
|
|
<group>
|
|
<layout>hbox</layout>
|
|
|
|
<text>
|
|
<halign>right</halign>
|
|
<label>Checklist:</label>
|
|
</text>
|
|
|
|
<combo>
|
|
<name>checklist-combo</name>
|
|
<property>/sim/gui/dialogs/checklist/selected-checklist</property>
|
|
<editable>false</editable>
|
|
<pref-width>200</pref-width>
|
|
<halign>fill</halign>
|
|
<binding>
|
|
<command>dialog-apply</command>
|
|
<object-name>checklist-combo</object-name>
|
|
</binding>
|
|
<binding>
|
|
<command>nasal</command>
|
|
<script>
|
|
var s = getprop("/sim/gui/dialogs/checklist/selected-checklist");
|
|
|
|
setprop("/sim/gui/dialogs/checklist/selected-checklist-max-pages", checklist_size[s]);
|
|
setprop("/sim/gui/dialogs/checklist/selected-page", 0);
|
|
setprop("/sim/gui/dialogs/checklist/next-available", 1);
|
|
setprop("/sim/gui/dialogs/checklist/selected-page-text", "1 / " ~ checklist_size[s]);
|
|
|
|
</script>
|
|
</binding>
|
|
|
|
</combo>
|
|
|
|
<empty><stretch>true</stretch></empty>
|
|
|
|
<checkbox>
|
|
<label>Transparent</label>
|
|
<pref-width>100</pref-width>
|
|
<property>/sim/gui/dialogs/checklist/transparent</property>
|
|
<live>true</live>
|
|
<halign>right</halign>
|
|
<binding>
|
|
<command>dialog-apply</command>
|
|
</binding>
|
|
<binding>
|
|
<command>property-toggle</command>
|
|
</binding>
|
|
<binding>
|
|
<command>nasal</command>
|
|
<script>setTransparency(1);</script>
|
|
</binding>
|
|
</checkbox>
|
|
</group>
|
|
|
|
<hrule/>
|
|
|
|
<group>
|
|
<default-padding>4</default-padding>
|
|
<halign>fill</halign>
|
|
<layout>table</layout>
|
|
<name>checklist-table-group</name>
|
|
</group>
|
|
|
|
<group>
|
|
<default-padding>4</default-padding>
|
|
<halign>fill</halign>
|
|
<layout>hbox</layout>
|
|
|
|
<visible>
|
|
<greater-than>
|
|
<property>/sim/gui/dialogs/checklist/selected-checklist-max-pages</property>
|
|
<value>1</value>
|
|
</greater-than>
|
|
</visible>
|
|
|
|
<empty>
|
|
<stretch>true</stretch>
|
|
</empty>
|
|
|
|
<button>
|
|
<legend>Previous page</legend>
|
|
<pref-height>24</pref-height>
|
|
<equal>true</equal>
|
|
<enable>
|
|
<greater-than>
|
|
<property>/sim/gui/dialogs/checklist/selected-page</property>
|
|
<value>0</value>
|
|
</greater-than>
|
|
</enable>
|
|
<binding>
|
|
<command>nasal</command>
|
|
<script>previousPage();</script>
|
|
</binding>
|
|
</button>
|
|
|
|
<empty>
|
|
<stretch>true</stretch>
|
|
</empty>
|
|
|
|
<text>
|
|
<halign>center</halign>
|
|
<label>XX/XX</label>
|
|
<property>/sim/gui/dialogs/checklist/selected-page-text</property>
|
|
<live>true</live>
|
|
</text>
|
|
|
|
<empty>
|
|
<stretch>true</stretch>
|
|
</empty>
|
|
|
|
<button>
|
|
<legend>Next page</legend>
|
|
<equal>true</equal>
|
|
<pref-height>24</pref-height>
|
|
<enable>
|
|
<property>/sim/gui/dialogs/checklist/next-available</property>
|
|
<value>1</value>
|
|
</enable>
|
|
<binding>
|
|
<command>nasal</command>
|
|
<script>nextPage();</script>
|
|
</binding>
|
|
</button>
|
|
|
|
<empty>
|
|
<stretch>true</stretch>
|
|
</empty>
|
|
|
|
</group>
|
|
|
|
</PropertyList>
|