factor/core/ui/models.factor

153 lines
3.6 KiB
Factor
Raw Normal View History

! Copyright (C) 2006 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
IN: models
2006-11-14 00:34:14 -05:00
USING: generic kernel math sequences timers ;
2006-12-11 03:43:07 -05:00
TUPLE: model value connections dependencies ref ;
C: model ( value -- model )
[ set-model-value ] keep
V{ } clone over set-model-connections
2006-07-05 18:11:44 -04:00
V{ } clone over set-model-dependencies
0 over set-model-ref ;
2006-12-11 03:43:07 -05:00
M: model equal? eq? ;
: add-dependency ( dep model -- )
model-dependencies push ;
2006-12-11 03:43:07 -05:00
: remove-dependency ( dep model -- )
model-dependencies delete ;
DEFER: add-connection
2006-11-22 02:52:31 -05:00
GENERIC: model-activated ( model -- )
M: model model-activated drop ;
2006-07-05 18:11:44 -04:00
: ref-model ( model -- n )
dup model-ref 1+ dup rot set-model-ref ;
: unref-model ( model -- n )
dup model-ref 1- dup rot set-model-ref ;
: activate-model ( model -- )
2006-07-05 18:11:44 -04:00
dup ref-model 1 = [
dup model-dependencies
2006-11-22 02:52:31 -05:00
[ dup activate-model dupd add-connection ] each
model-activated
2006-07-05 18:11:44 -04:00
] [
drop
] if ;
DEFER: remove-connection
: deactivate-model ( model -- )
2006-07-05 18:11:44 -04:00
dup unref-model zero? [
dup model-dependencies
[ dup deactivate-model remove-connection ] each-with
] [
drop
] if ;
2006-07-01 16:07:10 -04:00
GENERIC: model-changed ( observer -- )
2006-12-11 03:43:07 -05:00
: add-connection ( observer model -- )
dup model-connections empty? [ dup activate-model ] when
model-connections push ;
2006-12-11 03:43:07 -05:00
: remove-connection ( observer model -- )
[ model-connections delete ] keep
dup model-connections empty? [ dup deactivate-model ] when
drop ;
2006-07-17 01:30:54 -04:00
GENERIC: set-model ( value model -- )
M: model set-model
2006-07-17 01:30:54 -04:00
[ set-model-value ] keep
model-connections [ model-changed ] each ;
2006-07-25 00:14:59 -04:00
: ((change-model)) ( model quot -- newvalue model )
over >r >r model-value r> call r> ; inline
: change-model ( model quot -- )
2006-07-25 00:14:59 -04:00
((change-model)) set-model ; inline
: (change-model) ( model quot -- )
((change-model)) set-model-value ; inline
2006-12-11 03:43:07 -05:00
: delegate>model ( tuple -- )
f <model> swap set-delegate ;
TUPLE: filter model quot ;
C: filter ( model quot -- filter )
dup delegate>model
[ set-filter-quot ] keep
[ set-filter-model ] 2keep
2006-11-22 02:52:31 -05:00
[ add-dependency ] keep ;
M: filter model-changed
dup filter-model model-value over filter-quot call
swap set-model ;
2006-11-22 02:52:31 -05:00
M: filter model-activated model-changed ;
TUPLE: compose ;
C: compose ( models -- compose )
dup delegate>model
2006-11-22 02:52:31 -05:00
swap clone over set-model-dependencies ;
M: compose model-changed
dup model-dependencies [ model-value ] map
2006-07-17 01:30:54 -04:00
swap delegate set-model ;
2006-11-22 02:52:31 -05:00
M: compose model-activated model-changed ;
M: compose set-model
model-dependencies [ set-model ] 2each ;
2006-07-01 16:07:10 -04:00
TUPLE: history back forward ;
C: history ( value -- history )
[ >r <model> r> set-delegate ] keep
2006-07-01 16:07:10 -04:00
V{ } clone over set-history-back
V{ } clone over set-history-forward ;
2006-08-22 21:50:05 -04:00
: (add-history)
2006-07-26 00:38:19 -04:00
swap model-value dup [ swap push ] [ 2drop ] if ;
2006-07-01 16:07:10 -04:00
: go-back/forward ( history to from -- )
dup empty?
[ 3drop ]
[ >r dupd (add-history) r> pop swap set-model ] if ;
: go-back ( history -- )
dup history-forward over history-back go-back/forward ;
: go-forward ( history -- )
dup history-back over history-forward go-back/forward ;
2006-12-11 03:43:07 -05:00
: add-history ( history -- )
2006-08-09 16:14:54 -04:00
dup history-forward delete-all
2006-07-01 16:07:10 -04:00
dup history-back (add-history) ;
2006-11-14 00:34:14 -05:00
TUPLE: delay model timeout ;
2006-11-22 02:52:31 -05:00
: update-delay-model ( delay -- )
dup delay-model model-value swap set-model ;
2006-11-14 00:34:14 -05:00
C: delay ( model timeout -- filter )
dup delegate>model
[ set-delay-timeout ] keep
[ set-delay-model ] 2keep
[ add-dependency ] keep
2006-11-22 02:52:31 -05:00
dup update-delay-model ;
2006-11-14 00:34:14 -05:00
2006-11-22 02:52:31 -05:00
M: delay model-changed 0 over delay-timeout add-timer ;
2006-11-14 00:34:14 -05:00
2006-11-22 02:52:31 -05:00
M: delay model-activated update-delay-model ;
M: delay tick dup remove-timer update-delay-model ;