1 # vim: foldmarker=<<<,>>>
4 # onchange() - Fired when a variable changes value
5 # onchange_info(n1, n2, op) - Fired when a variable changes value
10 constructor
{accessvar args
} {
11 upvar $accessvar scopevar
12 eval tlc
::Signal::constructor scopevar
17 method attach_dirtyvar
{varname
}
18 method detach_dirtyvar
{varname
}
25 method _on_set_state
{pending
}
33 method var_update
{n1 n2 op
}
34 method fire_onchange
{n1 n2 op
}
39 body tlc
::Varwatch::constructor {accessvar args
} { #<<<1
44 body tlc
::Varwatch::destructor {} { #<<<1
45 foreach var
$watchvars {
48 after cancel
$afterid; set afterid
""
52 body tlc
::Varwatch::attach_dirtyvar {varname
} { #<<<1
53 set idx
[lsearch $watchvars $varname]
55 lappend watchvars
$varname
57 trace variable $varname wu
[code
$this var_update
]
61 body tlc
::Varwatch::detach_dirtyvar {varname
} { #<<<1
62 set idx
[lsearch $watchvars $varname]
63 set watchvars
[lreplace $watchvars $idx $idx]
64 trace vdelete
$varname wu
[code
$this var_update
]
68 body tlc
::Varwatch::arm {} { #<<<1
73 body tlc
::Varwatch::disarm {} { #<<<1
78 body tlc
::Varwatch::var_update {n1 n2 op
} { #<<<1
81 if {$afterid == "" && ([handlers_available onchange
] ||
[handlers_available onchange_info
])} {
82 set afterid
[after idle
[code
$this fire_onchange
$n1 $n2 $op]]
87 body tlc
::Varwatch::fire_onchange {n1 n2 op
} { #<<<1
88 after cancel
$afterid; set afterid
""
89 invoke_handlers onchange
90 invoke_handlers onchange_info
$n1 $n2 $op
94 body tlc
::Varwatch::is_armed {} { #<<<1
95 return [expr {($lock > 0) ?
0 : 1}]
99 body tlc
::Varwatch::_on_set_state {pending
} { #<<<1
100 after cancel
$afterid; set afterid
""