diff --git a/examples/example1/src/example1.d b/examples/example1/src/example1.d index 2ba38e8e..e3375b12 100644 --- a/examples/example1/src/example1.d +++ b/examples/example1/src/example1.d @@ -45,6 +45,42 @@ Widget createAboutWidget() return res; } +class TimerTest : HorizontalLayout { + ulong timerId; + TextWidget _counter; + int _value; + Button _start; + Button _stop; + override bool onTimer(ulong id) { + _value++; + _counter.text = to!dstring(_value); + return true; + } + this() { + addChild(new TextWidget(null, "Timer test."d)); + _counter = new TextWidget(null, "0"d); + _counter.fontSize(32); + _start = new Button(null, "Start timer"d); + _stop = new Button(null, "Stop timer"d); + _stop.enabled = false; + _start.onClickListener = delegate(Widget src) { + _start.enabled = false; + _stop.enabled = true; + timerId = setTimer(1000); + return true; + }; + _stop.onClickListener = delegate(Widget src) { + _start.enabled = true; + _stop.enabled = false; + cancelTimer(timerId); + return true; + }; + addChild(_start); + addChild(_stop); + addChild(_counter); + } +} + class AnimatedDrawable : Drawable { DrawableRef background; this() { @@ -375,6 +411,7 @@ extern (C) int UIAppMain(string[] args) { layout.addChild((new TextWidget()).textColor(0x00802000).text("Text widget 0")); layout.addChild((new TextWidget()).textColor(0x40FF4000).text("Text widget")); layout.addChild((new Button("BTN1")).textResource("EXIT")); //.textColor(0x40FF4000) + layout.addChild(new TimerTest()); static if (true) { diff --git a/src/dlangui/platforms/common/platform.d b/src/dlangui/platforms/common/platform.d index 9fbb5949..1e2b3d80 100644 --- a/src/dlangui/platforms/common/platform.d +++ b/src/dlangui/platforms/common/platform.d @@ -891,7 +891,9 @@ class Window { } /// cancel timer void cancelTimer(ulong timerId) { - for (size_t i = _queue.length - 1; i >= 0; i--) { + if (!_queue.length) + return; + for (int i = cast(int)_queue.length - 1; i >= 0; i--) { if (_queue[i].id == timerId) { _queue[i].cancel(); break; @@ -908,9 +910,11 @@ class Window { return delta; } private void cleanup() { + if (!_queue.length) + return; sort(_queue); - size_t newsize = 0; - for (size_t i = _queue.length - 1; i >= 0; i--) { + size_t newsize = _queue.length; + for (int i = cast(int)_queue.length - 1; i >= 0; i--) { if (!_queue[i].valid) { newsize = i; } @@ -919,6 +923,8 @@ class Window { _queue.length = newsize; } private TimerInfo[] expired() { + if (!_queue.length) + return null; long ts = currentTimeMillis; TimerInfo[] res; for (int i = 0; i < _queue.length; i++) {