2,736
edits
Red Leader (talk | contribs) (→Nasal example: Indenation) |
|||
| Line 191: | Line 191: | ||
== Nasal example == | == Nasal example == | ||
{{Note|The following Nasal script can be executed via the Nasal Console or put in a separate file and executed via a menu item to easily test different aspects of reset/re-init. For the time being, you are likely to trigger segfaults/crashes or other undefined behavior (e.g. memory leaks), so it is recommended to run | {{Note|The following Nasal script can be executed via the Nasal Console or put in a separate file and executed via a menu item to easily test different aspects of reset/re-init. For the time being, you are likely to trigger segfaults/crashes or other undefined behavior (e.g., memory leaks), so it is recommended to run FlightGear in a GDB session to obtain a backtrace. If you manage to cause a bug or crash, please file a bug report: {{Tickets}} }} | ||
<syntaxhighlight lang="nasal"> | <syntaxhighlight lang="nasal" enclose="div"> | ||
canvas.MessageBox.warning( | |||
"Developer Feature", | |||
"This dialog is mainly intended for people familiar with FlightGear/core internals to help troubleshoot reset/re-init related bugs. You will probably want to run FlightGear inside a GDB session when using this dialog", | |||
func(sel){ | |||
if(sel != canvas.MessageBox.Ok) return; | |||
################################################################### | ################################################################### | ||
var (width, height) = (700, 480); | var (width, height) = (700, 480); | ||
| Line 214: | Line 212: | ||
var myLayout = canvas.VBoxLayout.new(); | var myLayout = canvas.VBoxLayout.new(); | ||
myCanvas.setLayout(myLayout); | myCanvas.setLayout(myLayout); | ||
| Line 220: | Line 217: | ||
var drawMaskHBox = canvas.HBoxLayout.new(); | var drawMaskHBox = canvas.HBoxLayout.new(); | ||
myLayout.addItem(drawMaskHBox); | myLayout.addItem(drawMaskHBox); | ||
# create a scrollbar | # create a scrollbar | ||
| Line 234: | Line 230: | ||
scroll.setLayout(list); | scroll.setLayout(list); | ||
var resetBtn = canvas.gui.widgets.Button.new(root, canvas.style, {}) | |||
.setText("Global reset") | |||
.setFixedSize(120, 25); | |||
resetBtn.listen("clicked", func(){ | |||
fgcommand("reset"); | |||
}); | }); | ||
drawMaskHBox.addItem(resetBtn); | drawMaskHBox.addItem(resetBtn); | ||
var draw_masks = ["terrain","aircraft","models","clouds"]; | var draw_masks = ["terrain", "aircraft", "models", "clouds"]; | ||
foreach(var d; draw_masks) { | foreach(var d; draw_masks) { | ||
var prop = "/sim/rendering/draw-mask/"~d; | var prop = "/sim/rendering/draw-mask/" ~ d; | ||
drawMaskHBox.addItem( | drawMaskHBox.addItem( | ||
canvas.gui.widgets.CheckBox.new(root, canvas.style, {}) | canvas.gui.widgets.CheckBox.new(root, canvas.style, {}) | ||
.setText(d) | |||
.setChecked(getprop(prop)) | |||
.listen("toggled", func(e) { | |||
setprop(prop, e.detail.checked); | |||
}) | |||
); | |||
} | } | ||
## | ## | ||
| Line 262: | Line 257: | ||
var resetHandler = func(command, arguments){ | var resetHandler = func(command, arguments){ | ||
return func(){ | return func(){ | ||
var name = arguments.name; | |||
logprint(4, "testing subsystemFactory for:" ~ name); | |||
fgcommand(command, props.Node.new({"subsystem": name})); | |||
}; | |||
}; | }; | ||
}; | |||
## | ## | ||
| Line 274: | Line 268: | ||
var addTest = func(root, layout, test){ | var addTest = func(root, layout, test){ | ||
# create a new layout | # create a new layout | ||
var row = canvas.HBoxLayout.new(); | |||
layout.addItem(row); | |||
var label = canvas.gui.widgets.Label.new(root, canvas.style, {wordWrap: 0}); | var label = canvas.gui.widgets.Label.new(root, canvas.style, {wordWrap: 0}); | ||
label.setText(test.name); | label.setText(test.name); | ||
row.addItem(label); | row.addItem(label); | ||
foreach(var cmd; ["re-init", "remove-subsystem", "add-subsystem"]) { | |||
var button = canvas.gui.widgets.Button.new(root, canvas.style, {}) | |||
.setText(cmd) | |||
.setFixedSize(150, 25); | |||
button.listen("clicked", resetHandler(cmd, test)); | |||
row.addItem(button); | |||
} | } | ||
return label; # we want to update the label elsewhere | |||
return label; # we want to update the label elsewhere | |||
}; # addTest | }; # addTest | ||
## | ## | ||
| Line 328: | Line 322: | ||
{ name: "aircraft-model" }, | { name: "aircraft-model" }, | ||
{ name: "model-manager" }, | { name: "model-manager" }, | ||
{ name: "view-manager" } | { name: "view-manager" } | ||
]; # vector with tests | ]; # vector with tests | ||
| Line 337: | Line 328: | ||
# add buttons for each test to the scrollbar layout | # add buttons for each test to the scrollbar layout | ||
foreach(var test; Tests){ | foreach(var test; Tests){ | ||
# will add label fields to each test, so that labels can be dynamically updated | |||
# using a different callback | |||
test.label = addTest(root: scrollContent, layout: list, test: test); | test.label = addTest(root: scrollContent, layout: list, test: test); | ||
} | } | ||
var subsystemMonitor = func() { | var subsystemMonitor = func(){ | ||
foreach(var test; Tests) { | foreach(var test; Tests){ | ||
var isRunning = fgcommand("subsystem-running", props.Node.new({"subsystem": test.name})); | |||
var suffix = isRunning ? " (active)" : " (inactive)"; | |||
#test.label.setBackground(color); | |||
var currentText = test.label._view._text.get("text"); | var currentText = test.label._view._text.get("text"); | ||
var neededLabel = test.name ~ suffix; | var neededLabel = test.name ~ suffix; | ||
if (currentText==neededLabel) continue; | if (currentText == neededLabel) continue; | ||
test.label.setText(neededLabel); | test.label.setText(neededLabel); | ||
} | } | ||
} | } | ||
var statusbar = canvas.gui.widgets.Label.new(root, canvas.style, {wordWrap: 0}); | var statusbar = canvas.gui.widgets.Label.new(root, canvas.style, {wordWrap: 0}); | ||
statusbar.setText("FlightGear v." ~getprop("/sim/version/flightgear") ); | statusbar.setText("FlightGear v." ~ getprop("/sim/version/flightgear")); | ||
myLayout.addItem(statusbar); | myLayout.addItem(statusbar); | ||
var myTimer = maketimer(0.1, subsystemMonitor); | |||
var myTimer = maketimer(0.1, subsystemMonitor ); | |||
myTimer.start(); | myTimer.start(); | ||
window.del = func() | window.del = func(){ | ||
{ | print("Cleaning up window: ", title); | ||
myTimer.stop(); | |||
call(canvas.Window.del, [], me); | |||
}; | }; | ||
################################################################### | ################################################################### | ||
}, # event handler for messageBox | |||
canvas.MessageBox.Ok |canvas.MessageBox.Cancel | canvas.MessageBox.DontShowAgain | |||
); | ); | ||
</syntaxhighlight> | </syntaxhighlight> | ||