gui: improved Label class (can now have a suffix to reduce FLASH usage).

- e.g. light1 and light2 can now share the string but have different suffix
- allow for initially empty text
This commit is contained in:
Martin Preuss
2026-05-23 01:41:39 +02:00
parent 15edfd46e4
commit 4b13f16e05

View File

@@ -19,13 +19,17 @@
.equ LABEL_OFFS_TEXTRES_HI = LABEL_OFFS_BEGIN+1
.equ LABEL_OFFS_MINWIDTH_LO = LABEL_OFFS_BEGIN+2
.equ LABEL_OFFS_MINWIDTH_HI = LABEL_OFFS_BEGIN+3
.equ LABEL_SIZE = LABEL_OFFS_BEGIN+4
.equ LABEL_OFFS_IDX = LABEL_OFFS_BEGIN+4
.equ LABEL_SIZE = LABEL_OFFS_BEGIN+5
; values
.equ LABEL_VALUE_TEXTRES = 1
.equ LABEL_VALUE_MINWIDTH = 2
.equ LABEL_VALUE_TEXTRES = WIDGET_VALUE_NEXTFREE+0
.equ LABEL_VALUE_IDX = WIDGET_VALUE_NEXTFREE+1
.equ LABEL_VALUE_MINWIDTH = WIDGET_VALUE_NEXTFREE+2
.equ LABEL_VALUE_NEXTFREE = WIDGET_VALUE_NEXTFREE+3
.equ LABEL_IDX_SPACING = 8
@@ -97,6 +101,7 @@ Label_Init:
#if 0
; ---------------------------------------------------------------------------
; @routine Label_SetTextRessourceId @global
;
@@ -104,7 +109,7 @@ Label_Init:
; @param X id of text ressource
; @clobbers r16, r17, r18, r19
Label_SetTextRessourceId:
xLabel_SetTextRessourceId:
std Y+LABEL_OFFS_TEXTRES_LO, xl
std Y+LABEL_OFFS_TEXTRES_HI, xh
ldd r16, Y+OBJECT_OFFS_FLAGS
@@ -115,7 +120,7 @@ Label_SetTextRessourceId:
bigcall OBJ_AddFlagsUp ; (r17, r18, r19)
ret
; @end
#endif
@@ -211,15 +216,8 @@ Label_OnGetDefaultHeight:
Label_OnSetValueTextRes:
std Y+LABEL_OFFS_TEXTRES_LO, xl
std Y+LABEL_OFFS_TEXTRES_HI, xh
rcall labelSetDirtyAndLayoutFlags
; set dirty flag
ldd r16, Y+OBJECT_OFFS_FLAGS
ori r16, (1<<WIDGET_FLAGS_DIRTY_BIT)
std Y+OBJECT_OFFS_FLAGS, r16
; force layout of this and all parent widgets
ldi r16, (1<<WIDGET_FLAGS_LAYOUT_BIT)
bigcall OBJ_AddFlagsUp ; (r17, r18, r19)
sec
ret
; @end
@@ -236,7 +234,36 @@ Label_OnSetValueTextRes:
Label_OnSetValueMinWidth:
std Y+LABEL_OFFS_MINWIDTH_LO, xl
std Y+LABEL_OFFS_MINWIDTH_HI, xh
rcall labelSetDirtyAndLayoutFlags
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine Label_OnSetValueIdx @global
;
; @param Y address of widget
; @param X id of text ressource
; @clobbers none
Label_OnSetValueIdx:
std Y+LABEL_OFFS_IDX, xl
rcall labelSetDirtyAndLayoutFlags
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine labelSetDirtyAndLayoutFlags
;
; @param Y address of widget
; @clobbers r16-r19
labelSetDirtyAndLayoutFlags:
; set dirty flag
ldd r16, Y+OBJECT_OFFS_FLAGS
ori r16, (1<<WIDGET_FLAGS_DIRTY_BIT)
@@ -245,7 +272,6 @@ Label_OnSetValueMinWidth:
; force layout of this and all parent widgets
ldi r16, (1<<WIDGET_FLAGS_LAYOUT_BIT)
bigcall OBJ_AddFlagsUp ; (r17, r18, r19)
sec
ret
; @end
@@ -260,6 +286,21 @@ Label_OnSetValueMinWidth:
labelWriteText:
rcall labelAlignTextXY ; (r8, r9, r10, r11, r12, r13, r14, r15, r16, r17, r18, r19)
bigcall Widget_DrawTextFlash ; (any, !Y)
ldd r16, Y+LABEL_OFFS_IDX
tst r16
breq labelWriteText_ret
ldi r17, LABEL_IDX_SPACING
add r5, r17
adc r6, r17
sub r6, r17
ldi r17, '0'
add r16, r17
push zl
push zh
rcall widgetDrawChar ; (any, !Y, !R6, !R7, !R8, !R9, !R10, !R11)
pop zh
pop zl
labelWriteText_ret:
ret
; @end
@@ -304,12 +345,26 @@ labelCalcTextWidth:
ldi zl, LOW(RESSOURCE_ADDR*2)
ldi zh, HIGH(RESSOURCE_ADDR*2)
bigcall RES_GetRessource ; (r16, r17, r18)
brcc labelCalcTextWidth_ret
bigcall Widget_GetCharWidth ; R16=char width
brcs labelCalcTextWidth_haveText
ldi zl, LOW(labelEmptyString*2) ; use empty default text
ldi zh, HIGH(labelEmptyString*2)
labelCalcTextWidth_haveText:
bigcall Widget_GetCharWidth ; R16=char width
mov r18, r16
bigcall Widget_CalcStringWidthFLASH ; r13:r12=size (r16)
sec
ldd r16, Y+LABEL_OFFS_IDX
tst r16
breq labelCalcTextWidth_ret
; add spacing
ldi r16, LABEL_IDX_SPACING
add r12, r16
adc r13, r16
sub r13, r16
; add width of one char
rcall Widget_GetCharWidth ; r16=charWidth (none)
add r12, r16
adc r13, r16
sub r13, r16
labelCalcTextWidth_ret:
ret
; @end
@@ -319,6 +374,10 @@ labelCalcTextWidth_ret:
; ***************************************************************************
; data in FLASH
labelEmptyString:
.dw 0
Label_DefaultSignalmap:
; header
.dw Widget_DefaultSignalmap*2 ; next table to use
@@ -327,6 +386,7 @@ Label_DefaultSignalmap:
.db LABEL_VALUE_TEXTRES, WIDGET_SIGNAL_SETVALUE, LOW(Label_OnSetValueTextRes), HIGH(Label_OnSetValueTextRes)
.db LABEL_VALUE_MINWIDTH, WIDGET_SIGNAL_SETVALUE, LOW(Label_OnSetValueMinWidth), HIGH(Label_OnSetValueMinWidth)
.db LABEL_VALUE_IDX, WIDGET_SIGNAL_SETVALUE, LOW(Label_OnSetValueIdx), HIGH(Label_OnSetValueIdx)
.db WIDGET_VALUE_DEFAULT_WIDTH, WIDGET_SIGNAL_GETVALUE, LOW(Label_OnGetDefaultWidth), HIGH(Label_OnGetDefaultWidth)
.db WIDGET_VALUE_DEFAULT_HEIGHT, WIDGET_SIGNAL_GETVALUE, LOW(Label_OnGetDefaultHeight), HIGH(Label_OnGetDefaultHeight)