pitch-dark/src/ui.common.a

277 lines
8.7 KiB
Plaintext

;license:MIT
;(c) 2018 by 4am
;
; User interface - common views and paint routines across screens
;
; Public functions
; - HardResetWeeGUI
; - ExitWeeGUI
; - ClearPendingInput
; - CreateRadio
; - CreateCheckbox
; - CreateButton
; - PaintTitleBar
; - PrintAt
; - SimulateClick
; - GetCheckedRadioButton
; - CreateNullTerminatedString
;
; Public constants
; - kStringOK
; - kStringCancel
;
kStringOK
!byte $0F ; 'O' inverse
!byte 139,0
kStringCancel
!byte $03 ; 'C' inverse
!text "ancel",0
;------------------------------------------------------------------------------
; HardResetWeeGUI
; super-resets all WeeGUI views by creating 16 dummy views (which clears their
; internal state and callbacks and so on) then calling WeeGUI WGResetAll method
;
; in: WeeGUI initialized
; out: PARAM0/PARAM1 clobbered
; all registers clobbered
;------------------------------------------------------------------------------
HardResetWeeGUI
lda #15 ; highest possible WeeGUI view ID
sta @kHardResetDummyView
+LDAY @kHardResetDummyView
+STAY PARAM0
- ldx #WGCreateView
jsr WeeGUI ; create dummy views to reset state on all views
dec @kHardResetDummyView
bpl -
ldx #WGResetAll ; reset WeeGUI (destroys everything we just created)
jmp WeeGUI
@kHardResetDummyView
!byte 0,0,0,0,0,0,0,0
;------------------------------------------------------------------------------
; ExitWeeGUI
; clears the screen and safely shuts down WeeGUI
;
; in: WeeGUI initialized
; out: A,Y preserved
; X clobbered
;------------------------------------------------------------------------------
ExitWeeGUI
ldx #WGDisableMouse ; disable mouse support before quitting
jsr WeeGUI
ldx #WGClearScreen ; clear screen (HOME)
jsr WeeGUI
ldx #WGExit ; clean up WeeGUI
jmp WeeGUI
;------------------------------------------------------------------------------
; ClearPendingInput
; clears keyboard strobe and WeeGUI mouse click queue
;
; in: WeeGUI initialized
; out: A,Y preserved
; X clobbered
;------------------------------------------------------------------------------
ClearPendingInput
bit $C010 ; clear keyboard strobe
ldx #WGClearPendingClick ; clear WeeGUI mouse strobe
jmp WeeGUI
;------------------------------------------------------------------------------
; CreateRadio/CreateCheckbox/CreateButton
; creates a WeeGUI UI control with the 'raw title' option set
;
; in: WeeGUI initialized
; stack contains 2 bytes of parameters:
; +1 [word] pointer to WeeGUI view configuration block
; out: $00/$01 clobbered
; all registers clobbered
;------------------------------------------------------------------------------
CreateRadio
ldx #WGCreateRadio
+HIDE_NEXT_2_BYTES
CreateCheckbox
ldx #WGCreateCheckbox
+HIDE_NEXT_2_BYTES
CreateButton
ldx #WGCreateButton
stx @type
+PARAMS_ON_STACK 2
+LDPARAM 1
+STAY PARAM0
@type=*+1
ldx #$FD ; SMC
jsr WeeGUI
ldx #WGViewSetRawTitle
lda #1
sta PARAM0
jmp WeeGUI
;------------------------------------------------------------------------------
; CreateDialog
; creates a WeeGUI decorated frame view
;
; in: WeeGUI initialized
; stack contains 4 bytes of parameters:
; +1 [word] address of WeeGUI view configuration block for frame
; +3 [word] address of null-terminated string for frame title
; out: $00/$01 clobbered
; all registers clobbered
;------------------------------------------------------------------------------
CreateDialog
+PARAMS_ON_STACK 4
+LDPARAM 1
+STAY PARAM0
ldx #WGCreateView ; create frame
jsr WeeGUI
+LDPARAM 3
+STAY PARAM0
ldx #WGViewSetTitle ; set frame title
jmp WeeGUI
;------------------------------------------------------------------------------
; PaintTitleBar
; paints the title bar on the top line
;
; in: WeeGUI initialized
; out: all registers and flags clobbered
;------------------------------------------------------------------------------
PaintTitleBar
ldy #79
- sty PARAM0
stz PARAM1
ldx #WGSetGlobalCursor
jsr WeeGUI
ldx #WGPlot
lda kStringGlobalTitle,y
jsr WeeGUI
dey
bpl -
ldx #WGSyncGlobalCursor
jmp WeeGUI
kStringGlobalTitle
!raw " "
!byte 16 ; inverse P
!raw "itch "
!byte 4 ; inverse D
!raw "ark ",0
;------------------------------------------------------------------------------
; PrintAt
; print a null-terminated string at a specified position
;
; in: WeeGUI initialized
; stack contains 4 bytes of parameters:
; +1 [byte] X coordinate (relative to selected view)
; +2 [byte] Y coordinate (relative to selected view)
; +3 [word] address of null-terminated string
; out: WeeGUI local cursor positioned after string
; $00/$01 clobbered
; all registers and flags clobbered
;------------------------------------------------------------------------------
PrintAt
+PARAMS_ON_STACK 4
+LDPARAM 1
+STAY PARAM0
ldx #WGSetCursor
jsr WeeGUI
+LDPARAM 3
+STAY PARAM0
ldx #WGPrint
jmp WeeGUI
;------------------------------------------------------------------------------
; SimulateClick
; focus, activate, and unfocus a WeeGUI view
; note: does *not* select the view first, which you may or may not wish to do
; before calling
;
; in: WeeGUI initialized
; A contains WeeGUI view ID
; out: X clobbered
;------------------------------------------------------------------------------
SimulateClick
ldx #WGViewFocus
jsr WeeGUI
ldx #WGViewFocusAction
jsr WeeGUI
ldx #WGViewUnfocus
jmp WeeGUI
;------------------------------------------------------------------------------
; GetCheckedRadioButton
; determine which radio button on screen is visually checked
; WeeGUI only supports a single radio group, so there is only ever one
; selected radio button.
; WeeGUI has no way to query the type of a view, so this function takes the
; lower and upper IDs and all views within that range are presumed to be
; radio buttons.
; WeeGUI has no way to query if a view is in use, so all views within the
; given range are presumed to exist and be initialized properly.
;
; in: WeeGUI initialized
; A contains WeeGUI view ID of first radio button
; Y contains 1 greater than the WeeGUI view ID of last radio button
; out: C clear -> A contains WeeGUI view ID of selected radio button
; C set -> error, there is no selected radio button
; all other registers and flags clobbered
;------------------------------------------------------------------------------
GetCheckedRadioButton
sty @max
- pha
ldx #WGSelectView
jsr WeeGUI
ldx #WGGetState
jsr WeeGUI
lda PARAM0
and #1
bne @found
pla
inc
@max=*+1
cmp #$FD ; SMC
bcc -
+HIDE_NEXT_2_BYTES
@found pla
clc
rts
;------------------------------------------------------------------------------
; CreateNullTerminatedString
; Copy a length-prefixed string to kNullTerminatedBuffer and null-terminate it.
; Destination string is left-padded with a single space because reasons.
; Maximum length is 127 bytes.
;
; in: A/Y contains address of length-prefixed string to copy
; X contains length of null-terminated string -- if > length of source,
; remaining buffer will be padded with spaces (#$A0)
; out: X preserved
; all other registers and flags clobbered
; $00/$01 clobbered
;------------------------------------------------------------------------------
CreateNullTerminatedString
+STAY $00
phx
lda #$A0
- dex
sta kNullTerminatedBuffer,x
bpl -
plx
lda #$00
sta kNullTerminatedBuffer,x
lda ($00)
tay
- lda ($00),y
sta kNullTerminatedBuffer,y
dey
bne -
rts