205 lines
5.4 KiB
NASM
205 lines
5.4 KiB
NASM
; ***************************************************************************
|
|
; copyright : (C) 2025 by Martin Preuss
|
|
; email : martin@libchipcard.de
|
|
;
|
|
; ***************************************************************************
|
|
; * This file is part of the project "AqHome". *
|
|
; * Please see toplevel file COPYING of that project for license details. *
|
|
; ***************************************************************************
|
|
|
|
|
|
; ***************************************************************************
|
|
; defs
|
|
|
|
.equ WID_WIDGET_INTER_BORDER = 2
|
|
|
|
|
|
|
|
; ***************************************************************************
|
|
; 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_GETMINWIDTH
|
|
breq WID_Widget_Handler_getMinWidth
|
|
cpi r16, WID_SIGNAL_GETMINHEIGHT
|
|
breq WID_Widget_Handler_getMinHeight
|
|
; for now just forward signal to all children
|
|
WID_Widget_Handler_forward:
|
|
rcall OBJ_ForwardSignalToChildren
|
|
ret
|
|
WID_Widget_Handler_getMinWidth:
|
|
rjmp widgetGetMinWidth
|
|
WID_Widget_Handler_getMinHeight:
|
|
rjmp widgetGetMinHeight
|
|
; @end
|
|
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine widgetGetMinWidth
|
|
;
|
|
; @return r19:r18 minimum width of widget
|
|
; @clobbers any, !Y
|
|
|
|
widgetGetMinWidth:
|
|
push yl
|
|
push yh
|
|
rcall Tree_GetFirstChildObject ; (none)
|
|
clr r24
|
|
clr r25
|
|
widgetGetMinWidth_loop:
|
|
mov r17, xl
|
|
or r17, xh
|
|
breq widgetGetMinWidth_loopEnd
|
|
mov yl, xl
|
|
mov yh, yl
|
|
push r24
|
|
push r25
|
|
ldi r16, WID_SIGNAL_GETMINWIDTH
|
|
ldi r18, 1 ; default value for when the signal is not handled
|
|
ldi r19, 0 ; default value for when the signal is not handled
|
|
rcall OBJ_Handler ; ask child for its minimum size
|
|
pop r25
|
|
pop r24
|
|
add r24, r18 ; TODO: handle carry later
|
|
adc r25, r19
|
|
adiw r25:r24, WID_WIDGET_INTER_BORDER
|
|
rcall Tree_GetNextSibling ; (none)
|
|
rjmp widgetGetMinWidth_loop
|
|
widgetGetMinWidth_loopEnd:
|
|
mov r18, r24
|
|
mov r19, r25
|
|
pop yh
|
|
pop yl
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine widgetGetMinHeight
|
|
;
|
|
; @return r19:r18 minimum height of widget
|
|
; @clobbers any, !Y
|
|
|
|
widgetGetMinHeight:
|
|
push yl
|
|
push yh
|
|
rcall Tree_GetFirstChildObject ; (none)
|
|
clr r24
|
|
clr r25
|
|
widgetGetMinHeight_loop:
|
|
mov r17, xl
|
|
or r17, xh
|
|
breq widgetGetMinHeight_loopEnd
|
|
mov yl, xl
|
|
mov yh, yl
|
|
push r24
|
|
push r25
|
|
ldi r16, WID_SIGNAL_GETMINHEIGHT
|
|
ldi r18, 1 ; default value for when the signal is not handled
|
|
ldi r19, 0 ; default value for when the signal is not handled
|
|
rcall OBJ_Handler ; ask child for its minimum size
|
|
pop r25
|
|
pop r24
|
|
add r24, r18 ; TODO: handle carry later
|
|
adc r25, r19
|
|
adiw r25:r24, WID_WIDGET_INTER_BORDER
|
|
rcall Tree_GetNextSibling ; (none)
|
|
rjmp widgetGetMinHeight_loop
|
|
widgetGetMinHeight_loopEnd:
|
|
mov r18, r24
|
|
mov r19, r25
|
|
pop yh
|
|
pop yl
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|