FlightGear Newsletter April 2017: Difference between revisions

m
Line 22: Line 22:


== Development news ==
== Development news ==
=== Creating Canvas UI dialogs procedurally ===
{{Main article|Draw masks}}
[[File:Draw-masks-via-canvas.png|thumb|FlightGear [[Draw masks]] GUI dialog procedurally created by the [[Canvas]] system.s]]
Most end-users will hardly be familiar with so called [[Draw masks]], however one stated goal is to add more node bits (and a GUI dialog to control them) so various categories of objects can be disabled during the update pass.
This will mean the direct hit of, say, AI models vs particles vs random trees can be measured.
Of course it won't account for resources (memory, textures) burned by such things, but would still help different people identify slowness on their setups. <ref>{{cite web
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/29564161/
  |title  =  <nowiki> Re: [Flightgear-devel] Rendering passes question </nowiki>
  |author =  <nowiki> James Turner </nowiki>
  |date  =  Jul 19th, 2012
  |added  =  Jul 19th, 2012
  |script_version = 0.40
  }}</ref>
The following snippet of Nasal/Canvas code (mostly based on code taken from [[Canvas Snippets]] demonstrates how easily such a dialog can be procedurally created using the Canvas system:
<syntaxhighlight lang="nasal">
var (width,height) = (320,160);
var title = 'Draw Masks';
var window = canvas.Window.new([width,height],"dialog").set('title',title);
window.del = func()
{
  print("Cleaning up window:",title,"\n");
  call(canvas.Window.del, [], me);
};
# adding a canvas to the new window and setting up background colors/transparency
var myCanvas = window.createCanvas().set("background", canvas.style.getColor("bg_color"));
# creating the top-level/root group which will contain all other elements/group
var root = myCanvas.createGroup();
var drawMasks = props.globals.getNode("/sim/rendering/draw-mask").getChildren();
# create a new layout
window.Layout = canvas.VBoxLayout.new();
# assign it to the Canvas
myCanvas.setLayout(window.Layout);
foreach(var mask; drawMasks) {
(func() {
var m = mask;
# print("Found mask:", mask.getName(), "=", mask.getValue() );
var checkbox = canvas.gui.widgets.CheckBox.new(root, canvas.style, {wordWrap: 0})
.setText( "render "  ~ m.getName() )
.listen("toggled", func(e) {
      setprop(m.getPath(), e.detail.checked);
                            })
.setChecked(  m.getValue() );
window.Layout.addItem(checkbox);
}) ();
}
</syntaxhighlight>
This piece of code can now be easily dropped into $FG_ROOT/Nasal/canvas/gui/dialogs or just added to a nasal binding as part of the menubar.
Technically, there is no reason why the same piece of Nasal code could not be used to also support localized lookups of the corresponding checkbox labels, i.e. to provide a description and/or tooltip using a language other than English; all at the mere cost of adding the corresponding attributes to /sim/rendering/draw-mask in the form of "tooltip" and "label" attributes.
{{See also|Canvas_Troubleshooting#Adding_draw_masks_for_Canvas}}


== In the hangar ==
== In the hangar ==