gui2: started working on autolayout.
This commit is contained in:
223
avr/modules/lcd2/gui2/base/layout.asm
Normal file
223
avr/modules/lcd2/gui2/base/layout.asm
Normal file
@@ -0,0 +1,223 @@
|
||||
; ***************************************************************************
|
||||
; copyright : (C) 2026 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. *
|
||||
; ***************************************************************************
|
||||
|
||||
#ifndef AQH_AVR_GUI2_LAYOUT_ASM
|
||||
#define AQH_AVR_GUI2_LAYOUT_ASM
|
||||
|
||||
|
||||
; ***************************************************************************
|
||||
; defines
|
||||
|
||||
|
||||
|
||||
|
||||
; ***************************************************************************
|
||||
; code
|
||||
|
||||
.cseg
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine Layout_SetDefaultWidths
|
||||
;
|
||||
; Set defaultWidth in WIDGET_OFFS_TMP_LO/HI
|
||||
;
|
||||
; @param Y pointer to widget
|
||||
; @clobbers any, !Y
|
||||
|
||||
Layout_SetDefaultWidths:
|
||||
push yl
|
||||
push yh
|
||||
bigcall OBJ_GetFirstChild
|
||||
Layout_SetDefaultWidths_loop:
|
||||
brcc Layout_SetDefaultWidths_ret
|
||||
mov yl, r18
|
||||
mov yh, r19
|
||||
bigcall Widget_GetDefaultWidth
|
||||
std Y+WIDGET_OFFS_TMP_LO, r18
|
||||
std Y+WIDGET_OFFS_TMP_HI, r19
|
||||
rcall OBJ_GetNext
|
||||
rjmp Layout_SetDefaultWidths_loop
|
||||
Layout_SetDefaultWidths_ret:
|
||||
pop yh
|
||||
pop yl
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine Layout_SetDefaultHeights
|
||||
;
|
||||
; @param Y pointer to widget
|
||||
; @clobbers any, !Y
|
||||
|
||||
Layout_SetDefaultHeights:
|
||||
push yl
|
||||
push yh
|
||||
bigcall OBJ_GetFirstChild
|
||||
Layout_SetDefaultHeights_loop:
|
||||
brcc Layout_SetDefaultHeights_ret
|
||||
mov yl, r18
|
||||
mov yh, r19
|
||||
bigcall Widget_GetDefaultHeight
|
||||
std Y+WIDGET_OFFS_TMP_LO, r18
|
||||
std Y+WIDGET_OFFS_TMP_HI, r19
|
||||
rcall OBJ_GetNext
|
||||
rjmp Layout_SetDefaultHeights_loop
|
||||
Layout_SetDefaultHeights_ret:
|
||||
pop yh
|
||||
pop yl
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine Layout_SumTmpValues
|
||||
;
|
||||
; @param Y pointer to widget
|
||||
; @return r19:r18 total width of all child widgets plus space between
|
||||
; @clobbers r16, r17, r18, r19, r20, r21, r22, r23, Z
|
||||
|
||||
Layout_SumTmpValues:
|
||||
ldd zl, Y+WIDGET_OFFS_STYLE_LO
|
||||
ldd zh, Y+WIDGET_OFFS_STYLE_HI
|
||||
|
||||
; get spacing
|
||||
adiw zh:zl, WIDGET_STYLE_OFFS_SPACING
|
||||
lpm r22, Z
|
||||
sbiw zh:zl, WIDGET_STYLE_OFFS_SPACING
|
||||
; get outer border
|
||||
adiw zh:zl, WIDGET_STYLE_OFFS_OUTERBORDERSIZE
|
||||
lpm r23, Z
|
||||
sbiw zh:zl, WIDGET_STYLE_OFFS_OUTERBORDERSIZE
|
||||
; start adding
|
||||
clr r20
|
||||
clr r21
|
||||
push yl
|
||||
push yh
|
||||
bigcall OBJ_GetFirstChild
|
||||
Layout_SumTmpValues_loop:
|
||||
brcc Layout_SumTmpValues_loopEnd
|
||||
mov yl, r18
|
||||
mov yh, r19
|
||||
|
||||
ldd r18, Y+WIDGET_OFFS_TMP_LO
|
||||
ldd r19, Y+WIDGET_OFFS_TMP_HI
|
||||
add r20, r18 ; add widget size
|
||||
adc r21, r19
|
||||
add r20, r22 ; add spacing
|
||||
adc r20, r22
|
||||
sub r20, r22
|
||||
rcall OBJ_GetNext
|
||||
rjmp Layout_SumTmpValues_loop
|
||||
Layout_SumTmpValues_loopEnd:
|
||||
mov r16, r20
|
||||
or r16, r21
|
||||
breq Layout_SumTmpValues_done
|
||||
sub r20, r22 ; sub last spacing
|
||||
sbc r21, r22
|
||||
add r21, r22
|
||||
add r20, r23 ; add outer border (begin)
|
||||
adc r21, r23
|
||||
sub r21, r23
|
||||
add r20, r23 ; add outer border (end)
|
||||
adc r21, r23
|
||||
sub r21, r23
|
||||
Layout_SumTmpValues_done:
|
||||
mov r18, r20
|
||||
mov r19, r21
|
||||
pop yh
|
||||
pop yl
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine Layout_GetMaxTmp
|
||||
;
|
||||
; @param Y pointer to widget
|
||||
; @return r19:r18 maximum value in WIDGET_OFFS_TMP_LO/HI of children
|
||||
; @clobbers any, !Y
|
||||
|
||||
Layout_GetMaxTmp:
|
||||
clr r20
|
||||
clr r21
|
||||
push yl
|
||||
push yh
|
||||
bigcall OBJ_GetFirstChild
|
||||
Layout_GetMaxTmp_loop:
|
||||
brcc Layout_GetMaxTmp_ret
|
||||
mov yl, r18
|
||||
mov yh, r19
|
||||
ldd r18, Y+WIDGET_OFFS_TMP_LO
|
||||
ldd r19, Y+WIDGET_OFFS_TMP_HI
|
||||
; max
|
||||
cp r20, r18
|
||||
cpc r21, r19
|
||||
brcc Layout_GetMaxTmp_next
|
||||
mov r20, r18
|
||||
mov r21, r19
|
||||
Layout_GetMaxTmp_next:
|
||||
rcall OBJ_GetNext
|
||||
rjmp Layout_GetMaxTmp_loop
|
||||
Layout_GetMaxTmp_ret:
|
||||
mov r18, r20
|
||||
mov r19, r21
|
||||
pop yh
|
||||
pop yl
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine Layout_AddToTmpOfFillXChildren
|
||||
;
|
||||
; @param Y pointer to widget
|
||||
; @param R21:R20 value to add to tmp value of expandable widgets
|
||||
; @param r22 mask for OBJECT_OFFS_OPTS_LO (e.g. 1<<WIDGET_OPTSLO_FILLX_BIT)
|
||||
|
||||
Layout_AddToTmpOfFillXChildren:
|
||||
clr r16
|
||||
push yl
|
||||
push yh
|
||||
bigcall OBJ_GetFirstChild
|
||||
Layout_AddToTmpOfFillXChildren_loop:
|
||||
brcc Layout_AddToTmpOfFillXChildren_done
|
||||
mov yl, r18
|
||||
mov yh, r19
|
||||
ldd r17, Y+OBJECT_OFFS_OPTS_LO
|
||||
and r17, r22
|
||||
breq Layout_AddToTmpOfFillXChildren_next
|
||||
ldd r16, Y+WIDGET_OFFS_TMP_LO
|
||||
ldd r17, Y+WIDGET_OFFS_TMP_HI
|
||||
add r16, r20
|
||||
adc r17, r21
|
||||
std Y+WIDGET_OFFS_TMP_LO, r16
|
||||
std Y+WIDGET_OFFS_TMP_HI, r17
|
||||
Layout_AddToTmpOfFillXChildren_next:
|
||||
rcall OBJ_GetNext
|
||||
rjmp Layout_AddToTmpOfFillXChildren_loop
|
||||
Layout_AddToTmpOfFillXChildren_done:
|
||||
pop yh
|
||||
pop yl
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user