1 ! Copyright (C) 2005, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors kernel namespaces ui.gadgets ui.gadgets.worlds
4 ui.gadgets.wrappers ui.gestures math.rectangles
5 math.rectangles.positioning combinators vectors ;
6 FROM: ui.gadgets.wrappers => wrapper ;
9 GENERIC: hide-glass-hook ( gadget -- )
11 M: gadget hide-glass-hook drop ;
15 TUPLE: glass < gadget visible-rect owner ;
17 : <glass> ( owner child visible-rect -- glass )
23 : visible-rect ( glass -- rect )
24 [ visible-rect>> ] [ owner>> ] bi screen-loc offset-rect ;
29 [ gadget-child pref-dim ]
32 ] [ gadget-child ] bi set-rect-bounds ;
34 M: glass ungraft* gadget-child hide-glass-hook ;
36 : add-glass ( glass world -- )
37 [ swap add-gadget drop ] [ [ ?push ] change-layers drop ] 2bi ;
41 : hide-glass ( child -- )
42 [ glass? ] find-parent
43 [ dup find-world [ unparent ] dip request-focus ]
46 : show-glass ( owner child visible-rect -- )
48 dup gadget-child hand-clicked set
49 dup owner>> find-world add-glass ;
52 { T{ button-down } [ hide-glass ] }
53 { T{ drag } [ update-clicked drop ] }
60 TUPLE: popup < wrapper owner ;
62 : <popup> ( owner gadget -- popup )
66 M: popup hide-glass-hook
67 dup owner>> 2dup popup>> eq?
68 [ f >>popup request-focus drop ] [ 2drop ] if ;
73 { T{ key-down f f "ESC" } [ hide-glass ] }
76 : pass-to-popup ( gesture owner -- ? )
77 popup>> focusable-child resend-gesture ;
79 : show-popup ( owner popup visible-rect -- )
80 [ [ dup dup popup>> [ hide-glass ] when* ] dip <popup> ] dip
81 [ drop >>popup drop ] [ show-glass ] 3bi ;