diff options
author | Araq <rumpf_a@web.de> | 2019-04-26 15:44:06 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2019-04-26 15:44:06 +0200 |
commit | b350a9fc52d67cabc778887d8f81d0332eb9db91 (patch) | |
tree | 8b87a40962503cedfcf0159e9e287b2f27b46d72 /tests/destructor | |
parent | 1f7615ad9db3e8f90b20aa9932c3c11ee1793218 (diff) | |
download | Nim-b350a9fc52d67cabc778887d8f81d0332eb9db91.tar.gz |
preparations to make the twidgets test work
Diffstat (limited to 'tests/destructor')
-rw-r--r-- | tests/destructor/twidgets.nim | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/tests/destructor/twidgets.nim b/tests/destructor/twidgets.nim new file mode 100644 index 000000000..f7af1f75f --- /dev/null +++ b/tests/destructor/twidgets.nim @@ -0,0 +1,74 @@ +discard """ + cmd: '''nim c --newruntime $file''' + output: '''button +clicked!''' + disabled: "true" +""" + +type + Widget* = ref object of RootObj + drawImpl: owned(proc (self: Widget)) + + Button* = ref object of Widget + caption: string + onclick: owned(proc()) + + Window* = ref object of Widget + elements: seq[owned Widget] + + +proc newButton(caption: string; onclick: owned(proc())): owned Button = + proc draw(self: Widget) = + let b = Button(self) + echo b.caption + + #result = Button(drawImpl: draw, caption: caption, onclick: onclick) + new(result) + result.drawImpl = draw + result.caption = caption + result.onclick = onclick + +iterator unitems*[T](a: seq[owned T]): T {.inline.} = + ## Iterates over each item of `a`. + var i = 0 + let L = len(a) + while i < L: + yield a[i] + inc(i) + assert(len(a) == L, "seq modified while iterating over it") + +proc newWindow(): owned Window = + proc draw(self: Widget) = + let w = Window(self) + for e in unitems(w.elements): + let d = (proc(self: Widget))e.drawImpl + if not d.isNil: d(e) + + result = Window(drawImpl: draw, elements: @[]) + +proc draw(w: Widget) = + let d = (proc(self: Widget))w.drawImpl + if not d.isNil: d(w) + +proc add*(w: Window; elem: owned Widget) = + w.elements.add elem + +proc main = + var w = newWindow() + + var b = newButton("button", nil) + #let u: Button = b + b.onclick = proc () = + b.caption = "clicked!" + w.add b + + w.draw() + # simulate button click: + #u.onclick() + + w.draw() + +main() + +let (a, d) = allocCounters() +discard cprintf("%ld %ld new: %ld\n", a, d, allocs) |