factor/library/ui/hand.factor

115 lines
3.4 KiB
Factor
Raw Normal View History

! Copyright (C) 2005, 2006 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
2005-02-01 20:14:03 -05:00
IN: gadgets
2006-03-18 01:57:57 -05:00
USING: gadgets-labels gadgets-layouts kernel math namespaces
queues sequences ;
2005-02-01 20:14:03 -05:00
! Hand state
2006-03-19 18:21:05 -05:00
! Note that these are only really useful inside an event
! handler, and that the locations hand-loc and hand-click-loc
! are in the co-ordinate system of the world which contains
! the gadget in question.
SYMBOL: hand-gadget
2006-03-19 18:21:05 -05:00
SYMBOL: hand-loc
2006-03-20 00:05:04 -05:00
{ 0 0 0 } hand-loc set-global
SYMBOL: hand-clicked
SYMBOL: hand-click-loc
SYMBOL: hand-buttons
V{ } clone hand-buttons set-global
: button-gesture ( buttons gesture -- )
2005-12-17 00:12:32 -05:00
#! Send a gesture like [ button-down 2 ]; if nobody
#! handles it, send [ button-down ].
swap hand-clicked get-global 3dup >r add r> handle-gesture
[ nip handle-gesture drop ] [ 3drop ] if ;
2005-02-01 20:14:03 -05:00
: update-clicked ( -- )
hand-gadget get-global hand-clicked set-global
2006-03-19 18:21:05 -05:00
hand-loc get-global hand-click-loc set-global ;
: send-button-down ( event -- )
update-clicked
dup hand-buttons get-global push
[ button-down ] button-gesture ;
: send-button-up ( event -- )
dup hand-buttons get-global delete
[ button-up ] button-gesture ;
: send-scroll-wheel ( up/down -- )
[ wheel-up ] [ wheel-down ] ?
hand-gadget get-global handle-gesture drop ;
2005-12-17 00:12:32 -05:00
: drag-gesture ( -- )
#! Send a gesture like [ drag 2 ]; if nobody handles it,
#! send [ drag ].
hand-buttons get-global first [ drag ] button-gesture ;
: fire-motion ( -- )
2005-02-26 02:11:25 -05:00
#! Fire a motion gesture to the gadget underneath the hand,
#! and if a mouse button is down, fire a drag gesture to the
#! gadget that was clicked.
[ motion ] hand-gadget get-global handle-gesture drop
hand-buttons get-global empty? [ drag-gesture ] unless ;
: each-gesture ( gesture seq -- )
[ handle-gesture* drop ] each-with ;
2005-10-09 21:27:14 -04:00
: hand-gestures ( new old -- )
drop-prefix reverse-slice
[ mouse-leave ] swap each-gesture
fire-motion
[ mouse-enter ] swap each-gesture ;
2005-02-05 11:52:24 -05:00
: focus-gestures ( new old -- )
2005-10-09 21:27:14 -04:00
drop-prefix reverse-slice
[ lose-focus ] swap each-gesture
[ gain-focus ] swap each-gesture ;
2006-03-21 02:40:16 -05:00
: request-focus* ( gadget world -- )
2006-03-19 01:07:36 -05:00
dup focused-ancestors >r
[ set-world-focus ] keep
focused-ancestors r> focus-gestures ;
2005-08-27 00:22:19 -04:00
2006-03-21 02:40:16 -05:00
: request-focus ( gadget -- )
dup focusable-child swap find-world request-focus* ;
2006-03-19 18:00:07 -05:00
: drag-loc ( -- loc )
2006-03-19 18:21:05 -05:00
hand-loc get-global hand-click-loc get-global v- ;
2006-03-18 01:57:57 -05:00
2006-03-19 02:43:06 -05:00
: hand-click-rel ( gadget -- loc )
hand-click-loc get-global relative-loc ;
2006-03-18 01:57:57 -05:00
: relevant-help ( seq -- help )
[ gadget-help ] map [ ] find nip ;
: show-message ( string/f -- )
#! Show a message in the status bar.
world-status [ set-label-text* ] [ drop ] if* ;
2006-03-18 01:57:57 -05:00
2006-03-21 01:43:03 -05:00
: update-help ( -- )
2006-03-18 01:57:57 -05:00
#! Update mouse-over help message.
hand-gadget get-global parents [ relevant-help ] keep
2006-03-18 01:57:57 -05:00
dup empty? [ 2drop ] [ peek show-message ] if ;
: under-hand ( -- seq )
#! A sequence whose first element is the world and last is
#! the current gadget, with all parents in between.
hand-gadget get-global parents reverse-slice ;
2006-03-18 01:57:57 -05:00
: move-hand ( loc world -- )
2006-03-19 18:21:05 -05:00
under-hand >r over hand-loc set-global
2006-03-19 00:57:47 -05:00
pick-up hand-gadget set-global
2006-03-18 01:57:57 -05:00
under-hand r> hand-gestures update-help ;
: update-hand ( world -- )
#! Called when a gadget is removed or added.
2006-03-19 18:21:05 -05:00
hand-loc get-global swap move-hand ;
2006-03-18 01:57:57 -05:00
: layout-queued ( -- )
invalid dup queue-empty?
2006-03-21 01:43:03 -05:00
[ drop ] [ deque dup layout repaint layout-queued ] if ;