Howto:Hooking into the GUI: Difference between revisions

From FlightGear wiki
Jump to navigation Jump to search
Line 29: Line 29:


==  Testing the new tag/widget ==
==  Testing the new tag/widget ==
Okay, let's create a simple PUI/XML dialog from scratch using the new (unsupported!) {{tag|image}} tag. Use the [[Nasal Console]] to test the following:
Okay, let's create a simple PUI/XML dialog from scratch (procedurally) using the new (unsupported!) {{tag|image}} tag. Use the [[Nasal Console]] to test the following:
<syntaxhighlight lang="nasal">
<syntaxhighlight lang="nasal">
var name = "test";
var name = "test";

Revision as of 21:25, 11 March 2018

This article is a stub. You can help the wiki by expanding it.

Objective

Status

working / proof-of-concept (03/2018)

Changes

  • 2 new fgcommands

C++ Patches

The following set of patches implements a very simple fgcommand-based pre-processor scheme implemented on top of the SGPropertyNode (property tree) structure.

Registering the pre-processor

Note  This works analogous to the existing addcommand() API - but it will be treated like an fgcommand based pre-processor that gets a handle to the widgets props.Node via the cmdarg() API. The preprocessor must be implemented as part of the script portion shown below. That way, the whole thing is mutable, too (i.e. it can add/remove and change nodes as necessary). In other words, the following 5 lines of code can be used to customize widgets and create entirely new ones in scripting space.
fgcommand("register-widget", props.Node.new({
 "module": "ui",
 "name": "image",
 "script": "props.dump( cmdarg() );"
}));

Testing the new tag/widget

Okay, let's create a simple PUI/XML dialog from scratch (procedurally) using the new (unsupported!) <image> tag. Use the Nasal Console to test the following:

var name = "test";
var myDialog = {};

myDialog = gui.Widget.new();
myDialog.set("name", name);
myDialog.set("layout", "vbox");


var image = myDialog.addChild("image");
image.set("name", "someImage");

var cancel = myDialog.addChild("button");
cancel.set("key", "Esc");
cancel.set("legend", "Cancel");
cancel.setBinding("dialog-close");

fgcommand("dialog-new", myDialog.prop() );
gui.showDialog(name);

Alternatively, you can also use an XML file

Implementation details

Related

References