<?xml version="1.0"?> <PropertyList> <name>stopwatch-dialog</name> <layout>vbox</layout> <modal>false</modal> <default-padding>8</default-padding> <x>-5</x> <y>5</y> <color> <red>0.2</red> <green>0.2</green> <blue>0.2</blue> <alpha>0.7</alpha> </color> <nasal> <open> var p = "/sim/gui/dialogs/stopwatch-dialog/"; var display = props.globals.getNode(p ~ "display", 1); var time = props.globals.getNode("/sim/time/elapsed-sec"); var start_time = props.globals.getNode(p ~ "start-time", 1).getValue(); var accu = props.globals.getNode(p ~ "accu", 1).getValue(); if (start_time == nil) start_time = 0; if (accu == nil) accu = 0; var r = props.globals.getNode(p ~ "running"); var running = r != nil ? r.getBoolValue() : 0; var start = func { if (!running) { start_time = time.getValue(); running = 1; loop(); } } var stop = func { if (running) { running = 0; show(accu += time.getValue() - start_time); } } var reset = func { accu = 0; if (running) start_time = time.getValue(); else show(0); } var loop = func { if (running) { show(time.getValue() - start_time + accu); settimer(loop, 0.02); } } var show = func(s) { var hours = s / 3600; var minutes = int(math.mod(s / 60, 60)); var seconds = int(math.mod(s, 60)); var msec = int(math.mod(s * 1000, 1000) / 100); var d = sprintf("%3d : %02d : %02d.%d", hours, minutes, seconds, msec); display.setValue(d); } if (running) { loop(); } else { if (accu == nil) accu = 0; show(accu); } </open> <close> props.globals.getNode(p ~ "start-time", 1).setDoubleValue(start_time); props.globals.getNode(p ~ "running", 1).setBoolValue(running); props.globals.getNode(p ~ "accu", 1).setDoubleValue(accu); running = 0; # stop display loop </close> </nasal> <text> <label>xxxxx000 : 00 : 00.000</label> <halign>center</halign> <live>true</live> <property>/sim/gui/dialogs/stopwatch-dialog/display</property> <font> <name>TIMES_24</name> </font> <color> <red>1</red> <green>0.9</green> <blue>0</blue> <alpha>1</alpha> </color> </text> <group> <layout>hbox</layout> <default-padding>2</default-padding> <button> <legend>Start</legend> <equal>true</equal> <pref-width>47</pref-width> <color> <red type="float">0.3</red> <green type="float">0.3</green> <blue type="float">0.3</blue> <alpha type="float">0.8</alpha> </color> <binding> <command>nasal</command> <script>start()</script> </binding> </button> <button> <legend>Stop</legend> <default>true</default> <pref-width>47</pref-width> <color> <red type="float">0.3</red> <green type="float">0.3</green> <blue type="float">0.3</blue> <alpha type="float">0.8</alpha> </color> <binding> <command>nasal</command> <script>stop()</script> </binding> </button> <button> <legend>Reset</legend> <key>Delete</key> <pref-width>47</pref-width> <color> <red type="float">0.3</red> <green type="float">0.3</green> <blue type="float">0.3</blue> <alpha type="float">0.8</alpha> </color> <binding> <command>nasal</command> <script>reset()</script> </binding> </button> <button> <legend>Close</legend> <color> <red type="float">0.3</red> <green type="float">0.3</green> <blue type="float">0.3</blue> <alpha type="float">0.8</alpha> </color> <key>Esc</key> <pref-width>47</pref-width> <binding> <command>dialog-close</command> </binding> </button> </group> </PropertyList>