gui2: fixed problems with layouts

need to look into spread mode, too.
This commit is contained in:
Martin Preuss
2026-03-11 00:32:08 +01:00
parent 282cd738b4
commit 51cedae0cb
10 changed files with 493 additions and 84 deletions

View File

@@ -523,7 +523,7 @@ Widget_OnDraw:
sbrs r17, WIDGET_OPTS_BORDER_BIT
rjmp Widget_OnDraw_ret
bigcall Widget_DrawBorder
Widget_OnDraw_ret:
sec
ret
@@ -719,6 +719,17 @@ Widget_OnTouch_done:
Widget_Clear:
rcall Widget_LoadDimsForFullWidget ; (none)
rcall Widget_MakeAbsPos ; (r16, r17, r18, r19)
rcall Widget_ValidateDims ; (r16, r17)
tst r16
breq Widget_Clear_l1
ldi r16, LOW(DISPLAY_COLOR_RED)
mov r2, r16
ldi r16, HIGH(DISPLAY_COLOR_RED)
mov r3, r16
bigcall Display_FillRect
ret
Widget_Clear_l1:
rcall Widget_SelectColors ; (R16)
mov r2, r0 ; use background
mov r3, r1
@@ -927,6 +938,109 @@ Widget_MakeAbsPos_loopEnd:
; ---------------------------------------------------------------------------
; @routine Widget_ValidateDims @global
;
; @param Y address of widget
; @param r5:r4 X0
; @param r7:r6 Y0
; @param r9:r8 X1/W
; @param r11:r10 Y1/H
; @return r16 1 if dims modified, 0 if dims where within display range
; @clobbers r16, r17
Widget_ValidateDims:
push r18
clr r18
ldi r16, LOW(DISPLAY_WIDTH) ; check X
ldi r17, HIGH(DISPLAY_WIDTH)
cp r4, r16
cpc r5, r17
brcs Widget_ValidateDims_width
ldi r18, 1
clr r4
clr r5
Widget_ValidateDims_width:
sub r16, r4 ; calculate remaining width from pos on
sbc r17, r5
cp r16, r8
cpc r17, r9
brcc Widget_ValidateDims_y
ldi r18, 1
mov r8, r16
mov r9, r17
Widget_ValidateDims_y:
ldi r16, LOW(DISPLAY_HEIGHT) ; check Y
ldi r17, HIGH(DISPLAY_HEIGHT)
cp r6, r16
cpc r7, r17
brcs Widget_ValidateDims_height
ldi r18, 1
clr r6
clr r7
Widget_ValidateDims_height:
sub r16, r6 ; calculate remaining width from pos on
sbc r17, r7
cp r16, r10
cpc r17, r11
brcc Widget_ValidateDims_ret
ldi r18, 1
mov r10, r16
mov r11, r17
Widget_ValidateDims_ret:
mov r16, r18
pop r18
ret
; @end
; ---------------------------------------------------------------------------
; @routine Widget_CheckDims @global
;
; @param Y address of widget
; @clobbers r16, r17, r18, r19
Widget_CheckDims:
ldi r18, LOW(DISPLAY_WIDTH) ; check X
ldi r19, HIGH(DISPLAY_WIDTH)
ldd r16, Y+WIDGET_OFFS_X_LO
ldd r17, Y+WIDGET_OFFS_X_HI
cp r16, r18
cpc r17, r19
brcc Widget_CheckDims_invalid
sub r18, r16
sbc r19, r17
ldd r16, Y+WIDGET_OFFS_WIDTH_LO
ldd r17, Y+WIDGET_OFFS_WIDTH_HI
cp r18, r16
cpc r19, r17
brcs Widget_CheckDims_invalid
ldi r18, LOW(DISPLAY_HEIGHT) ; check Y
ldi r19, HIGH(DISPLAY_HEIGHT)
ldd r16, Y+WIDGET_OFFS_Y_LO
ldd r17, Y+WIDGET_OFFS_Y_HI
cp r16, r18
cpc r17, r19
brcc Widget_CheckDims_invalid
sub r18, r16
sbc r19, r17
ldd r16, Y+WIDGET_OFFS_HEIGHT_LO
ldd r17, Y+WIDGET_OFFS_HEIGHT_HI
cp r18, r16
cpc r19, r17
brcs Widget_CheckDims_invalid
; done, all okay so far
sec
rjmp Widget_CheckDims_ret
Widget_CheckDims_invalid:
clc
Widget_CheckDims_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine Widget_SelectColors @global
;