From 0c42acf76d3746c49f0520fc83f88d6de94216d6 Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Mon, 18 May 2026 17:14:50 +0200 Subject: [PATCH] gui: added image label (image plus text). --- avr/devices/c03/main/main.asm | 1 + avr/modules/lcd2/gui/base/imagelabel.asm | 446 +++++++++++++++++++++++ 2 files changed, 447 insertions(+) create mode 100644 avr/modules/lcd2/gui/base/imagelabel.asm diff --git a/avr/devices/c03/main/main.asm b/avr/devices/c03/main/main.asm index 3c497b4..f794433 100644 --- a/avr/devices/c03/main/main.asm +++ b/avr/devices/c03/main/main.asm @@ -523,6 +523,7 @@ GUI_MODULE_BEGIN: .include "modules/lcd2/gui/base/imagebutton.asm" .include "modules/lcd2/gui/base/textbutton.asm" .include "modules/lcd2/gui/base/valuelabel.asm" +.include "modules/lcd2/gui/base/imagelabel.asm" .include "modules/lcd2/gui/base/checkbox.asm" .include "modules/lcd2/gui/base/checkbutton.asm" .include "modules/lcd2/gui/base/tile.asm" diff --git a/avr/modules/lcd2/gui/base/imagelabel.asm b/avr/modules/lcd2/gui/base/imagelabel.asm new file mode 100644 index 0000000..b73fe41 --- /dev/null +++ b/avr/modules/lcd2/gui/base/imagelabel.asm @@ -0,0 +1,446 @@ +; *************************************************************************** +; 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_GUI_IMGLABEL_ASM +#define AQH_AVR_GUI_IMGLABEL_ASM + + +; *************************************************************************** +; TODO +; *************************************************************************** + + + + +; *************************************************************************** +; defines + +.equ IMGLABEL_OFFS_BEGIN = WIDGET_SIZE +.equ IMGLABEL_OFFS_IMGRES_LO = IMGLABEL_OFFS_BEGIN+0 +.equ IMGLABEL_OFFS_IMGRES_HI = IMGLABEL_OFFS_BEGIN+1 +.equ IMGLABEL_OFFS_TXTRES_LO = IMGLABEL_OFFS_BEGIN+2 +.equ IMGLABEL_OFFS_TXTRES_HI = IMGLABEL_OFFS_BEGIN+3 +.equ IMGLABEL_OFFS_USER_LO = IMGLABEL_OFFS_BEGIN+4 +.equ IMGLABEL_OFFS_USER_HI = IMGLABEL_OFFS_BEGIN+5 +.equ IMGLABEL_SIZE = IMGLABEL_OFFS_BEGIN+6 + + + + + +; *************************************************************************** +; code + +.cseg + + + +; --------------------------------------------------------------------------- +; @routine ImgLabel_new @global +; +; @return CFLAG set of okay, cleared otherwise +; @return Y address of newly created object +; @param X parent widget +; @param r16 value for OBJECT_OFFS_OPTS +; @param r17 value for WIDGET_OFFS_PACK +; @param r21:r20 img ressource id +; @param r23:r22 txt ressource id +; @clobbers any + +ImgLabel_new: + push r20 + push r21 + push r22 + push r23 + ldi r24, LOW(IMGLABEL_SIZE) + ldi r25, HIGH(IMGLABEL_SIZE) + bigcall Object_Alloc ; (!r16, !r17, !X) + pop r23 + pop r22 + pop r21 + pop r20 + brcc ImgLabel_new_ret + rcall ImgLabel_Init ; (r16, r17, X) + sec +ImgLabel_new_ret: + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine ImgLabel_Init @global +; +; @param Y address of widget +; @param X parent widget (if any) +; @param r16 value for OBJECT_OFFS_OPTS +; @param r17 value for WIDGET_OFFS_PACK +; @param r21:r20 img ressource id +; @param r23:r22 txt ressource id +; @clobbers r16, r17, X + +ImgLabel_Init: + push r20 + push r21 + push r22 + push r23 + ; call base class + bigcall Widget_Init + pop r23 + pop r22 + pop r21 + pop r20 + brcc ImgLabel_Init_ret + ; save params + std Y+IMGLABEL_OFFS_IMGRES_LO, r20 + std Y+IMGLABEL_OFFS_IMGRES_HI, r21 + std Y+IMGLABEL_OFFS_TXTRES_LO, r22 + std Y+IMGLABEL_OFFS_TXTRES_HI, r23 +ImgLabel_Init_ret: + ret +; @end + + + + + +; *************************************************************************** +; signal handlers + + +; --------------------------------------------------------------------------- +; @routine ImgLabel_OnSetValue @global +; +; @param Y address of widget +; @param X value +; @return CFLAG set upon return +; @clobbers none + +ImgLabel_OnSetValue: + std Y+IMGLABEL_OFFS_USER_LO, xl + std Y+IMGLABEL_OFFS_USER_HI, xh + sec + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine ImgLabel_OnGetValue @global +; +; @param Y address of widget +; @return CFLAG set upon return +; @return r19:r18 value +; @clobbers none + +ImgLabel_OnGetValue: + ldd r18, Y+IMGLABEL_OFFS_USER_LO + ldd r19, Y+IMGLABEL_OFFS_USER_HI + sec + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine ImgLabel_OnGetDefaultWidth @global +; +; @param Y address of widget +; @return CFLAG set upon return +; @return r19:r18 value +; @clobbers any, !Y + +ImgLabel_OnGetDefaultWidth: + bigcall Widget_GetBorderAndSpacing ; r22=spacing, r23=border (none) + mov r20, r23 ; add border + clr r21 + lsl r20 ; twice + rol r21 + rcall imgLabelGetImageRessource ; Z=ressource (r16, r17, r18) + brcc ImgLabel_OnGetDefaultWidth_handleText + rcall imgLabelGetImageWidth ; r13:r12=size (none) + add r20, r12 ; add width + adc r21, r13 + add r20, r22 ; add spacing + adc r21, r22 + sub r21, r22 +ImgLabel_OnGetDefaultWidth_handleText: + rcall imgLabelGetTextRessource + brcc ImgLabel_OnGetDefaultWidth_done + rcall imgLabelGetTextWidth ; r13:r12 (r16, r18) + add r20, r12 ; add width + adc r21, r13 +ImgLabel_OnGetDefaultWidth_done: + mov r18, r20 + mov r19, r21 +ImgLabel_OnGetDefaultWidth_ret: + sec + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine ImgLabel_OnGetDefaultHeight @global +; +; @param Y address of widget +; @return CFLAG set upon return +; @return r19:r18 value +; @clobbers any, !Y + +ImgLabel_OnGetDefaultHeight: + clr r20 + clr r21 + rcall imgLabelGetImageRessource ; Z=ressource (r16, r17, r18) + brcc ImgLabel_OnGetDefaultHeight_handleText + rcall imgLabelGetImageHeight + cp r20, r12 + cpc r21, r13 + brcc ImgLabel_OnGetDefaultHeight_handleText + mov r20, r12 + mov r21, r13 +ImgLabel_OnGetDefaultHeight_handleText: + rcall imgLabelGetTextRessource ; Z=ressource (r16, r17, r18) + brcc ImgLabel_OnGetDefaultHeight_done + rcall imgLabelGetTextHeight + cp r20, r12 + cpc r21, r13 + brcc ImgLabel_OnGetDefaultHeight_done + mov r20, r12 + mov r21, r13 +ImgLabel_OnGetDefaultHeight_done: + mov r18, r20 + mov r19, r21 + bigcall Widget_AddOuterStyleBorders ; (r20, r21) + sec + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine ImgLabel_OnDraw @global +; +; @param Y address of widget +; @clobbers any, !Y + +ImgLabel_OnDraw: + ldd r16, Y+OBJECT_OFFS_FLAGS + andi r16, (1<