diff --git a/avr/devices/c03/test/main.asm b/avr/devices/c03/test/main.asm index 4e4baef..519906c 100644 --- a/avr/devices/c03/test/main.asm +++ b/avr/devices/c03/test/main.asm @@ -333,6 +333,7 @@ GUI2_MODULE_BEGIN: .include "modules/lcd2/gui2/base/valuelabel.asm" .include "modules/lcd2/gui2/aqhome/sensorwatch.asm" .include "modules/lcd2/gui2/base/layout2.asm" +.include "modules/lcd2/gui2/base/hlayout2.asm" GUI2_MODULE_END: .equ MODULE_SIZE_GUI2 = GUI2_MODULE_END-GUI2_MODULE_BEGIN diff --git a/avr/modules/lcd2/gui2/base/hlayout2.asm b/avr/modules/lcd2/gui2/base/hlayout2.asm new file mode 100644 index 0000000..1388f9c --- /dev/null +++ b/avr/modules/lcd2/gui2/base/hlayout2.asm @@ -0,0 +1,313 @@ +; *************************************************************************** +; 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_HLAYOUT2_ASM +#define AQH_AVR_GUI2_HLAYOUT2_ASM + + +; *************************************************************************** +; defines + +.equ HLAYOUT2_OFFS_BEGIN = WIDGET_SIZE +.equ HLAYOUT2_OFFS_MODE = HLAYOUT2_OFFS_BEGIN+0 +.equ HLAYOUT2_SIZE = HLAYOUT2_OFFS_BEGIN+1 + + +; values for HLAYOUT_OFFS_MODE +.equ HLAYOUT2_MODE_EXPAND = 0 +.equ HLAYOUT2_MODE_SPREAD = 1 + + + + + +; *************************************************************************** +; code + +.cseg + + + +; --------------------------------------------------------------------------- +; @routine HLayout_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 r20 layout mode (HLAYOUT_MODE_EXPAND, HLAYOUT_MODE_SPREAD) +; @clobbers any + +HLayout2_new: + push r20 + ldi r24, LOW(HLAYOUT2_SIZE) + ldi r25, HIGH(HLAYOUT2_SIZE) + bigcall Object_Alloc ; (!r16, !r17, !X) + pop r20 + brcc HLayout2_new_ret + rcall HLayout2_Init ; (r16, r17, X) + sec +HLayout2_new_ret: + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine HLayout2_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 r20 layout mode (HLAYOUT_MODE_EXPAND, HLAYOUT_MODE_SPREAD) +; @clobbers r16, r17, X + +HLayout2_Init: + push r20 + ; call base class + bigcall Widget_Init ; (r16, r17, X) + pop r20 + + ; set widget-specific data + std Y+HLAYOUT2_OFFS_MODE, r20 + + ; set default signal map + ldi r16, LOW(HLayout2_DefaultSignalmap*2) + std Y+OBJECT_OFFS_SIGNALMAP_LO, r16 + ldi r16, HIGH(HLayout2_DefaultSignalmap*2) + std Y+OBJECT_OFFS_SIGNALMAP_HI, r16 + + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine HLayout2_OnLayout +; +; @param Y pointer to widget +; @clobbers any, !Y + +HLayout2_OnLayout: + ; create layout context + bigcall OBJ_CountDirectChildren ; r16=num of children (r18, r19) + tst r16 + breq HLayout2_OnLayout_ret + push r16 + bigcall LayoutCtx_new ; X=new ctx (r16, r17, r18, r19, r24, r25) + pop r16 + brcc HLayout2_OnLayout_ret + ; set borders and spacing in layout context + bigcall Widget_GetBorderAndSpacing ; (none) + adiw xh:xl, LAYOUT_CTX_OFFS_BORDERS + st X+, r23 ; store border + st X, r22 ; store spacing + sbiw xh:xl, (LAYOUT_CTX_OFFS_BORDERS+1) + ; do layout + mov r25, r16 + rcall hLayout2Horizontally + rcall hLayout2Vertically + ; release layout context + bigcall LayoutCtx_free + + ; force re-drawing of this widget, clear layout bit + ldd r16, Y+OBJECT_OFFS_FLAGS + sbr r16, (1<