blob: f6455749c9ac952d42b7a77a1699d7f2fe1e95ea (
plain) (
tree)
|
|
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 true:
# 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
|