more work on gui code.
This commit is contained in:
@@ -50,17 +50,18 @@
|
||||
|
||||
|
||||
|
||||
.equ WID_OPTIONS1_BIT_DIRTY = 0
|
||||
.equ WID_OPTIONS1_BIT_LAYOUT = 1
|
||||
.equ WID_OPTIONS0_BIT_VISIBLE = 0 ; OBJ_OFFS_OPTIONS
|
||||
.equ WID_OPTIONS0_BIT_DIRTY = 1
|
||||
.equ WID_OPTIONS0_BIT_LAYOUT = 2
|
||||
|
||||
.equ WID_OPTIONS1_BIT_STRETCH_X = 2
|
||||
.equ WID_OPTIONS1_BIT_STRETCH_Y = 3
|
||||
.equ WID_OPTIONS1_BIT_STRETCH_X = 0 ; WID_OFFS_OPTIONS1
|
||||
.equ WID_OPTIONS1_BIT_STRETCH_Y = 1
|
||||
|
||||
.equ WID_OPTIONS1_BIT_ALIGN_RIGHT = 4
|
||||
.equ WID_OPTIONS1_BIT_ALIGN_BOTTOM = 5
|
||||
.equ WID_OPTIONS1_BIT_ALIGN_RIGHT = 2
|
||||
.equ WID_OPTIONS1_BIT_ALIGN_BOTTOM = 3
|
||||
|
||||
.equ WID_OPTIONS1_BIT_EQUAL_WIDTH = 6
|
||||
.equ WID_OPTIONS1_BIT_EQUAL_HEIGHT = 7
|
||||
.equ WID_OPTIONS1_BIT_EQUAL_WIDTH = 4
|
||||
.equ WID_OPTIONS1_BIT_EQUAL_HEIGHT = 5
|
||||
|
||||
|
||||
; Signals
|
||||
@@ -73,7 +74,7 @@
|
||||
|
||||
.equ WID_SIGNAL_SHOW = OBJ_SIGNAL_NEXTFREE
|
||||
.equ WID_SIGNAL_HIDE = OBJ_SIGNAL_NEXTFREE+1
|
||||
.equ WID_SIGNAL_UPDATE = OBJ_SIGNAL_NEXTFREE+2
|
||||
.equ WID_SIGNAL_DRAW = OBJ_SIGNAL_NEXTFREE+2
|
||||
.equ WID_SIGNAL_LAYOUT = OBJ_SIGNAL_NEXTFREE+3
|
||||
.equ WID_SIGNAL_TOUCH = OBJ_SIGNAL_NEXTFREE+4
|
||||
.equ WID_SIGNAL_MOUSE = OBJ_SIGNAL_NEXTFREE+5
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
; @routine OBJ_Init @global
|
||||
;
|
||||
; @param Y pointer to object SRAM
|
||||
; @param Z pointer to handler function (word address)
|
||||
; @param r17 options
|
||||
; @clobbers X
|
||||
|
||||
@@ -25,14 +24,54 @@ OBJ_Init:
|
||||
rcall Utils_FillSram ; (R17, X)
|
||||
rcall Tree_InitObject ; (R16)
|
||||
pop r17
|
||||
std Y+OBJ_OFFS_HANDLERFN_LO, zl
|
||||
std Y+OBJ_OFFS_HANDLERFN_HI, zh
|
||||
std Y+OBJ_OFFS_OPTIONS, r17
|
||||
ldi r16, LOW(OBJ_DefaultHandler)
|
||||
std Y+OBJ_OFFS_HANDLERFN_LO, r16
|
||||
ldi r16, HIGH(OBJ_DefaultHandler)
|
||||
std Y+OBJ_OFFS_HANDLERFN_HI, r16
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine OBJ_SetHandler @global
|
||||
;
|
||||
; @param Y pointer to object SRAM
|
||||
; @param Z pointer to handler function (word address)
|
||||
; @clobbers X
|
||||
|
||||
OBJ_SetHandler:
|
||||
std Y+OBJ_OFFS_HANDLERFN_LO, zl
|
||||
std Y+OBJ_OFFS_HANDLERFN_HI, zh
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine OBJ_GetHandler @global
|
||||
;
|
||||
; @param Y pointer to object SRAM
|
||||
; @return Z pointer to handler function (word address)
|
||||
; @clobbers none
|
||||
|
||||
OBJ_GetHandler:
|
||||
ldd zl, Y+OBJ_OFFS_HANDLERFN_LO
|
||||
ldd zh, Y+OBJ_OFFS_HANDLERFN_HI
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
OBJ_DefaultHandler:
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine OBJ_free @global
|
||||
;
|
||||
@@ -43,14 +82,14 @@ OBJ_free:
|
||||
; free children
|
||||
push yl
|
||||
push yh
|
||||
rcall Tree_GetFirstChildObject
|
||||
rcall Tree_GetFirstChildObject ; (none)
|
||||
OBJ_free_loop:
|
||||
mov r16, xl
|
||||
or r16, xh
|
||||
breq OBJ_free_loopEnd
|
||||
mov yl, xl
|
||||
mov yh, xh
|
||||
rcall List_GetNextObject
|
||||
rcall Tree_GetNextSibling
|
||||
push xl ; next
|
||||
push xh ; next
|
||||
rcall OBJ_free
|
||||
@@ -61,7 +100,7 @@ OBJ_free_loopEnd:
|
||||
pop yh
|
||||
pop yl
|
||||
|
||||
rcall Tree_UnlinkObject
|
||||
rcall Tree_UnlinkObject ; (r16, r17, x)
|
||||
|
||||
push yl
|
||||
push yh
|
||||
@@ -102,6 +141,55 @@ OBJ_Handler:
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine OBJ_ForwardSignalToChildren
|
||||
;
|
||||
; Signal handler for an object. A signal can have up to 3 parameters
|
||||
; conveyed in registers R18, R19 and X.
|
||||
;
|
||||
; @param Y pointer to object SRAM
|
||||
; @param r16 signal
|
||||
; @param R18 1st param
|
||||
; @param R19 2nd param
|
||||
; @param X 3rd param
|
||||
; @clobbers any, !r16, !r18, !r19, !Y
|
||||
|
||||
OBJ_ForwardSignalToChildren:
|
||||
push yl
|
||||
push yh
|
||||
rcall Tree_GetFirstChildObject ; (none)
|
||||
OBJ_ForwardSignalToChildren_loop:
|
||||
clc
|
||||
mov r17, xl
|
||||
or r17, xh
|
||||
breq OBJ_ForwardSignalToChildren_loopEnd
|
||||
mov yl, xl
|
||||
mov yh, xh
|
||||
push r16
|
||||
push r18
|
||||
push r19
|
||||
push xl
|
||||
push xh
|
||||
push yl
|
||||
push yh
|
||||
rcall OBJ_Handler
|
||||
pop yh
|
||||
pop yl
|
||||
pop xh
|
||||
pop xl
|
||||
pop r19
|
||||
pop r18
|
||||
pop r16
|
||||
rcall Tree_GetNextSibling
|
||||
rjmp OBJ_ForwardSignalToChildren_loop
|
||||
OBJ_ForwardSignalToChildren_loopEnd:
|
||||
pop yh
|
||||
pop yl
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine OBJ_EmitSignal
|
||||
;
|
||||
@@ -119,11 +207,11 @@ OBJ_EmitSignal:
|
||||
mov yl, r17
|
||||
OBJ_EmitSignal_loop:
|
||||
push r16
|
||||
rcall objCheckEmitSignalForLink
|
||||
rcall objCheckEmitSignalForLink ; (any, !X, !Y, !R18, !R19)
|
||||
pop r16
|
||||
push xl
|
||||
push xh
|
||||
rcall List_GetNextObject ; (any, !X, !Y, !R18, !R19)
|
||||
rcall List_GetNextObject ; (none)
|
||||
mov yl, xl
|
||||
mov yh, xh
|
||||
pop xh
|
||||
|
||||
@@ -8,14 +8,154 @@
|
||||
; ***************************************************************************
|
||||
|
||||
|
||||
; ***************************************************************************
|
||||
; defs
|
||||
|
||||
.equ WID_WIDGET_INTER_BORDER = 1
|
||||
|
||||
|
||||
|
||||
; ***************************************************************************
|
||||
; code
|
||||
|
||||
.cseg
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine WID_Widget_new @global
|
||||
;
|
||||
; @param Y pointer to window SRAM
|
||||
; @param X pointer to parent
|
||||
; @param r18 WID_OFFS_OPTIONS1
|
||||
; @param r19 WID_OFFS_OPTIONS2
|
||||
|
||||
WID_Widget_Init:
|
||||
push r18
|
||||
push r19
|
||||
push xl
|
||||
push xh
|
||||
ldi zl, LOW(WID_Widget_Handler)
|
||||
ldi zh, HIGH(WID_Widget_Handler)
|
||||
clr r17
|
||||
rcall OBJ_Init
|
||||
pop xh
|
||||
pop xl
|
||||
pop r19
|
||||
pop r18
|
||||
std Y+WID_OFFS_OPTIONS1, r18
|
||||
std Y+WID_OFFS_OPTIONS2, r19
|
||||
mov r16, xl
|
||||
or r16, xh
|
||||
breq WID_Widget_noParent
|
||||
; copy defaults from parent
|
||||
adiw xh:xl, WID_OFFS_BG_COL_LO
|
||||
ld r16, X+ ; WID_OFFS_BG_COL_LO
|
||||
std Y+WID_OFFS_BG_COL_LO, r16
|
||||
ld r16, X+ ; WID_OFFS_BG_COL_HI
|
||||
std Y+WID_OFFS_BG_COL_HI, r16
|
||||
ld r16, X+ ; WID_OFFS_FG_COL_LO
|
||||
std Y+WID_OFFS_FG_COL_LO, r16
|
||||
ld r16, X+ ; WID_OFFS_FG_COL_HI
|
||||
std Y+WID_OFFS_FG_COL_HI, r16
|
||||
ld r16, X+ ; WID_OFFS_FONT_LO
|
||||
std Y+WID_OFFS_FONT_LO, r16
|
||||
ld r16, X+ ; WID_OFFS_FONT_HI
|
||||
std Y+WID_OFFS_FONT_HI, r16
|
||||
rjmp WID_Widget_end
|
||||
WID_Widget_noParent: ; preset without parent
|
||||
clr r16
|
||||
std Y+WID_OFFS_FONT_LO, r16
|
||||
std Y+WID_OFFS_FONT_HI, r16
|
||||
|
||||
std Y+WID_OFFS_FG_COL_LO, r16 ; foreground black
|
||||
std Y+WID_OFFS_FG_COL_HI, r16
|
||||
dec r16
|
||||
std Y+WID_OFFS_BG_COL_LO, r16 ; background white
|
||||
std Y+WID_OFFS_BG_COL_HI, r16
|
||||
|
||||
ldi r16, 2 ; default borders
|
||||
std Y+WID_OFFS_BORDER_TOP, r16
|
||||
std Y+WID_OFFS_BORDER_BOT, r16
|
||||
std Y+WID_OFFS_BORDER_LEFT, r16
|
||||
std Y+WID_OFFS_BORDER_RIGHT, r16
|
||||
WID_Widget_end:
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine WID_Widget_Handler
|
||||
;
|
||||
; Signal handler for an object. A signal can have up to 3 parameters
|
||||
; conveyed in registers R18, R19 and X.
|
||||
;
|
||||
; @param Y pointer to object SRAM
|
||||
; @param r16 signal
|
||||
; @param R18 1st param
|
||||
; @param R19 2nd param
|
||||
; @param X 3rd param
|
||||
; @clobbers any, !Y
|
||||
|
||||
WID_Widget_Handler:
|
||||
cpi r16, WID_SIGNAL_GETMINSIZE
|
||||
breq WID_Widget_Handler_getMinSize
|
||||
; for now just forward signal to all children
|
||||
WID_Widget_Handler_forward:
|
||||
rcall OBJ_ForwardSignalToChildren
|
||||
ret
|
||||
WID_Widget_Handler_getMinSize:
|
||||
rjmp widgetGetMinSize
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine widgetGetMinSize
|
||||
;
|
||||
; @return r18 minimum width of widget
|
||||
; @return r19 minimum height of widget
|
||||
; @clobbers any, !Y
|
||||
|
||||
widgetGetMinSize:
|
||||
push yl
|
||||
push yh
|
||||
rcall Tree_GetFirstChildObject ; (none)
|
||||
clr r20
|
||||
clr r21
|
||||
widgetGetMinSize_loop:
|
||||
mov r17, xl
|
||||
or r17, xh
|
||||
breq widgetGetMinSize_loopEnd
|
||||
mov yl, xl
|
||||
mov yh, yl
|
||||
push r20
|
||||
push r21
|
||||
ldi r16, WID_SIGNAL_GETMINSIZE
|
||||
ldi r18, 1 ; default value for when the signal is not handled
|
||||
ldi r19, 1 ; default value for when the signal is not handled
|
||||
rcall OBJ_Handler ; ask child for its minimum size
|
||||
pop r21
|
||||
pop r20
|
||||
add r20, r18 ; TODO: handle carry later
|
||||
subi r20, -WID_WIDGET_INTER_BORDER
|
||||
add r21, r19 ; TODO: handle carry later
|
||||
subi r21, -WID_WIDGET_INTER_BORDER
|
||||
rcall Tree_GetNextSibling ; (none)
|
||||
rjmp widgetGetMinSize_loop
|
||||
widgetGetMinSize_loopEnd:
|
||||
mov r18, r20
|
||||
mov r19, r21
|
||||
pop yh
|
||||
pop yl
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user