factor/library/ui/menus.factor

44 lines
1.2 KiB
Factor
Raw Normal View History

2005-03-01 22:11:08 -05:00
! Copyright (C) 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
IN: gadgets
USING: kernel lists math namespaces ;
2005-03-02 21:26:11 -05:00
: hide-menu ( -- )
world get
2005-03-01 22:11:08 -05:00
dup world-menu [ unparent ] when* f swap set-world-menu ;
: show-menu ( menu -- )
2005-03-02 21:26:11 -05:00
hide-menu
world get
2005-03-01 22:11:08 -05:00
2dup set-world-menu
2dup world-hand screen-pos >rect rot move-gadget
add-gadget ;
: menu-item-border ( child -- border )
0 0 0 0 <plain-rect> <gadget> 1 <border> ;
: <menu-item> ( label quot -- gadget )
>r <label> menu-item-border dup r> button-actions ;
TUPLE: menu delegate ;
: menu-actions ( menu -- )
2005-03-02 21:26:11 -05:00
[ drop world get hide-menu ] [ button-down 1 ] set-action ;
: assoc>menu ( assoc menu -- )
#! Given an association list mapping labels to quotations.
#! Prepend a call to hide-menu to each quotation.
[
uncons \ hide-menu swons <menu-item> swap add-gadget
] each-with ;
2005-03-01 22:11:08 -05:00
C: menu ( assoc -- gadget )
#! Given an association list mapping labels to quotations.
[ f line-border swap set-menu-delegate ] keep
<line-pile> [ swap add-gadget ] 2keep
2005-03-02 21:26:11 -05:00
rot assoc>menu dup menu-actions ;
2005-03-01 22:11:08 -05:00
! While a menu is open, clicking anywhere sends the click to
! the menu.
M: menu inside? ( point menu -- ? ) 2drop t ;