\ skins

needs skinstructs
needs togglebutton
needs mombutton
needs 1802io
needs 1861display

decimal
variable current-form-id

: Skin:  ( "name" -- )
    create   0 ,  0 ,
    does> ;

: skin>normal  ( skin -- normalview ) 
    ;   immediate

: skin>video  ( skin -- videoview )   
    1 cells + ;

0 view-offset !
: view  ( -- currentview )
    current-skin @  
    view-offset @  +
    @ ;

\ q-displayed remembers the current
\ drawn q state so we don't need to
\ repaint if no state change has
\ occurred.
variable q-displayed

: paint-q  ( -- )
    view view.pos-q 2@     
    ( y x )
    Q@ if  view view.id-qon @    -1
    else   view view.id-qoff @   0
    then   q-displayed !
    ( y x id )
   [id] Tbmp DrawBitmapResource ;

\ Note: Q@ and q-displayed are
\ both "clean" flags, always 
\ either -1 or 0. This isn't the
\ case throughout the code...
\ cleanliness is sometimes traded
\ for speed.
: update-q  ( -- )
    Q@  q-displayed @  <> if
        paint-q
    then ;

\ Remember the last digits painted
\ to keep repaints to a minimum.
variable lodigit-displayed
variable hidigit-displayed

: paint-lodigit  ( -- )
    view view.pos-lodigit 2@
    ( y x )
    4 output@   (hex) 0F and
    dup  lodigit-displayed !
    view view.id-digit0 @ +
    ( y x id )
    [id] Tbmp DrawBitmapResource ;

: paint-hidigit  ( -- )
    view view.pos-hidigit 2@
    ( y x )
    4 output@  4 rshift
    dup  hidigit-displayed !
    view view.id-digit0 @ +
    ( y x id )
   [id] Tbmp DrawBitmapResource ;

: update-lodigit  ( -- )
    4 output@
    lodigit-displayed <> if
        paint-lodigit
    then ;

: update-hidigit  ( -- )
    4 output@
    hidigit-displayed <> if
        paint-hidigit
    then ;

: paint  ( -- )
    paint-hidigit
    paint-lodigit
    paint-q ;

\ update-skin is similar to paint,
\ but won't repaint unless the 
\ state has changed.
: update-skin  ( -- )
    update-hidigit
    update-lodigit
    update-q ;

: set-input  ( flag -- )
    if   raise-EF4   else   lower-EF4  then ;

: do-inputbutton-event  ( ekey -- )
    view view.mom-ikey @
    do-momentary-event ; 
   
: do-view-events  ( ekey -- )
    view view.v-event @ execute ;

Toggle: runtoggle
Toggle: loadtoggle
Toggle: mptoggle

1310 runtoggle tgl.offbmp-id !
1311 runtoggle tgl.onbmp-id !
1312 runtoggle tgl.midbmp-id !
1017 runtoggle tgl.gadget-id !

1310 loadtoggle tgl.offbmp-id !
1311 loadtoggle tgl.onbmp-id !
1312 loadtoggle tgl.midbmp-id !
1018 loadtoggle tgl.gadget-id !

1313 mptoggle tgl.offbmp-id !
1314 mptoggle tgl.onbmp-id !
1317 mptoggle tgl.midbmp-id !
1019 mptoggle tgl.gadget-id !

: do-skin-events  ( ekey -- )
    dup runtoggle do-toggle-event
    dup loadtoggle do-toggle-event
    dup mptoggle do-toggle-event
    dup do-inputbutton-event
    do-view-events ;

: init-run-toggle  ( -- )
    run-switch?  
    ['] set-run-switch 
    runtoggle init-toggle ;

: init-load-toggle  ( -- )
    load-switch?  
    ['] set-load-switch 
    loadtoggle init-toggle ;

: init-mp-toggle  ( -- )
    memprotect?               ( flag )
    ['] set-memprotect    ( flag xt )
    mptoggle init-toggle ;

: init-control-toggles  ( -- )
    init-run-toggle
    init-load-toggle
    init-mp-toggle ;

: init-input-button  ( -- )
    \ init input key
    ['] set-input
    view view.mom-ikey @
    init-momentary ;

: init-skin  ( -- )
    view view.id-form @  
    dup ShowForm
    dup until-drawn   \ test
    current-form-id !
    init-control-toggles
    init-input-button
    \ do view-specific painting
    view view.v-init @  execute 
    \ do common painting
    paint
    \ Force the video to repaint in case
    \ the 1861 was on when we switched
    \ skins.
    force-video-repaint ;  

: set-normalview  ( -- )
    0  skin>normal  view-offset !
    init-skin ;

: set-videoview  ( -- )
    0 skin>video  view-offset ! 
    init-skin ;

: set-skin  ( skin -- )
    current-skin ! ;

\ : input-byte  ( byte -- )
\   4 input! ;

: input-nibble  ( nibble -- )
    4 input@
    4 lshift   or
    4 input! ;

