A2osX/LIB/LIBGUI.S.MENU.txt
2020-10-20 08:01:04 +02:00

878 lines
14 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

NEW
AUTO 3,1
*--------------------------------------
MENU.MBarInit >STYA ZPMENUPtr
>STYA ZPPtr1
ldy #S.MBAR.S
lda (ZPPtr1),y
bmi .80
stz DX
stz DX+1
.1 lda (ZPPtr1)
beq .8
lda #S.MBAR.TEXT
clc
adc ZPPtr1
tay
lda ZPPtr1+1
adc #0
ldx hSYSFONB
jsr FON.GetTextSize
ldy #S.MBAR.X1
lda DX
sta (ZPPtr1),y
iny
lda DX+1
sta (ZPPtr1),y
iny #S.MBAR.XT
lda DX
clc
adc PREFS.MBARXMARGIN
sta DX
sta (ZPPtr1),y
iny
lda DX+1
adc #0
sta DX+1
sta (ZPPtr1),y
lda DX
clc
adc CB.CACHE+S.CB.SrcW
sta DX
lda DX+1
adc CB.CACHE+S.CB.SrcW+1
sta DX+1
iny #S.MBAR.X2
lda DX
clc
adc PREFS.MBARXMARGIN
sta DX
sta (ZPPtr1),y
iny
lda DX+1
adc #0
sta DX+1
sta (ZPPtr1),y
lda (ZPPtr1)
clc
adc ZPPtr1
sta ZPPtr1
bcc .1
inc ZPPtr1+1
bra .1
.8 lda #$80
ldy #S.MBAR.S
sta (ZPMENUPtr),y
.80 clc
rts
*--------------------------------------
* MENU.New(int X, int Y, *S.RECT parent *S.MITEM mitems)
*--------------------------------------
MENU.New ldy MENU.Stack.Top
cpy #MENU.MAX
bcc .10
jmp .90
.10 >LDYAI S.MENU
>SYSCALL2 getmem
bcs .99
>STYA ZPMENUPtr
txa hMenu
ldx MENU.Stack.Top
sta MENU.Stack,x
lda #S.OBJ.T.MENU
sta (ZPMENUPtr) S.OBJ.T
lda #0
ldy #S.MENU-1
.1 sta (ZPMENUPtr),y
dey
bne .1
>PULLA
ldy #S.MENU.MITEMS
sta (ZPMENUPtr),y
>PULLA
iny
sta (ZPMENUPtr),y
>PULLW ZPRECTPtr Parent RECT
>PULLA
ldy #S.OBJ.Y1
sta (ZPMENUPtr),y
>PULLA
iny
sta (ZPMENUPtr),y
>PULLA
ldy #S.OBJ.X1
sta (ZPMENUPtr),y
>PULLA
iny
sta (ZPMENUPtr),y
lda ZPMENUPtr
clc
adc #S.MENU.pX1
sta ZPPtr1
lda ZPMENUPtr+1
adc /S.MENU.pX1
sta ZPPtr1+1
ldy #S.RECT-1
.3 lda (ZPRECTPtr),y
sta (ZPPtr1),y
dey
bpl .3
jsr MENU.SetMenuSizePos
ldx MENU.Stack.Top
lda MENU.Stack,x
inc MENU.Stack.Top
clc
rts
.90 lda #E.OOH
sec
.99 >POP 8
MENU.New.RTS rts
*--------------------------------------
* hMENU8, ItemID8, Prop8, Value16
*--------------------------------------
MENU.SetMItemProp
ldy #4
lda (pStack),y hMENU
>SYSCALL2 GetMemPtr
>STYA ZPMENUPtr
bra .7
jsr MENU.GetMItems
.1 lda (ZPPtr1)
beq .8
ldy #S.MITEM.F
lda (ZPPtr1),y
cmp #S.MITEM.F.SEP
beq .2
ldy #S.MITEM.ID
lda (ZPPtr1),y
ldy #3 ID8
cmp (pStack),y
beq .7
.2 jsr MENU.NextMItem
bra .1
.7 ldy #2 Prop8
lda (pStack),y
tay
>PULLA Value16
sta (ZPPtr1),y
iny
>PULLA
sta (ZPPtr1),y
.8 >RET 3
* ----------------------------------------------
* |Icon ChkMrk "Menu Item" KEYMOD1-KEYMOD2-KEY>|
* ----------------------------------------------
MENU.Show >SYSCALL2 GetMemPtr
>STYA ZPMENUPtr
jsr MENU.Save
bcs .9
jsr GetCBBuf
bcs .9
jsr MENU.ShowBorders
jsr MENU.GetMItems
jsr MENU.GetDYW
.6 lda (ZPPtr1)
beq .8
jsr MENU.GetDX
jsr MENU.ShowMItem
jsr MENU.NextMItem
bra .6
.8 >LDYA L.WND.Screen
jmp DrawCBPtrToYA1
.9 rts
*--------------------------------------
MENU.Enter jsr MENU.GetDX
jsr MENU.GetDYW
lda Counter W
clc
adc DX
sta IE IE = X2
lda Counter+1
adc DX+1
sta IE+1
jsr MENU.GetMItems
.1 lda (ZPPtr1)
beq .9
ldy #S.MITEM.F
lda (ZPPtr1),y
cmp #S.MITEM.F.SEP
beq .7
lda DY
sec
adc SYSFON.H
sta INE INE = Y2
lda DY+1
adc #0
sta INE+1
>LDYAI DX
jsr MOU.InRectYA
bcs .7
ldy #S.MITEM.ID
lda (ZPPtr1),y
ldy #S.MENU.Selected
sta (ZPMENUPtr),y
jsr GetCBBuf
jsr MENU.ShowMItem1
>LDYA L.WND.Screen
jmp DrawCBPtrToYA1
.7 jsr MENU.NextMItem
bra .1
.9 rts
*--------------------------------------
MENU.SetMenuSizePos
stz IY Icon Margin W
stz IE Max Text W
stz IE+1
stz INE Max Mod-Key W
lda #2 2px Borders
sta DY Menu H
stz DY+1
jsr MENU.GetMItems
.1 lda (ZPPtr1)
beq .3
jsr MENU.GetMItemW
jsr MENU.NextMItem
bra .1
.3 lda #2+MENU.LMargin+MENU.RMargin 2px Borders+5 LMARGIN (Checked) +5 RMARGIN (SubMenu)
clc
adc IY Icon W
sta DX
stz DX+1
lda DX
sec 1px sep
adc IE Max Text W
sta DX
lda DX+1
adc IE+1
sta DX+1
lda DX
sec 1px sep
adc INE Max Mod-Key W
sta DX
bcc .4
inc DX+1
.4 ldy #S.OBJ.W
sta (ZPMENUPtr),y
iny
lda DX+1
sta (ZPMENUPtr),y
iny #S.OBJ.H
lda DY
sta (ZPMENUPtr),y
iny
lda DY+1
sta (ZPMENUPtr),y
ldy #S.MENU.tOffset
lda IY
sta (ZPMENUPtr),y
iny #S.MENU.kOffset
lda IE
sta (ZPMENUPtr),y
iny
lda IE+1
sta (ZPMENUPtr),y
iny #S.MENU.rOffset
lda INE
sta (ZPMENUPtr),y
iny
lda INE+1
sta (ZPMENUPtr),y
ldy #S.OBJ.Y1
lda DY
clc
adc (ZPMENUPtr),y
tax
iny
lda DY+1
adc (ZPMENUPtr),y
cpx WND.Screen+S.OBJ.H
sbc WND.Screen+S.OBJ.H+1
bcc .5
ldy #S.OBJ.Y1
lda (ZPMENUPtr),y
* sec
sbc DY
sta (ZPMENUPtr),y
iny
lda (ZPMENUPtr),y
sbc DY+1
sta (ZPMENUPtr),y
.5 >LDYA ZPMENUPtr
jsr OBJ.SetX2Y2
rts
*--------------------------------------
MENU.GetMItemW ldy #S.MITEM.F
lda (ZPPtr1),y
cmp #S.MITEM.F.SEP
beq .8
ldy #S.MITEM.pICON
lda (ZPPtr1),y
iny
ora (ZPPtr1),y
beq .1
lda #17 Reserve space for Icon W + 1px SEP
sta IY
.1 jsr MENU.GetText
ldx hSYSFON
jsr FON.GetTextSize
ldx CB.Cache+S.CB.SrcW
cpx IE
lda CB.Cache+S.CB.SrcW+1
sbc IE+1
bcc .2
stx IE Set Max text W
lda CB.Cache+S.CB.SrcW+1
sta IE+1
.2 jsr MENU.GetKeyString
beq .8
ldx hSYSFON
jsr FON.GetTextSize
lda CB.Cache+S.CB.SrcW
cmp INE
bcc .8
sta INE set Max Mod-key W
.8 rts
*--------------------------------------
MENU.ShowBorders
lda #S.CB.CMD.HLINE
jsr CB.InitCacheA
lda #S.CB.OP.SET
sta CB.Cache+S.CB.OP
lda #S.CB.M.MONO
sta CB.Cache+S.CB.M
lda PREFS.BORDERCOLOR
sta CB.Cache+S.CB.COLOR
ldy #S.OBJ.X2+1
ldx #5
.1 lda (ZPMENUPtr),y
sta CB.Cache+S.CB.X1,x
dey
dex
bpl .1
lda CB.Cache+S.CB.Y1
sta CB.Cache+S.CB.Y2
lda CB.Cache+S.CB.Y1+1
sta CB.Cache+S.CB.Y2+1 top X1,Y1,X2,Y1
jsr PutCBCache2CBBuf
ldy #S.OBJ.Y2
lda (ZPMENUPtr),y
sta CB.Cache+S.CB.Y1
sta CB.Cache+S.CB.Y2
iny
lda (ZPMENUPtr),y
sta CB.Cache+S.CB.Y1+1
sta CB.Cache+S.CB.Y2+1 bottom X1,Y2,X2,Y2
jmp PutCBCache2CBBuf
*--------------------------------------
MENU.ShowMItem ldy #S.MITEM.F
lda (ZPPtr1),y
cmp #S.MITEM.F.SEP
bne MENU.ShowMItem1
lda #S.CB.CMD.HLINE
jsr CB.InitCacheA
lda #S.CB.OP.SET
sta CB.Cache+S.CB.OP
lda #S.CB.M.MONO
sta CB.Cache+S.CB.M
lda PREFS.BORDERCOLOR
sta CB.Cache+S.CB.COLOR
ldx #3
.1 lda DX,x
sta CB.Cache+S.CB.X1,x
dex
bpl .1
lda DX
clc
adc Counter
sta CB.Cache+S.CB.X2
lda DX+1
adc Counter+1
sta CB.Cache+S.CB.X2+1
jmp PutCBCache2CBBuf
*--------------------------------------
MENU.ShowMItem1 lda #S.CB.CMD.FILLRECT
jsr CB.InitCacheA
lda #S.CB.OP.SET
sta CB.Cache+S.CB.OP
lda #S.CB.M.MONO
sta CB.Cache+S.CB.M
ldy #S.MENU.Selected
lda (ZPMENUPtr),y
ldx PREFS.MENUCOLOR
ldy #S.MITEM.ID
eor (ZPPtr1),y
bne .15
txa
eor #C.WHITE
tax
.15 stx CB.Cache+S.CB.COLOR
ldx #3
.10 lda DX,x
sta CB.Cache+S.CB.X1,x
dex
bpl .10
lda DX
clc
adc Counter
sta CB.Cache+S.CB.X2
lda DX+1
adc Counter+1
sta CB.Cache+S.CB.X2+1
lda DY
sec
adc SYSFON.H
sta CB.Cache+S.CB.Y2
lda DY+1
adc #0
sta CB.Cache+S.CB.Y2+1
jsr PutCBCache2CBBuf
inc DY
bne .12
inc DY+1
.12 lda DX
clc
adc #MENU.LMargin TODO : Checked
sta DX
bcc .11
sta DX+1
.11 jsr MENU.GetIcon
beq .2
jsr DRAW.YABMAtDXDY
.2 lda DX
clc
ldy #S.MENU.tOffset
adc (ZPPtr1),y
sta DX
bcc .21
inc DX+1
.21 jsr MENU.GetText
ldx hSYSFON
jsr DRAW.YATextAtDXDY
lda DX
sec
ldy #S.MENU.tOffset
adc (ZPPtr1),y
sta DX
lda DX+1
iny
adc (ZPPtr1),y
sta DX+1
jsr MENU.GetKeyString
beq .3
ldx hSYSFON
jsr DRAW.YATextAtDXDY
.3 ldy #S.MITEM.F
lda (ZPPtr1),y
cmp #S.MITEM.F.SUBMENU
bne .8
lda DX
sec
ldy #S.MENU.rOffset
adc (ZPPtr1),y
sta DX
lda DX+1
iny
adc (ZPPtr1),y
sta DX+1
ldx #BM.ID.RIGHT
>LDYA L.BMs,x
jsr DRAW.YABMAtDXDY
.8 lda DY
bne .80
dec DY+1
.80 dec DY
clc
rts
*--------------------------------------
MENU.GetIcon ldy #S.MITEM.pICON+1
lda (ZPPtr1),y
bne .1
dey
lda (ZPPtr1),y
beq .8
tax
ldy L.BMs,x
lda L.BMs+1,x NON ZERO
.8 rts
.1 pha
dey
lda (ZPPtr1),y
tay
pla NON ZERO
rts
*--------------------------------------
MENU.GetText lda #S.MITEM.TEXT
clc
adc ZPPtr1
tay
lda ZPPtr1+1
adc #0
rts
*--------------------------------------
MENU.GetKeyString
ldy #S.MITEM.KEYSTR
lda (ZPPtr1),y
beq .8
clc
adc ZPPtr1
tay
lda ZPPtr1+1
adc #0 !0
.8 rts
*--------------------------------------
MENU.Save lda #S.CB.CMD.GETRECTBUFSIZE
jsr CB.InitCacheA
ldy #S.OBJ.X1
ldx #0
.1 lda (ZPMENUPtr),y
sta CB.Cache+S.CB.X1,x
iny
inx
cpx #8 X1,Y1,X2,Y2
bne .1
jsr GFXWrite.CB
>SYSCALL NewStkObj
bcs .9
stx CB.Cache+S.CB.DstPtr
txa
ldy #S.MENU.hSAVEBUF
sta (ZPMENUPtr),y
lda #S.CB.CMD.BITBLT
sta CB.Cache+S.CB.CMD
lda #S.CB.OP.SAVE
sta CB.Cache+S.CB.OP
ldy #S.OBJ.W
ldx #0
.2 lda (ZPMENUPtr),y
sta CB.Cache+S.CB.SrcW,x
iny
inx
cpx #4 W,H
bne .2
jsr GFXWrite.CB
clc
.9 rts
*--------------------------------------
MENU.Destroy ldx MENU.Stack.Top
beq .8
lda MENU.Stack-1,x
>SYSCALL GetMemPtr
>STYA ZPMENUPtr
bit CUR.bVisible
bpl .3
jsr HideCursor.I
.3 jsr CB.ClearCache
lda #S.CB.CMD.BITBLT
sta CB.Cache+S.CB.CMD
lda #S.CB.OP.RESTORE
sta CB.Cache+S.CB.OP
ldy #S.OBJ.X1
ldx #0
.1 lda (ZPMENUPtr),y
sta CB.Cache+S.CB.X1,x
iny
inx
cpx #8 X1,Y1,X2,Y2
bne .1
ldy #S.OBJ.W
ldx #0
.2 lda (ZPMENUPtr),y
sta CB.Cache+S.CB.SrcW,x
iny
inx
cpx #4 W,H
bne .2
ldy #S.MENU.hSAVEBUF
lda (ZPMENUPtr),y
sta CB.Cache+S.CB.DstPtr
jsr GFXWrite.CB
lda CB.Cache+S.CB.DstPtr
>SYSCALL2 FreeStkObj
ldx MENU.Stack.Top
lda MENU.Stack-1,x
>SYSCALL2 FreeMem
dec MENU.Stack.Top
bit CUR.bVisible
bpl .8
jsr ShowCursor.I
.8 clc
rts
*--------------------------------------
MENU.GetDX ldy #S.OBJ.X1
lda (ZPMENUPtr),y
clc
adc #1
sta DX
iny
lda (ZPMENUPtr),y
adc #0
sta DX+1
rts
*--------------------------------------
MENU.GetDYW ldy #S.OBJ.Y1
lda (ZPMENUPtr),y
clc
adc #1
sta DY
iny
lda (ZPMENUPtr),y
adc #0
sta DY+1
ldy #S.OBJ.W
lda (ZPMENUPtr),y
sec
sbc #3 2Px border + correction from W
sta Counter
iny
lda (ZPMENUPtr),y
sbc #0
sta Counter+1
rts
*--------------------------------------
MENU.FindMItemByID
jsr MENU.GetMItems
.1 lda (ZPPtr1)
beq .9
txa
ldy #S.MITEM.ID
cmp (ZPPtr1),y
beq .8
jsr MENU.NextMItem
bra .1
.8 clc
rts
.9 sec
rts
*--------------------------------------
MENU.GetMItems ldy #S.MENU.MITEMS
lda (ZPMENUPtr),y
sta ZPPtr1
iny
lda (ZPMENUPtr),y
sta ZPPtr1+1
rts
*--------------------------------------
MENU.NextMItem ldy #S.MITEM.F
lda (ZPPtr1),y
sec
eor #S.MITEM.F.SEP
beq .1
lda SYSFON.Hp2
clc
.1 adc DY
sta DY
bcc .2
inc DY+1
.2 lda (ZPPtr1)
clc
adc ZPPtr1
sta ZPPtr1
bcc .8
inc ZPPtr1+1
.8 rts
*--------------------------------------
MAN
SAVE usr/src/lib/libgui.s.menu
LOAD usr/src/lib/libgui.s
ASM