123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- 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
|