diff --git a/Models/followmeEV.xml b/Models/followmeEV.xml
index fe51f64..1e977c6 100644
--- a/Models/followmeEV.xml
+++ b/Models/followmeEV.xml
@@ -5,12 +5,10 @@
- var livery_update = aircraft.livery_update.new("Aircraft/followme_e-tron/Models/Messages", 1, nil);
- var liveryFuse_update = followme.liveryFuse_update.new("Aircraft/followme_e-tron/Models/Texture", 1, nil);
+ var livery_update = aircraft.livery_update.new("Aircraft/followme_e-tron/Models/Messages", 1, nil);
- livery_update.stop();
- liveryFuse_update.stop();
+ livery_update.stop();
@@ -67,8 +65,10 @@
door.rr
rdoor
ldoor
- sim/model/livery
- texture-fuse
+
+ sim/multiplay/generic
+ string[19]
followmeoutside.png
diff --git a/Nasal/library.nas b/Nasal/library.nas
index 0e68858..1a5162c 100644
--- a/Nasal/library.nas
+++ b/Nasal/library.nas
@@ -1,6 +1,8 @@
#//Follow Me Library by Sidi Liang
#//Contact: sidi.liang@gmail.com
+io.include("texture-selector.nas");
+
var isInternalView = func(){ #// return 1 if is in internal view, otherwise return 0.
return props.getNode("sim/current-view/internal", 1).getValue();
}
@@ -53,22 +55,3 @@ var runCode = func(url, addition = nil){
print("Code loaded");
});
}
-
-var liveryFuse = {
- init: func(dir, nameprop = "sim/model/livery/name", sortprop = nil) {
- me.parents = [gui.OverlaySelector.new("Select Livery", dir, nameprop,
- sortprop, "sim/model/livery/file")];
- me.dialog = me.parents[0];
- },
-};
-var liveryFuse_update = {
- new: func(liveriesdir, interval = 10.01, callback = nil) {
- var m = { parents: [liveryFuse_update, aircraft.overlay_update.new()] };
- m.parents[1].add(liveriesdir, "sim/model/livery/file", callback);
- m.parents[1].interval = interval;
- return m;
- },
- stop: func {
- me.parents[1].stop();
- },
-};
diff --git a/Nasal/plate.nas b/Nasal/plate.nas
index c371257..f281421 100644
--- a/Nasal/plate.nas
+++ b/Nasal/plate.nas
@@ -6,41 +6,9 @@
#To add an plate, just place the new plate texture file (must be .png
#format) to that folder and it will show up in the dialog.
-
-var Scanner = {
- new: func(path, fileType) {
- return { parents:[Scanner], path: path, fileType: fileType};
- },
- path: "",
- fileType: "",
- scan: func(){
- var data = [];
- var files = directory(me.path);
- if (size(files)) {
- foreach (var file; files) {
- if (substr(file, 0 - size(me.fileType)) != me.fileType)
- continue;
- var n = io.read_properties(me.path ~ file);
- append(data, [substr(file, 0, size(file) - size(me.fileType)), me.path ~ file]);
- }
- #me.data = sort(me.data, func(a, b) num(a[1]) == nil or num(b[1]) == nil
- # ? cmp(a[1], b[1]) : a[1] - b[1]);
- }
- return data;
- },
-};
var path = props.getNode("/",1).getValue("sim/aircraft-dir") ~ '/Models/plate/texture';
-var plateScanner = Scanner.new(path, ".png");
+var plateSelector = TextureSelector.new(path, ".png", 1, 1, "sim/gui/dialogs/vehicle_config/dialog", "group[4]/combo/"); #Using the scanner in library.nas
-var updateList = func(){
- var allPlates = plateScanner.scan();
- var data = props.globals.getNode("/sim/gui/dialogs/vehicle_config/dialog/group[4]/combo/", 1);
- data.removeChildren("value");
- data.getChild("value", 0, 1).setValue("NONE");
- forindex(var i; allPlates){
- data.getChild("value", i+1, 1).setValue(allPlates[i][0]);
- }
-}
var Plate = {
new: func() {
return { parents:[Plate]};
diff --git a/Nasal/systems.nas b/Nasal/systems.nas
index 8b2d281..58313f4 100644
--- a/Nasal/systems.nas
+++ b/Nasal/systems.nas
@@ -8,8 +8,9 @@ props.getNode("/sim/gui/dialogs/vehicle_config/dialog",1);
var configDialog = gui.Dialog.new("/sim/gui/dialogs/vehicle_config/dialog", "Aircraft/followme_e-tron/gui/dialogs/config-dialog.xml");
aircraft.livery.init("Aircraft/followme_e-tron/Models/Messages");
-liveryFuse.init("Aircraft/followme_e-tron/Models/Texture");
-
+var liveryPath = props.getNode("sim/aircraft-dir").getValue()~"/Models/Liveries/";
+var liverySelector = followme.TextureSelector.new(path: liveryPath, fileType: ".xml", textureProp: "texture-fuse", defaultValue: "Yellow(Default)");
+liverySelector.scanXML();
aircraft.livery.select("Blanco");
var tyreSmoke_0 = aircraft.tyresmoke.new(0, auto = 1, diff_norm = 0.4, check_vspeed = 0);
@@ -476,7 +477,7 @@ var resetOnPosition = func(){
setprop("/fdm/jsbsim/simulation/pause", 1);
setprop("/fdm/jsbsim/simulation/reset", 1);
var groundAlt = props.getNode("/position/ground-elev-ft").getValue();
- props.getNode("/position/altitude-ft").setValue(groundAlt+5);
+ props.getNode("/position/altitude-ft").setValue(groundAlt+7);
latProp.setValue(lat);
lonProp.setValue(lon);
setprop("/fdm/jsbsim/simulation/pause", 0);
diff --git a/Nasal/texture-selector.nas b/Nasal/texture-selector.nas
new file mode 100644
index 0000000..3432ed0
--- /dev/null
+++ b/Nasal/texture-selector.nas
@@ -0,0 +1,164 @@
+#//Sidi Liang, 2020
+#//Docs to be done
+
+var TextureSelector = { #//Tmp Note: path MUST end with "/"
+ new: func(path, fileType = nil, enableNone = 0, customDialog = 0, customDialogBase = "",
+ customDialogPosition = "", texturePropertyBase = "sim/model/livery/", textureProp = "livery", textureNameProp = "name",
+ textureDataNode = nil, defaultValue = ""){
+
+ var m = {parents:[TextureSelector]};
+ if(customDialog == 1){
+ m.dialogNode = props.getNode(customDialogBase, 1);
+ }else{
+ m.dialog = TextureSelectorDialog.new(defaultV: defaultValue);
+ }
+ if(textureDataNode == nil) textureDataNode = props.getNode("/TextureSelector/liveries/", 1);
+
+ m.path = path;
+ m.fileType = fileType;
+ m.enableNone = enableNone;
+ m.customDialog = customDialog;
+ m.dialogCustom = customDialogPosition;
+ m.texturePropertyBase = texturePropertyBase;
+ m.textureProp = textureProp;
+ m.textureNameProp = textureNameProp;
+ m.textureDataNode = textureDataNode;
+ m.defaultValue = defaultValue;
+ if(defaultValue) m.setTextureByNameXML(defaultValue);
+ return m;
+ },
+ path: "", #//path containing texture file
+ fileType: "",
+ enableNone: 0,
+ customDialog: 0,
+ dialogCustom:"list/",
+ texturePropertyBase: "sim/model/livery/",
+ textureProp:"livery",
+ textureNameProp:"name",
+ defaultValue:"",
+ dialogNode:nil,
+ dialog:nil,
+ textureDataNode:props.getNode("/TextureSelector/liveries/", 1),
+ scan: func(path = nil, fileType = nil){
+ if(path == nil and me.path) path = me.path;
+ else return 1;
+ if(fileType == nil and me.fileType) fileType = me.fileType;
+ else return 1;
+ var data = [];
+ var files = directory(path);
+ if (size(files)) {
+ foreach (var file; files) {
+ if (substr(file, 0 - size(fileType)) != fileType)
+ continue;
+ append(data, [substr(file, 0, size(file) - size(fileType)), path ~ file]);
+ }
+ #me.data = sort(me.data, func(a, b) num(a[1]) == nil or num(b[1]) == nil
+ # ? cmp(a[1], b[1]) : a[1] - b[1]);
+ }
+ return data;
+ },
+ scanXML: func(path = nil){
+ if(path == nil and me.path) path = me.path;
+ else return 1;
+ var fileType = ".xml";
+ var names = [];
+ var files = directory(path);
+ if (size(files)) {
+ var i = 0;
+ foreach (var file; files) {
+ if (substr(file, 0 - size(fileType)) != fileType)
+ continue;
+ var node = me.textureDataNode.getChild(me.textureProp, i, 1); #//Temporary solution, to be improved
+ n = io.read_properties(me.path ~ file, node);
+ var data = [];
+ append(data, n.getNode(me.texturePropertyBase ~ me.textureNameProp).getValue());
+ append(names, data);
+ i+=1;
+ }
+ }
+ return names;
+ },
+ updateList: func(){
+ var allItems = nil;
+ if(me.fileType != ".xml") allItems = me.scan();
+ else allItems = me.scanXML();
+ var data = nil;
+ if(me.customDialog) data = me.dialogNode.getNode(me.dialogCustom, 1); #//Pass the custom dialog if used
+ else data = me.dialog.list;
+ data.removeChildren("value");
+ if(me.enableNone){
+ data.getChild("value", 0, 1).setValue("NONE");
+ forindex(var i; allItems){
+ data.getChild("value", i+1, 1).setValue(allItems[i][0]);
+ }
+ }else{
+ forindex(var i; allItems){
+ data.getChild("value", i, 1).setValue(allItems[i][0]);
+ }
+ }
+ },
+ setTextureByNameXML: func(name){
+ allTextures = me.textureDataNode.getChildren(me.textureProp);
+ foreach(var texture; allTextures){
+ var tmp = texture.getNode(me.texturePropertyBase);
+ if(tmp.getNode(me.textureNameProp).getValue() == name){
+ print(tmp.getNode(me.textureProp).getValue());
+ props.copy(tmp, props.getNode(me.texturePropertyBase));
+ props.getNode("/sim/multiplay/generic/string[19]", 1).setValue(texture.getNode(me.texturePropertyBase).getNode(me.textureProp).getValue());
+ break;
+ }
+ }
+ },
+};
+
+var TextureSelectorDialog = {
+ new: func(dialogBase = "/sim/gui/dialogs/TextureSelector/dialog", dialogFile = "Aircraft/followme_e-tron/gui/dialogs/livery-select.xml", defaultV = ""){
+ var m = gui.Dialog.new(dialogBase, dialogFile);
+ m.parents = [TextureSelectorDialog, gui.Dialog];
+ var dNode = props.getNode(dialogBase, 1);
+ m.dialogNode = dNode;
+ m.dialogFile = dialogFile;
+ m.title = "Livery Selection";
+ m.list = m.dialogNode.getNode("list", 1);
+ m.result = props.getNode(m.list.getPath() ~ "/result", 1);
+ m.defaultValue = defaultV;
+ m.nasal = m.dialogNode.getNode("nasal", 1);
+ m.openScript = m.nasal.getNode("open", 1);
+ m.closeScript = m.nasal.getNode("close", 1);
+ m.openScript.setValue('print("livery-select dialog opened");
+ followme.liverySelector.updateList();
+ #print(cmdarg().getPath());
+ var lis = setlistener(followme.liverySelector.dialog.result, func(){
+ var selected = followme.liverySelector.dialog.result.getValue();
+ if(selected != "none"){
+ followme.liverySelector.setTextureByNameXML(selected);
+ }else{
+ #fileNode.setValue(nameNode.getValue());
+ }
+ });');
+ m.closeScript.setValue('\n followme.playAudio("repair.wav");');
+ m.reload();
+ #Reload when the GUI is reloaded
+ m.reload_listener = setlistener("/sim/signals/reinit-gui", func(n) m.reload());
+
+ return m;
+ },
+ reload: func(){
+ me.list.getNode("property").setValue(me.result.getPath());
+ me.result.setValue(me.result.getValue() or me.defaultValue);
+ me.openScript.setValue('print("livery-select dialog opened");
+ followme.liverySelector.updateList();
+ #print(cmdarg().getPath());
+ var lis = setlistener(followme.liverySelector.dialog.result, func(){
+ var selected = followme.liverySelector.dialog.result.getValue();
+ if(selected != "none"){
+ followme.liverySelector.setTextureByNameXML(selected);
+ }else{
+ #fileNode.setValue(nameNode.getValue());
+ }
+ });');
+ me.closeScript.setValue('followme.playAudio("repair.wav");');
+ me.dialogNode.getNode("group/text/label").setValue(me.title);
+ me.dialogNode.getNode("group/button/binding/script").setValue('gui.Dialog.instance["' ~ me.dialogNode.getNode("name").getValue() ~ '"].close()');
+ }
+};
diff --git a/followme_e-tron-set.xml b/followme_e-tron-set.xml
index c08ee67..28064d8 100644
--- a/followme_e-tron-set.xml
+++ b/followme_e-tron-set.xml
@@ -235,8 +235,8 @@
4
- 2
- 3
+ 3
+ 4
4
@@ -431,7 +431,7 @@
-
+
@@ -463,11 +463,11 @@
- -
+
-
nasal
-
+
-
diff --git a/gui/dialogs/config-dialog.xml b/gui/dialogs/config-dialog.xml
index 52e4b33..7581827 100755
--- a/gui/dialogs/config-dialog.xml
+++ b/gui/dialogs/config-dialog.xml
@@ -10,7 +10,7 @@
- followme.updateList();
+ followme.plateSelector.updateList();
#print(cmdarg().getPath());
var nameNode = props.getNode("systems/plate/name", 1);
var fileNode = props.getNode("systems/plate/file", 1);
@@ -196,7 +196,7 @@
28
nasal
-
+