mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-29 09:24:36 +00:00
96 lines
2.3 KiB
Nim
96 lines
2.3 KiB
Nim
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
|
|
|