+ ui:\r
\r
- fix up the min thumb size hack\r
-- nicer scrollbars with up/down buttons\r
- only redraw dirty gadgets\r
- faster mouse tracking\r
\r
! Copyright (C) 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
IN: gadgets
-USING: generic kernel lists math namespaces prettyprint sdl
-sequences io sequences styles ;
+USING: generic io kernel lists math namespaces prettyprint sdl
+sequences sequences styles threads ;
: button-down? ( n -- ? ) hand hand-buttons member? ;
: button-clicked ( button -- )
#! If the mouse is released while still inside the button,
#! fire an action gesture.
- dup mouse-over?
- [ [ action ] swap handle-gesture drop ] [ drop ] ifte ;
+ dup button-update dup mouse-over?
+ [ [ action ] swap handle-gesture ] when drop ;
: button-theme ( button -- )
dup { 216 216 216 } background set-paint-prop
: button-gestures ( button quot -- )
dupd [ action ] set-action
- dup [ dup button-update button-clicked ] [ button-up 1 ] set-action
+ dup [ button-clicked ] [ button-up 1 ] set-action
dup [ button-update ] [ button-down 1 ] set-action
dup [ button-update ] [ mouse-leave ] set-action
- dup [ button-update ] [ mouse-enter ] set-action
- [ drop ] [ drag 1 ] set-action ;
+ [ button-update ] [ mouse-enter ] set-action ;
-: <button> ( gadget quot -- button )
- >r bevel-border dup button-theme dup r> button-gestures ;
+TUPLE: button ;
+
+C: button ( gadget quot -- button )
+ rot bevel-border over set-delegate
+ dup button-theme [ swap button-gestures ] keep ;
: <roll-button> ( gadget quot -- button )
>r dup roll-button-theme dup r> button-gestures ;
+
+: repeat-button-down ( button -- )
+ dup 100 add-timer button-clicked ;
+
+: repeat-button-up ( button -- )
+ dup button-update remove-timer ;
+
+: repeat-actions ( button -- )
+ dup [ repeat-button-down ] [ button-down 1 ] set-action
+ [ repeat-button-up ] [ button-up 1 ] set-action ;
+
+: <repeat-button> ( gadget quot -- button )
+ #! Button that calls the quotation every 100ms as long as
+ #! the mouse is held down.
+ <button> dup repeat-actions ;
+
+M: button tick ( ms object -- ) nip button-clicked ;
TUPLE: display title pane ;
+: display-title-theme
+ dup { 216 232 255 } background set-paint-prop
+ << solid f >> interior set-paint-prop ;
+
: <display-title> ( text -- label )
- <label>
- dup << solid f >> interior set-paint-prop
- dup { 216 232 255 } background set-paint-prop ;
+ <label> dup display-title-theme ;
: add-display-title ( title display -- )
2dup set-display-title add-top ;
1 <pile> [ add-gadgets ] keep ;
: menu-theme ( menu -- )
- << gradient f { 1 0 0 } { 240 240 255 } { 216 216 216 } >>
- interior set-paint-prop ;
+ << solid f >> interior set-paint-prop ;
: <menu> ( assoc -- gadget )
#! Given an association list mapping labels to quotations.
threads vectors styles ;
! A viewport can be scrolled.
-TUPLE: viewport origin bottom? ;
+TUPLE: viewport origin ;
! A scroller combines a viewport with two x and y sliders.
-TUPLE: scroller viewport x y ;
+TUPLE: scroller viewport x y bottom? ;
: viewport-dim gadget-child pref-dim ;
M: viewport pref-dim gadget-child pref-dim ;
-: viewport-origin* ( viewport -- point )
- dup viewport-bottom? [
- f over set-viewport-bottom?
- dup viewport-dim { 0 -1 0 } v*
- [ swap set-viewport-origin ] keep
- ] [
- viewport-origin
- ] ifte ;
-
M: viewport layout* ( viewport -- )
- dup gadget-child dup prefer
- >r dup viewport-origin* swap fix-scroll r>
+ dup viewport-origin over fix-scroll
+ swap gadget-child dup prefer
set-rect-loc ;
M: viewport focusable-child* ( viewport -- gadget )
: add-y-slider 2dup set-scroller-y add-right ;
-: (scroll>bottom) ( scroller -- )
- t swap scroller-viewport set-viewport-bottom? ;
-
: scroll>bottom ( gadget -- )
- [ scroll>bottom ] swap handle-gesture drop ;
+ [ scroller? ] find-parent
+ [ t over set-scroller-bottom? relayout ] when* ;
-: scroll-by ( amount scroller -- )
- [ scroller-viewport viewport-origin v+ ] keep scroll ;
+: scroll-up-line scroller-y -1 swap slide-by-line ;
-: scroll-up-line { 0 32 0 } swap scroll-by ;
-
-: scroll-down-line { 0 -32 0 } swap scroll-by ;
+: scroll-down-line scroller-y 1 swap slide-by-line ;
: scroller-actions ( scroller -- )
- dup [ (scroll>bottom) ] [ scroll>bottom ] set-action
dup [ scroll-up-line ] [ button-down 4 ] set-action
[ scroll-down-line ] [ button-down 5 ] set-action ;
<y-slider> over add-y-slider
dup scroller-actions ;
-M: scroller focusable-child* ( viewport -- gadget )
+M: scroller focusable-child* ( scroller -- viewport )
scroller-viewport ;
+
+M: scroller layout* ( scroller -- )
+ dup scroller-bottom? [
+ f over set-scroller-bottom?
+ dup scroller-viewport viewport-dim vneg over scroll
+ ] when delegate layout* ;
: slide-by-line ( -1/1 slider -- ) >r 32 * r> slide-by ;
: <up-button>
- <gadget> [ -1 swap slide-by-line ] <button> ;
+ <gadget> [ -1 swap slide-by-line ] <repeat-button> ;
: add-up { 1 1 1 } over slider-vector v- 2unseq set-frame-child ;
: <down-button>
- <gadget> [ 1 swap slide-by-line ] <button> ;
+ <gadget> [ 1 swap slide-by-line ] <repeat-button> ;
: add-down { 1 1 1 } over slider-vector v+ 2unseq set-frame-child ;
! Copyright (C) 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
IN: gadgets
-USING: alien hashtables kernel lists namespaces sdl sequences
-strings styles io ;
+USING: alien hashtables io kernel lists math namespaces sdl
+sequences strings styles ;
: draw-surface ( x y surface -- )
surface get SDL_UnlockSurface
[ f swap set-word-prop ] each-with ;
: reset-word ( word -- )
- { "parsing" "inline" "foldable" "flushable" "predicating" }
- reset-props ;
+ {
+ "parsing" "inline" "foldable" "flushable" "predicating"
+ "documentation" "stack-effect"
+ } reset-props ;
: reset-generic ( word -- )
dup reset-word { "methods" "combination" } reset-props ;