UI race fix: if you call relayout-1 then relayout on the same gadget, it behaves as if it was a relayout-1

slava 2006-07-26 00:09:19 +00:00
parent f7b1fae96c
commit ec3ee8f389
3 changed files with 20 additions and 13 deletions

View File

@ -35,9 +35,16 @@ M: array rect-dim drop { 0 0 } ;
: intersects? ( rect/point rect -- ? ) : intersects? ( rect/point rect -- ? )
(rect-intersect) [v-] { 0 0 } = ; (rect-intersect) [v-] { 0 0 } = ;
! gadget-pref-dim is a cached value; call pref-dim instead
! gadget-children is a vector
! gadget-orientation is { 1 0 } or { 0 1 }
! gadget-state is f, relayout or relayout-1
! gadget-root? relayout requests do not propogate higher
! gadget-grafted? are we part of a live world's gadget hierarchy
! gadget-interior, gadget-boundary: see paint.factor
TUPLE: gadget TUPLE: gadget
pref-dim parent children orientation pref-dim parent children orientation state
visible? relayout? root? clipped? grafted? visible? root? clipped? grafted?
interior boundary ; interior boundary ;
M: gadget = eq? ; M: gadget = eq? ;

View File

@ -20,7 +20,7 @@ C: incremental ( pack -- incremental )
dup delegate pref-dim over set-incremental-cursor ; dup delegate pref-dim over set-incremental-cursor ;
M: incremental pref-dim* ( incremental -- dim ) M: incremental pref-dim* ( incremental -- dim )
dup gadget-relayout? [ dup gadget-state [
dup delegate pref-dim over set-incremental-cursor dup delegate pref-dim over set-incremental-cursor
] when incremental-cursor ; ] when incremental-cursor ;

View File

@ -4,7 +4,7 @@ USING: errors generic hashtables kernel math
namespaces queues sequences ; namespaces queues sequences ;
IN: gadgets IN: gadgets
: invalidate ( gadget -- ) t swap set-gadget-relayout? ; : invalidate ( gadget state -- ) swap set-gadget-state ;
: forget-pref-dim ( gadget -- ) f swap set-gadget-pref-dim ; : forget-pref-dim ( gadget -- ) f swap set-gadget-pref-dim ;
@ -14,8 +14,8 @@ IN: gadgets
DEFER: relayout DEFER: relayout
: invalidate* ( gadget -- ) : invalidate* ( gadget state -- )
dup invalidate dupd invalidate
dup forget-pref-dim dup forget-pref-dim
dup gadget-root? dup gadget-root?
[ add-invalid ] [ gadget-parent [ relayout ] when* ] if ; [ add-invalid ] [ gadget-parent [ relayout ] when* ] if ;
@ -24,16 +24,16 @@ DEFER: relayout
#! Relayout and redraw a gadget and its parent before the #! Relayout and redraw a gadget and its parent before the
#! next iteration of the event loop. Should be used when the #! next iteration of the event loop. Should be used when the
#! gadget's size has potentially changed. See relayout-1. #! gadget's size has potentially changed. See relayout-1.
dup gadget-relayout? dup gadget-state \ relayout eq?
[ drop ] [ invalidate* ] if ; [ drop ] [ \ relayout invalidate* ] if ;
: relayout-1 ( gadget -- ) : relayout-1 ( gadget -- )
#! Relayout and redraw a gadget before th next iteration of #! Relayout and redraw a gadget before th next iteration of
#! the event loop. Should be used if the gadget should be #! the event loop. Should be used if the gadget should be
#! repainted, or if its internal layout changed, but its #! repainted, or if its internal layout changed, but its
#! preferred size did not change. #! preferred size did not change.
dup gadget-relayout? dup gadget-state
[ drop ] [ dup invalidate add-invalid ] if ; [ drop ] [ dup \ relayout-1 invalidate add-invalid ] if ;
: show-gadget t over set-gadget-visible? relayout-1 ; : show-gadget t over set-gadget-visible? relayout-1 ;
@ -77,8 +77,8 @@ DEFER: layout
#! Position the children of the gadget inside the gadget. #! Position the children of the gadget inside the gadget.
#! Note that nothing is done if the gadget does not need to #! Note that nothing is done if the gadget does not need to
#! be laid out. #! be laid out.
dup gadget-relayout? [ dup gadget-state [
f over set-gadget-relayout? f over set-gadget-state
dup layout* dup layout-children dup layout* dup layout-children
] when drop ; ] when drop ;