The default aircraft behaviour on the menu W&B dialog command is to
report a NASAL error on the STDERR of flightgear, with no reaction
in the game window. Included is a patch that pops up a dialog
instead, explaining why that wouldn't work.
The length is due to the diff inability to say that a lot of lines
were just indented right (as they were put inside an else {} )
Perhaps a GUI-cleaner way would be to condition the menu item
on the presence of the /yasim grove, yet I am unable to do it w/o
turning the whole submenu into a dynamic one, which I am lazy to do.
(Thanks to Melchior for suggesting the way it should behave instead)
Index: ../data/Nasal/gui.nas
===================================================================
RCS file: /var/cvs/FlightGear-0.9/data/Nasal/gui.nas,v
retrieving revision 1.10
diff -u -p -r1.10 gui.nas
--- ../data/Nasal/gui.nas 13 Jul 2005 11:30:32 -0000 1.10
+++ ../data/Nasal/gui.nas 15 Oct 2005 19:18:53 -0000
@@ -135,130 +135,139 @@ showWeightDialog = func {
contentArea = dialog[name].addChild("group");
contentArea.set("layout", "hbox");
- grossWgt = props.globals.getNode("/yasim/gross-weight-lbs");
- if(grossWgt != nil) {
- gwg = dialog[name].addChild("group");
- gwg.set("layout", "hbox");
- gwg.addChild("empty").set("stretch", 1);
- gwg.addChild("text").set("label", "Gross Weight:");
- txt = gwg.addChild("text");
- txt.set("label", "0123456789");
- txt.set("format", "%.0f lb");
- txt.set("property", "/yasim/gross-weight-lbs");
- txt.set("live", 1);
- gwg.addChild("empty").set("stretch", 1);
- }
-
- buttonBar = dialog[name].addChild("group");
- buttonBar.set("layout", "hbox");
- buttonBar.set("default-padding", 10);
-
- ok = buttonBar.addChild("button");
- ok.set("legend", "OK");
- ok.prop().getNode("binding[0]/command", 1).setValue("dialog-apply");
- ok.prop().getNode("binding[1]/command", 1).setValue("dialog-close");
-
- # Temporary helper function
- tcell = func {
- cell = arg[0].addChild(arg[1]);
- cell.set("row", arg[2]);
- cell.set("col", arg[3]);
- return cell;
- }
-
- #
- # Fill in the content area
- #
- fuelArea = contentArea.addChild("group");
- fuelArea.set("layout", "vbox");
- fuelArea.addChild("text").set("label", "Fuel Tanks");
-
- fuelTable = fuelArea.addChild("group");
- fuelTable.set("layout", "table");
-
- fuelArea.addChild("empty").set("stretch", 1);
-
- tcell(fuelTable, "text", 0, 0).set("label", "Tank");
- tcell(fuelTable, "text", 0, 3).set("label", "Pounds");
- tcell(fuelTable, "text", 0, 4).set("label", "Gallons");
-
- tanks = props.globals.getNode("/consumables/fuel").getChildren("tank");
- for(i=0; i<size(tanks); i+=1) {
- t = tanks[i];
-
- tname = i ~ "";
- tnode = t.getNode("name");
- if(tnode != nil) { tname = tnode.getValue(); }
-
- tankprop = "/consumables/fuel/tank["~i~"]";
-
- cap = t.getNode("capacity-gal_us", 1).getValue();
-
- # Hack, to ignore the "ghost" tanks created by the C++ code.
- if(cap < 1) { continue; }
-
- title = tcell(fuelTable, "text", i+1, 0);
- title.set("label", tname);
- title.set("halign", "right");
-
- sel = tcell(fuelTable, "checkbox", i+1, 1);
- sel.set("property", tankprop ~ "/selected");
- sel.prop().getNode("binding[0]/command", 1).setValue("dialog-apply");
-
- slider = tcell(fuelTable, "slider", i+1, 2);
- slider.set("property", tankprop ~ "/level-gal_us");
- slider.set("min", 0);
- slider.set("max", cap);
- slider.prop().getNode("binding[0]/command",
1).setValue("dialog-apply");
-
- lbs = tcell(fuelTable, "text", i+1, 3);
- lbs.set("property", tankprop ~ "/level-lbs");
- lbs.set("label", "0123456");
- lbs.set("format", "%.3f");
- lbs.set("live", 1);
-
- gals = tcell(fuelTable, "text", i+1, 4);
- gals.set("property", tankprop ~ "/level-gal_us");
- gals.set("label", "0123456");
- gals.set("format", "%.3f");
- gals.set("live", 1);
- }
-
- weightArea = contentArea.addChild("group");
- weightArea.set("layout", "vbox");
- weightArea.addChild("text").set("label", "Payload");
-
- weightTable = weightArea.addChild("group");
- weightTable.set("layout", "table");
-
- weightArea.addChild("empty").set("stretch", 1);
-
- tcell(weightTable, "text", 0, 0).set("label", "Location");
- tcell(weightTable, "text", 0, 2).set("label", "Pounds");
-
- wgts = props.globals.getNode("/sim").getChildren("weight");
- for(i=0; i<size(wgts); i+=1) {
- w = wgts[i];
- wname = w.getNode("name", 1).getValue();
- max = w.getNode("max-lb", 1).getValue();
- wprop = "/sim/weight[" ~ i ~ "]/weight-lb";
-
- title = tcell(weightTable, "text", i+1, 0);
- title.set("label", wname);
- title.set("halign", "right");
-
- slider = tcell(weightTable, "slider", i+1, 1);
- slider.set("property", wprop);
- slider.set("min", 0);
- slider.set("max", max);
- slider.prop().getNode("binding[0]/command",
1).setValue("dialog-apply");
-
- lbs = tcell(weightTable, "text", i+1, 2);
- lbs.set("property", wprop);
- lbs.set("label", "0123456");
- lbs.set("format", "%.0f");
- lbs.set("live", 1);
- }
+ if (props.globals.getNode("/yasim") == nil) {
+ msg = dialog[name].addChild("text");
+ msg.set("label", "Weight/balance only supported for YASIM
models!");
+ cancel = dialog[name].addChild("button");
+ cancel.set("legend", "OK");
+ cancel.prop().getNode("binding[0]/command",
1).setValue("dialog-close");
+ }
+ else {
+ grossWgt = props.globals.getNode("/yasim/gross-weight-lbs");
+ if(grossWgt != nil) {
+ gwg = dialog[name].addChild("group");
+ gwg.set("layout", "hbox");
+ gwg.addChild("empty").set("stretch", 1);
+ gwg.addChild("text").set("label", "Gross Weight:");
+ txt = gwg.addChild("text");
+ txt.set("label", "0123456789");
+ txt.set("format", "%.0f lb");
+ txt.set("property", "/yasim/gross-weight-lbs");
+ txt.set("live", 1);
+ gwg.addChild("empty").set("stretch", 1);
+ }
+
+ buttonBar = dialog[name].addChild("group");
+ buttonBar.set("layout", "hbox");
+ buttonBar.set("default-padding", 10);
+
+ ok = buttonBar.addChild("button");
+ ok.set("legend", "OK");
+ ok.prop().getNode("binding[0]/command",
1).setValue("dialog-apply");
+ ok.prop().getNode("binding[1]/command",
1).setValue("dialog-close");
+
+ # Temporary helper function
+ tcell = func {
+ cell = arg[0].addChild(arg[1]);
+ cell.set("row", arg[2]);
+ cell.set("col", arg[3]);
+ return cell;
+ }
+
+ #
+ # Fill in the content area
+ #
+ fuelArea = contentArea.addChild("group");
+ fuelArea.set("layout", "vbox");
+ fuelArea.addChild("text").set("label", "Fuel Tanks");
+
+ fuelTable = fuelArea.addChild("group");
+ fuelTable.set("layout", "table");
+
+ fuelArea.addChild("empty").set("stretch", 1);
+
+ tcell(fuelTable, "text", 0, 0).set("label", "Tank");
+ tcell(fuelTable, "text", 0, 3).set("label", "Pounds");
+ tcell(fuelTable, "text", 0, 4).set("label", "Gallons");
+
+ tanks =
props.globals.getNode("/consumables/fuel").getChildren("tank");
+ for(i=0; i<size(tanks); i+=1) {
+ t = tanks[i];
+
+ tname = i ~ "";
+ tnode = t.getNode("name");
+ if(tnode != nil) { tname = tnode.getValue(); }
+
+ tankprop = "/consumables/fuel/tank["~i~"]";
+
+ cap = t.getNode("capacity-gal_us", 1).getValue();
+
+ # Hack, to ignore the "ghost" tanks created by the C++
code.
+ if(cap < 1) { continue; }
+
+ title = tcell(fuelTable, "text", i+1, 0);
+ title.set("label", tname);
+ title.set("halign", "right");
+
+ sel = tcell(fuelTable, "checkbox", i+1, 1);
+ sel.set("property", tankprop ~ "/selected");
+ sel.prop().getNode("binding[0]/command",
1).setValue("dialog-apply");
+
+ slider = tcell(fuelTable, "slider", i+1, 2);
+ slider.set("property", tankprop ~ "/level-gal_us");
+ slider.set("min", 0);
+ slider.set("max", cap);
+ slider.prop().getNode("binding[0]/command",
1).setValue("dialog-apply");
+
+ lbs = tcell(fuelTable, "text", i+1, 3);
+ lbs.set("property", tankprop ~ "/level-lbs");
+ lbs.set("label", "0123456");
+ lbs.set("format", "%.3f");
+ lbs.set("live", 1);
+
+ gals = tcell(fuelTable, "text", i+1, 4);
+ gals.set("property", tankprop ~ "/level-gal_us");
+ gals.set("label", "0123456");
+ gals.set("format", "%.3f");
+ gals.set("live", 1);
+ }
+
+ weightArea = contentArea.addChild("group");
+ weightArea.set("layout", "vbox");
+ weightArea.addChild("text").set("label", "Payload");
+
+ weightTable = weightArea.addChild("group");
+ weightTable.set("layout", "table");
+
+ weightArea.addChild("empty").set("stretch", 1);
+
+ tcell(weightTable, "text", 0, 0).set("label", "Location");
+ tcell(weightTable, "text", 0, 2).set("label", "Pounds");
+
+ wgts = props.globals.getNode("/sim").getChildren("weight");
+ for(i=0; i<size(wgts); i+=1) {
+ w = wgts[i];
+ wname = w.getNode("name", 1).getValue();
+ max = w.getNode("max-lb", 1).getValue();
+ wprop = "/sim/weight[" ~ i ~ "]/weight-lb";
+
+ title = tcell(weightTable, "text", i+1, 0);
+ title.set("label", wname);
+ title.set("halign", "right");
+
+ slider = tcell(weightTable, "slider", i+1, 1);
+ slider.set("property", wprop);
+ slider.set("min", 0);
+ slider.set("max", max);
+ slider.prop().getNode("binding[0]/command",
1).setValue("dialog-apply");
+
+ lbs = tcell(weightTable, "text", i+1, 2);
+ lbs.set("property", wprop);
+ lbs.set("label", "0123456");
+ lbs.set("format", "%.0f");
+ lbs.set("live", 1);
+ }
+ }
# All done: pop it up
fgcommand("dialog-new", dialog[name].prop());
_______________________________________________
Flightgear-devel mailing list
[email protected]
http://mail.flightgear.org/mailman/listinfo/flightgear-devel
2f585eeea02e2c79d7b1d8c4963bae2d