factor/library/ui/gadgets/buttons.factor

98 lines
2.8 KiB
Factor
Raw Normal View History

2006-10-03 18:17:21 -04:00
! Copyright (C) 2005, 2006 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
IN: gadgets-buttons
2006-10-03 18:17:21 -04:00
USING: gadgets gadgets-borders gadgets-labels
gadgets-theme generic io kernel math models namespaces sequences
strings styles threads words ;
2006-06-17 03:51:06 -04:00
TUPLE: button rollover? pressed? selected? quot ;
2005-10-25 21:52:26 -04:00
2006-05-18 22:01:38 -04:00
: buttons-down? ( -- ? )
hand-buttons get-global empty? not ;
2005-02-19 23:25:21 -05:00
: mouse-over? ( gadget -- ? )
hand-gadget get-global child? ;
: mouse-clicked? ( gadget -- ? )
hand-clicked get-global child? ;
: button-update ( button -- )
2005-10-25 21:52:26 -04:00
dup mouse-over? over set-button-rollover?
2006-05-18 22:01:38 -04:00
dup mouse-clicked? buttons-down? and
over button-rollover? and over set-button-pressed?
2005-09-25 20:41:49 -04:00
relayout-1 ;
2006-03-25 17:41:40 -05:00
: if-clicked ( button quot -- )
>r dup button-update dup button-rollover? r> [ drop ] if ;
2006-03-25 17:41:40 -05:00
: button-clicked ( button -- )
dup button-quot if-clicked ;
2005-05-03 19:00:52 -04:00
button H{
{ T{ button-up } [ button-clicked ] }
{ T{ button-down } [ button-update ] }
{ T{ mouse-leave } [ button-update ] }
{ T{ mouse-enter } [ button-update ] }
} set-gestures
2005-07-17 02:49:07 -04:00
GENERIC: >label ( obj -- gadget )
M: string >label <label> ;
M: object >label ;
M: f >label drop <gadget> ;
2005-08-27 15:12:37 -04:00
C: button ( gadget quot -- button )
rot >label <default-border> over set-gadget-delegate
2006-05-26 17:40:41 -04:00
[ set-button-quot ] keep ;
2005-08-26 00:55:56 -04:00
2005-10-25 21:52:26 -04:00
: <highlight-button> ( gadget quot -- button )
2006-06-23 00:06:53 -04:00
<button> { 0 0 } over set-border-size ;
2005-10-25 21:52:26 -04:00
2005-08-26 21:42:43 -04:00
: <roll-button> ( gadget quot -- button )
2005-10-25 21:52:26 -04:00
<highlight-button> dup roll-button-theme ;
2005-09-27 00:44:38 -04:00
2005-10-25 21:52:26 -04:00
: <bevel-button> ( gadget quot -- button )
<button> dup bevel-button-theme ;
2005-08-27 15:12:37 -04:00
: repeat-button-down ( button -- )
dup 100 add-timer button-clicked ;
: repeat-button-up ( button -- )
dup button-update remove-timer ;
2006-05-26 17:40:41 -04:00
TUPLE: repeat-button ;
2005-08-27 15:12:37 -04:00
repeat-button H{
2006-09-29 16:26:54 -04:00
{ T{ button-down } [ [ button-clicked ] start-timer-gadget ] }
{ T{ button-up } [ dup stop-timer-gadget button-update ] }
} set-gestures
2006-05-26 17:40:41 -04:00
C: repeat-button ( gadget quot -- button )
2005-08-27 15:12:37 -04:00
#! Button that calls the quotation every 100ms as long as
#! the mouse is held down.
2006-09-29 16:26:54 -04:00
[
>r <bevel-button> <timer-gadget> r> set-gadget-delegate
] keep ;
2005-10-25 21:52:26 -04:00
2006-06-17 03:51:06 -04:00
TUPLE: button-paint plain rollover pressed selected ;
2005-10-25 21:52:26 -04:00
: button-paint ( button paint -- button paint )
{
{ [ over button-pressed? ] [ button-paint-pressed ] }
2006-06-17 03:51:06 -04:00
{ [ over button-selected? ] [ button-paint-selected ] }
{ [ over button-rollover? ] [ button-paint-rollover ] }
{ [ t ] [ button-paint-plain ] }
} cond ;
2005-10-25 21:52:26 -04:00
M: button-paint draw-interior
2005-10-25 21:52:26 -04:00
button-paint draw-interior ;
M: button-paint draw-boundary
2005-10-25 21:52:26 -04:00
button-paint draw-boundary ;
: <radio-control> ( model value gadget -- gadget )
2006-08-31 21:58:15 -04:00
over [ swap control-model set-model* ] curry <bevel-button>
swap [ swap >r = r> set-button-selected? ] curry <control> ;
: <radio-box> ( model assoc -- gadget )
2006-08-28 18:14:54 -04:00
[ first2 <radio-control> ] map-with make-shelf ;