diff options
author | Araq <rumpf_a@web.de> | 2014-01-13 02:10:03 +0100 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2014-01-13 02:10:03 +0100 |
commit | 20b5f31c03fb556ec0aa2428a40adbac004d8987 (patch) | |
tree | 58086941e7d6bb8f480ca1173a95722ada9435b2 /tests/bind/tdatabind.nim | |
parent | 51ee524109cf7e3e86c676bc1676063a01bfd979 (diff) | |
download | Nim-20b5f31c03fb556ec0aa2428a40adbac004d8987.tar.gz |
new tester; all tests categorized
Diffstat (limited to 'tests/bind/tdatabind.nim')
-rw-r--r-- | tests/bind/tdatabind.nim | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/tests/bind/tdatabind.nim b/tests/bind/tdatabind.nim new file mode 100644 index 000000000..afa8aa47b --- /dev/null +++ b/tests/bind/tdatabind.nim @@ -0,0 +1,95 @@ +discard """ + disabled: true +""" + +import events +type + TProperty*[T] = object of TObject + getProc: proc(property: TProperty[T]): T {.nimcall.} + setProc: proc(property: var TProperty[T], value: T) {.nimcall.} + value: T + ValueChanged*: TEventHandler + Binders: seq[TProperty[T]] + EEmitter: TEventEmitter + # Not a descriptive name but it was that or TPropertyValueChangeEventArgs. + TValueEventArgs[T] = object of TEventArgs + Property*: TProperty[T] + + +proc newProperty*[T](value: T): TProperty[T] = + var prop: TProperty[T] + + prop.EEmitter = initEventEmitter() + prop.Binders = @[] + prop.ValueChanged = initEventHandler("ValueChanged") + prop.value = value + + proc getter(property: TProperty[T]): T = + return property.value + + prop.getProc = getter + + proc setter(property: var TProperty[T], v: T) = + property.value = v + + # fire event here + var args: TValueEventArgs[T] + args.Property = property + property.EEmitter.emit(property.ValueChanged, args) + + prop.setProc = setter + + return prop + +proc `prop`[T] (p: TProperty[T]): T = + # I'm assuming this is trying to get a value from the property. + # i.e. myVar = myProperty + return p.getProc(p) + +proc `~=`[T] (p: var TProperty[T], v: T) = + # Assuming this is setting the value. + p.setProc(p, v) + +proc `$`[T] (p: TProperty[T]): string = + var value = p.getProc(p) + return $value + +proc propertyBind*[T](p1: var TProperty[T], p2: var TProperty[T]) = + p1.Binders.add(p2) + + # make handler -> handler[T] so trigger even more generics bugs ... + proc handler(e: TEventArgs) = + type TEA = TValueEventArgs[T] + var args = TEA(e) + var val = args.Property.getProc(p1) + for i in countup(0, len(e.Property.ValueChanged.Binders) -1): + var binded = e.Property.ValueChanged.Binders[i] + binded.setProc(binded, val) + + echo("Property 1 has changed to " & $val) + + if p1.ValueChanged.containsHandler(handler) == false: + addHandler(p1.ValueChanged, handler) + +proc `->`[T](p1: var TProperty[T], p2: var TProperty[T]) = + propertyBind(p2,p1) + +when isMainModule: + # Initial value testing + var myProp = newProperty(5) + + echo(myProp) + + myProp ~= 7 # Temp operator until overloading of '=' is implemented. + echo(myProp) + + # Binding testing + + var prop1 = newProperty(9) + var prop2: TProperty[int] + + prop2 -> prop1 # Binds prop2 to prop1 + + prop1 ~= 7 + echo(prop2) # Output: 7 + |