diff --git a/gui/dialogs/stopwatch.xml b/gui/dialogs/stopwatch.xml new file mode 100644 index 000000000..a7c6a6fb9 --- /dev/null +++ b/gui/dialogs/stopwatch.xml @@ -0,0 +1,139 @@ + + + + stopwatch-dialog + vbox + 8 + + + + mod = func(x, y) { x - int(x / y) * y } + p = "/sim/gui/dialogs/stopwatch-dialog/"; + display = props.globals.getNode(p ~ "display", 1); + time = props.globals.getNode("/sim/time/elapsed-sec"); + + start_time = props.globals.getNode(p ~ "start-time", 1).getValue(); + accu = props.globals.getNode(p ~ "accu", 1).getValue(); + + r = props.globals.getNode(p ~ "running"); + running = r != nil ? r.getBoolValue() : 0; + + start = func { + if (!running) { + start_time = time.getValue(); + running = 1; + loop(); + } + } + + stop = func { + if (running) { + running = 0; + show(accu += time.getValue() - start_time); + } + } + + reset = func { + accu = 0; + if (running) { + start_time = time.getValue(); + } else { + show(0); + } + } + + loop = func { + if (running) { + show(time.getValue() - start_time + accu); + settimer(loop, 0.001); + } + } + + show = func(s) { + var hours = s / 3600; + var minutes = int(mod(s / 60, 60)); + var seconds = int(mod(s, 60)); + var msec = int(mod(s * 1000, 1000)); + var d = sprintf("%3d : %02d : %02d.%03d", hours, minutes, seconds, msec); + display.setValue(d); + } + + if (running) { + loop(); + } else { + if (accu == nil) { + accu = 0; + } + show(accu); + } + + + + 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 + + + + + + center + true + /sim/gui/dialogs/stopwatch-dialog/display + + TIMES_24 + + + 1 + 0.9 + 0 + 1 + + + + + hbox + 2 + + + + + + + + + +