\ VP-ui
\ JacksOrBetter User Interface
\ 
\ $Id: VP-ui.txt,v 1.4 2000/10/25 00:30:53 kris_johnson Exp $

\ Copyright 2000
\ Kristopher D. Johnson
\ 
\ See LICENSE-JacksOrBetter for the
\ conditions under which you may
\ use, redistribute, or modify this 
\ code, or create derived works.

docneeds VP-uilib
docneeds VP-alerts
docneeds VP-sounds
docneeds VP-game
docneeds VP-clock
docneeds VP-fields
docneeds VP-patterns

.( VP-ui... )

\ Display number of chips
: refresh-chips ( -- )
  Chips @ txtChips set-label# ;

\ Rectangle buffer
Rect CardRect

\ Put bounding rectangle of card
\ button into CardRect
: get-CardRect ( iCard -- )
  HandButtonID CardRect ctl-bounds
;

: draw-card-back ( iCard -- )
  get-CardRect
  card-pattern 3 CardRect fill-rect
;

: invert-card ( iCard -- )
  get-CardRect
  3 CardRect invert-rect
;

\ String buffer used by refresh-hand
create CardBuf  8 cells allot

: refresh-card ( iCard -- )
  >r
  r@ Hand @ ?dup if
    card-unpack ( rank suit )
    >r >r CardBuf 0
    r> rank>zstring append
    zbl append
    r> suit>zstring append
    2dup zterm
    r> HandButtonID set-label
  else
    zbl r@ HandButtonID set-label
    r> draw-card-back
 then
;

\ Display cards of hand
: refresh-hand ( -- )
  #Hand 0 do i refresh-card loop ;

\ Make checkboxes visible
: show-hold ( -- )
  HoldCheckIDBounds do
    i show-ctl
  loop
;

\ Set elems of HandHold from
\ checkbox states
: checks>hold ( -- )
  #Hand 0 do
    i HoldCheckID get-check
    i HandHold !
  loop
;

\ Set checkbox states from
\ HandHold elems
: hold>checks ( -- )
  #Hand 0 do
    i hold?
    i HoldCheckID set-check
  loop
;

: reset-hold ( -- )
  HoldCheckIDBounds do
    false i set-check
  loop
;

: hide-hold ( -- )
  HoldCheckIDBounds do
    i false over set-check hide-ctl
  loop
;

: refresh-hold ( -- )
  Dealt? if show-hold exit then
  hide-hold
;

: deal-title ( -- zadr u )
  Dealt? if z" Draw" exit then
  z" Deal"
;

: refresh-buttons ( -- )
  deal-title cmdDeal set-label
  GameOver? not cmdDeal show-if
  NewGame? not cmdNew show-if
;

: make-fields ( -- za3 u3 za2 u2 za1 u1 )
  NewGame? if
    NewGame-fields exit
  then
  BetweenHands? if
    BetweenHands-fields exit
  then
  Dealt? if
    Dealt-fields exit
  then
  GameOver-fields
;

: refresh-fields ( -- )
  make-fields set-fields ;

\ Update all main-form elements
\ to match game state
: refresh-form ( -- )
  refresh-chips
  refresh-hand
  refresh-hold
  refresh-buttons
  refresh-fields
  refresh-clock
;

\ Display main form
: show-form ( -- )
  frmMain ShowForm
  standalone? not cmdExit show-if
  hold>checks
  refresh-form
;

\ Show help dialog
: show-help ( -- )
  altHelp FrmAlert drop ;

\ Show About box
: about-box ( -- )
  altAbout FrmAlert drop ;

: let-user-see-cards ( -- )
  500 ms ;

: show-shuffle ( -- )
    #Hand 0 do
      i draw-card-back
    loop
    let-user-see-cards
;

: show-discard ( -- )
  #Hand 0 do
    i hold? not if
      i draw-card-back
    then
  loop
  let-user-see-cards
;

: invert-scoring ( -- )
  #Hand 0 do
    i scoring-card? if
      i invert-card
    then
  loop
;

: flash-wait ( -- )
  150 ms ;

: invert-scoring-and-wait ( -- )
  invert-scoring flash-wait ;

: show-scoring ( -- )
  invert-scoring-and-wait
  invert-scoring-and-wait
  invert-scoring-and-wait
  invert-scoring
;

