Files
flightgear-addon-aerotow-ev…/nasal/dialogs/route.nas
T

136 lines
3.9 KiB
Plaintext

#
# Aerotow Everywhere - Add-on for FlightGear
#
# Written and developer by Roman Ludwicki (PlayeRom, SP-ROM)
#
# Copyright (C) 2022 Roman Ludwicki
#
# Aerotow Everywhere is an Open Source project and it is licensed
# under the GNU Public License v3 (GPLv3)
#
#
# Object for hande Route Dialog
#
var RouteDialog = {
#
# Constants
#
ROUTE_SAVES_DIR: "route-saves",
#
# Constructor
#
# addon - Addon object
#
new: func (addon, message) {
var obj = { parents: [RouteDialog] };
obj.addon = addon;
obj.message = message;
obj.addonNodePath = addon.node.getPath();
obj.savePath = addon.storagePath ~ "/" ~ RouteDialog.ROUTE_SAVES_DIR;
obj.maxRouteWaypoints = 10;
obj.listeners = [];
# Set listener for aerotow combo box value in route dialog for recalculate altitude change
append(obj.listeners, setlistener(obj.addonNodePath ~ "/addon-devel/route/ai-model", func () {
obj.calculateAltChangeAndTotals();
}));
# Set listeners for distance fields for calculate altitude change
for (var i = 0; i < obj.maxRouteWaypoints; i += 1) {
append(obj.listeners, setlistener(obj.addonNodePath ~ "/addon-devel/route/wpts/wpt[" ~ i ~ "]/distance-m", func () {
obj.calculateAltChangeAndTotals();
}));
}
return obj;
},
#
# Destructor
#
del: func () {
foreach (var listener; me.listeners) {
removelistener(listener);
}
},
#
# Calculate total distance and altitude and put in to property tree
#
calculateAltChangeAndTotals: func () {
var totalDistance = 0.0;
var totalAlt = 0.0;
var isEnd = 0;
var isRouteMode = 1;
var aircraft = Aircraft.getSelected(me.addon, isRouteMode);
for (var i = 0; i < me.maxRouteWaypoints; i += 1) {
var distance = getprop(me.addonNodePath ~ "/addon-devel/route/wpts/wpt[" ~ i ~ "]/distance-m");
if (distance == nil) {
break;
}
var altChange = aircraft.getAltChange(distance);
setprop(me.addonNodePath ~ "/addon-devel/route/wpts/wpt[" ~ i ~ "]/alt-change-agl-ft", altChange);
if (!isEnd) {
if (distance > 0.0) {
totalDistance += distance;
totalAlt += altChange;
}
else {
isEnd = 1;
}
}
}
setprop(me.addonNodePath ~ "/addon-devel/route/total/distance", totalDistance);
setprop(me.addonNodePath ~ "/addon-devel/route/total/alt", totalAlt);
},
#
# Save route with description to the XML file.
#
save: func () {
me.openFileSelector(
func (node) {
var nodeSave = props.globals.getNode(me.addonNodePath ~ "/addon-devel/route/wpts");
if (io.write_properties(node.getValue(), nodeSave)) {
me.message.success("The route has been saved");
}
},
"Save route",
"Save"
);
},
#
# Load route with description from the XML file.
#
load: func () {
me.openFileSelector(
func (node) {
var nodeLoad = props.globals.getNode(me.addonNodePath ~ "/addon-devel/route/wpts");
if (io.read_properties(node.getValue(), nodeLoad)) {
me.message.success("The route has been loaded");
}
},
"Load route",
"Load"
);
},
#
# Open file selector dialog for save/load XML file with route.
#
openFileSelector: func (callback, title, button) {
var fileSelector = gui.FileSelector.new(callback, title, button, ["*.xml"], me.savePath, "route.xml");
fileSelector.open();
},
};