diff --git a/Documentation.md b/Documentation.md
index 99d6af5..3da9904 100644
--- a/Documentation.md
+++ b/Documentation.md
@@ -728,12 +728,12 @@ Not available
-####WGSetValue
-Sets the currently selected view's value. For progress bar views, this is the progress value. For checkboxes, 1 is checked and 0 is unchecked.
+####WGSetState
+Sets the currently selected view's value. For progress bar views, this is the progress value. For checkboxes and radio buttons, 1 is checked and 0 is unchecked.
Assembly | Applesoft |
---|
-X: WGSetValue
+X: WGSetState
A: new value
|
&SETV(value)
@@ -1121,6 +1121,20 @@ X: WGExit
|
+
+
+####WGReset
+Deallocate all WeeGUI views and strings. This is called automatically during WeeGUI startup, but you can call it yourself at any time if you want to "start over" with no views. This does not clear the screen or repaint anything.
+
+
+Assembly | Applesoft |
---|
+X: WGReset
+ |
+Not available
+ |
+
+
+
- - -
@@ -1172,7 +1186,7 @@ Appendix C: Sample Code
Here is the source code to the BASICDEMO program, included in the WeeGUI disk image. It shows how a few simple lines of code can create a complex, sophisticated interface, thanks to WeeGUI.
1 PRINT CHR$ (4)"brun weegui"
- 10 & DESK
+ 10 & HOME(1)
20 & WINDW(0,2,2,15,76,7,76,40)
21 & TITLE("Help")
22 & STACT(2500)
diff --git a/WeeGUI_MLI.s b/WeeGUI_MLI.s
index 1d3bac3..fc614fc 100644
--- a/WeeGUI_MLI.s
+++ b/WeeGUI_MLI.s
@@ -73,4 +73,5 @@ WGSetContentWidth = 78
WGSetContentHeight = 80
WGStrokeRoundRect = 82
WGCreateRadio = 84
+WGReset = 86
diff --git a/views.s b/views.s
index 66108bf..1d02ea6 100644
--- a/views.s
+++ b/views.s
@@ -105,56 +105,9 @@ WGCreateView_done:
; SH: String pointer (MSB)
;
WGCreateCheckbox:
- SAVE_AXY
-
- ldy #0
- lda (PARAM0),y ; Find our new view record
- pha ; Cache view ID so we can select when we're done
-
- asl
- asl
- asl
- asl ; Records are 16 bytes wide
- tax
-
- iny
- lda (PARAM0),y
- sta WG_VIEWRECORDS+0,x ; Screen X
-
- iny
- lda (PARAM0),y
- sta WG_VIEWRECORDS+1,x ; Screen Y
-
- lda #1
- sta WG_VIEWRECORDS+2,x ; Initialize screen width
- sta WG_VIEWRECORDS+3,x ; Initialize screen height
- sta WG_VIEWRECORDS+7,x ; Initialize view width
- sta WG_VIEWRECORDS+8,x ; Initialize view height
-
- lda #VIEW_STYLE_CHECK
- sta WG_VIEWRECORDS+4,x ; Style
-
- stz WG_VIEWRECORDS+5,x ; Initialize scrolling
- stz WG_VIEWRECORDS+6,x
-
- stz WG_VIEWRECORDS+9,x ; Initialize state
- stz WG_VIEWRECORDS+10,x ; Initialize callback
- stz WG_VIEWRECORDS+11,x
-
- iny
- lda (PARAM0),y
- sta WG_VIEWRECORDS+12,x ; Title
- iny
- lda (PARAM0),y
- sta WG_VIEWRECORDS+13,x
-
- pla
- jsr WGSelectView ; Leave this as the active view
-
-WGCreateCheckbox_done:
- RESTORE_AXY
- rts
-
+ pha
+ lda #VIEW_STYLE_CHECK
+ bra WGCreate1x1_common
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WGCreateRadio
@@ -170,59 +123,63 @@ WGCreateCheckbox_done:
; SH: String pointer (MSB)
;
WGCreateRadio:
- SAVE_AXY
+ pha
+ lda #VIEW_STYLE_RADIO
+WGCreate1x1_common:
+ sta WGCreate1x1_style+1
+ SAVE_XY
- ldy #0
- lda (PARAM0),y ; Find our new view record
- pha ; Cache view ID so we can select when we're done
+ ldy #0
+ lda (PARAM0),y ; Find our new view record
+ pha ; Cache view ID so we can select when we're done
asl
asl
asl
- asl ; Records are 16 bytes wide
+ asl ; Records are 16 bytes wide
tax
iny
- lda (PARAM0),y
- sta WG_VIEWRECORDS+0,x ; Screen X
+ lda (PARAM0),y
+ sta WG_VIEWRECORDS+0,x ; Screen X
iny
- lda (PARAM0),y
- sta WG_VIEWRECORDS+1,x ; Screen Y
+ lda (PARAM0),y
+ sta WG_VIEWRECORDS+1,x ; Screen Y
- lda #1
- sta WG_VIEWRECORDS+2,x ; Initialize screen width
- sta WG_VIEWRECORDS+3,x ; Initialize screen height
- sta WG_VIEWRECORDS+7,x ; Initialize view width
- sta WG_VIEWRECORDS+8,x ; Initialize view height
+ lda #1
+ sta WG_VIEWRECORDS+2,x ; Initialize screen width
+ sta WG_VIEWRECORDS+3,x ; Initialize screen height
+ sta WG_VIEWRECORDS+7,x ; Initialize view width
+ sta WG_VIEWRECORDS+8,x ; Initialize view height
- lda #VIEW_STYLE_RADIO
- sta WG_VIEWRECORDS+4,x ; Style
+WGCreate1x1_style:
+ lda #$FF ; Self-modifying code!
+ sta WG_VIEWRECORDS+4,x ; Style
- stz WG_VIEWRECORDS+5,x ; Initialize scrolling
- stz WG_VIEWRECORDS+6,x
+ stz WG_VIEWRECORDS+5,x ; Initialize scrolling
+ stz WG_VIEWRECORDS+6,x
- stz WG_VIEWRECORDS+9,x ; Initialize state
- stz WG_VIEWRECORDS+10,x ; Initialize callback
- stz WG_VIEWRECORDS+11,x
+ stz WG_VIEWRECORDS+9,x ; Initialize state
+ stz WG_VIEWRECORDS+10,x ; Initialize callback
+ stz WG_VIEWRECORDS+11,x
iny
- lda (PARAM0),y
- sta WG_VIEWRECORDS+12,x ; Title
+ lda (PARAM0),y
+ sta WG_VIEWRECORDS+12,x ; Title
iny
- lda (PARAM0),y
- sta WG_VIEWRECORDS+13,x
+ lda (PARAM0),y
+ sta WG_VIEWRECORDS+13,x
pla
- jsr WGSelectView ; Leave this as the active view
+ jsr WGSelectView ; Leave this as the active view
-WGCreateRadio_done:
- RESTORE_AXY
+ RESTORE_XY
+ pla
rts
-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WGCreateProgress
; Creates a new progress bar
@@ -530,28 +487,23 @@ paintCheck_plot: ; Paint our state
lda WG_VIEWRECORDS+13,y
sta PARAM1
- lda WG_VIEWRECORDS+4,y ; Raw or Apple format title?
- ldy #0
+ lda WG_VIEWRECORDS+4,y ; Raw or Apple format title?
and #VIEW_STYLE_RAWTITLE
- bne paintCheck_titleRawLoop
+ asl
+ eor #$80 ; becomes #$80 for Apple format, 0 for raw
+ sta paintCheck_mask+1
+ ldy #0
paintCheck_titleLoop:
lda (PARAM0),y
beq paintCheck_done
- ora #$80
+paintCheck_mask:
+ ora #$FF ; Self-modifying code!
jsr WGPlot
inc WG_CURSORX
iny
bra paintCheck_titleLoop
-paintCheck_titleRawLoop:
- lda (PARAM0),y
- beq paintCheck_done
- jsr WGPlot
- inc WG_CURSORX
- iny
- bra paintCheck_titleRawLoop
-
paintCheck_done:
rts
@@ -714,29 +666,23 @@ paintWindowTitle_compute:
dec
sta WG_CURSORY
- ldy #0
-
lda WG_VIEWRECORDS+4,y ; Raw or Apple format title?
and #VIEW_STYLE_RAWTITLE
- bne paintWindowTitleRawLoop
+ asl
+ eor #$80 ; becomes #$80 for Apple format, 0 for raw
+ sta paintWindowTitle_mask
+ ldy #0
paintWindowTitleLoop:
lda (PARAM0),y
beq paintWindowTitle_done
- ora #$80
+paintWindowTitle_mask:
+ ora #$FF ; Self-modifying code!
jsr WGPlot ; Draw the character
iny
inc WG_CURSORX ; Advance cursors
bra paintWindowTitleLoop
-paintWindowTitleRawLoop:
- lda (PARAM0),y
- beq paintWindowTitle_done
- jsr WGPlot ; Draw the character
- iny
- inc WG_CURSORX ; Advance cursors
- bra paintWindowTitleRawLoop
-
paintWindowTitle_done:
rts
diff --git a/weegui.dsk b/weegui.dsk
index a7913c1..1fed67d 100644
Binary files a/weegui.dsk and b/weegui.dsk differ
diff --git a/weegui.s b/weegui.s
index 64133d1..7f5d04b 100644
--- a/weegui.s
+++ b/weegui.s
@@ -76,6 +76,7 @@ WGEntryPointTable:
.addr WGSetContentHeight
.addr WGStrokeRoundRect
.addr WGCreateRadio
+.addr WGReset
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -91,10 +92,24 @@ WGInit:
; sta LINNUML
; jsr SETHI
- jsr WG80 ; Enter 80-col text mode
- jsr WGInitApplesoft ; Set up Applesoft API
+ jsr WG80 ; Enter 80-col text mode
+ jsr WGInitApplesoft ; Set up Applesoft API
- ldy #15 ; Clear our block allocators
+ RESTORE_AXY
+
+ jmp WGReset
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; WGReset
+; Reset views and strings. Called from WGInit during app startup.
+; Can also be called at any time to "start over" with no views.
+; (Does not clear screen or repaint.)
+;
+WGReset:
+ SAVE_AXY
+
+ ldy #15 ; Clear our block allocators
WGInit_clearMemLoop:
tya
asl
@@ -103,18 +118,18 @@ WGInit_clearMemLoop:
asl
tax
lda #0
- sta WG_STRINGS,x
+ sta WG_VIEWRECORDS+2,x
+ sta WG_STRINGS,x
dey
bpl WGInit_clearMemLoop
- lda #$ff
- sta WG_PENDINGACTIONVIEW
- sta WG_FOCUSVIEW
-
+ lda #$ff
+ sta WG_PENDINGACTIONVIEW
+ sta WG_FOCUSVIEW
+
RESTORE_AXY
rts
-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WGExit
; Cleanup Should be called once at app shutdown