From 8eed88394f860cb8f8422baf09a8ebae1f3b3d40 Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Mon, 23 Mar 2026 22:20:11 +0100 Subject: [PATCH] gui2: X-layout works now! --- avr/modules/lcd2/gui2/base/mlayout2.asm | 92 ++++++----- avr/modules/lcd2/gui2/base/mlayout_column.asm | 146 +++++++++++++----- 2 files changed, 153 insertions(+), 85 deletions(-) diff --git a/avr/modules/lcd2/gui2/base/mlayout2.asm b/avr/modules/lcd2/gui2/base/mlayout2.asm index 1a9b3d3..369d1f0 100644 --- a/avr/modules/lcd2/gui2/base/mlayout2.asm +++ b/avr/modules/lcd2/gui2/base/mlayout2.asm @@ -277,14 +277,14 @@ mLayoutCallbackSetYTmp: ; --------------------------------------------------------------------------- -; @routine mLayoutCallbackPositionX +; @routine mLayoutCallbackGridX ; ; @param Y widget ; @param r22 spacing between widgets ; @param X current X pos ; @clobbers r10-r13, r16-r21 -mLayoutCallbackPositionX: +mLayoutCallbackGridX: ldd r20, Y+WIDGET_OFFS_TMP_LO ldd r21, Y+WIDGET_OFFS_TMP_HI std Y+WIDGET_OFFS_X_LO, xl ; set new X @@ -296,40 +296,39 @@ mLayoutCallbackPositionX: sub xh, r22 clc ret +; @end -; ldd r16, Y+OBJECT_OFFS_FLAGS -; sbrs r16, WIDGET_FLAGS_VISIBLE_BIT -; rjmp mLayoutCallbackPositionX_ret + +; --------------------------------------------------------------------------- +; @routine mLayoutCallbackGridX +; +; @param Y widget +; @param r22 spacing between widgets +; @clobbers r10-r13, r16-r21, X + +mLayoutCallbackPackX: ldd r10, Y+WIDGET_OFFS_TMP_LO ; calculated cell width ldd r11, Y+WIDGET_OFFS_TMP_HI ldd r12, Y+WIDGET_OFFS_WIDTH_LO ; default width ldd r13, Y+WIDGET_OFFS_WIDTH_HI ldd r17, Y+WIDGET_OFFS_PACK andi r17, 3 ; WIDGET_PACK_HSELF0_BIT = 0, no shift necessary - push r10 ; cell width - push r11 - rcall mLayoutPackCell ; R21:R20=relative pos, R19:R18=new size (r17, r18, r19) - pop r11 - pop r10 - add r20, xl - adc r21, xh - std Y+WIDGET_OFFS_X_LO, r20 ; set new X - std Y+WIDGET_OFFS_X_HI, r21 - std Y+WIDGET_OFFS_WIDTH_LO, r18 ; set new width + rcall mLayoutPackCell ; R21:R20=relative pos, R19:R18=new size (r16, r17, r18, r19) + ldd xl, Y+WIDGET_OFFS_X_LO + ldd xh, Y+WIDGET_OFFS_X_HI + add xl, r20 + adc xh, r21 + std Y+WIDGET_OFFS_X_LO, xl + std Y+WIDGET_OFFS_X_HI, xh + std Y+WIDGET_OFFS_WIDTH_LO, r18 std Y+WIDGET_OFFS_WIDTH_HI, r19 - add xl, r10 ; advance X - adc xh, r11 - add xl, r22 ; add spacing - adc xh, r22 - sub xh, r22 -mLayoutCallbackPositionX_ret: - clc ret ; @end + ; --------------------------------------------------------------------------- ; @routine mLayoutCallbackPositionY ; @@ -362,7 +361,7 @@ ret andi r17, 3 push r18 push r19 - rcall mLayoutPackCell ; R21:R20=relative pos (r17, r18, r19) + rcall mLayoutPackCell ; R21:R20=relative pos (r16, r17, r18, r19) pop r19 pop r18 add r20, xl @@ -555,7 +554,7 @@ mLayoutCallbackGetMaxTmp_ret: ; --------------------------------------------------------------------------- -; @routine mLayoutCountChildrenMatchingPackContiguous +; @routine mLayoutCountMatchingPackContiguous ; ; @param Y object whose TMP value is to be added ; @param r22 mask for WIDGET_OFFS_PACK @@ -564,7 +563,7 @@ mLayoutCallbackGetMaxTmp_ret: ; @return r20 number of matching children ; @clobbers r18, r19 -mLayoutCountChildrenMatchingPackContiguous: +mLayoutCountMatchingPackContiguous: push yl push yh clr r20 @@ -629,7 +628,7 @@ mLayoutCallbackCountChildrenMatchingPack_ret: ; --------------------------------------------------------------------------- -; @routine mLayoutExpandChildrenMatchingPackContiguous +; @routine mLayoutExpandMatchingPackContiguous ; ; @param Y object whose TMP value is to be added ; @param r21:r20 value to add to TMP @@ -638,12 +637,11 @@ mLayoutCallbackCountChildrenMatchingPack_ret: ; @param r25 number of widgets to handle ; @clobbers r18, r19 -mLayoutExpandChildrenMatchingPackContiguous: +mLayoutExpandMatchingPackContiguous: push yl push yh - clr r20 - ldi zl, LOW(mLayoutCallbackExpandChildrenMatchingPack) - ldi zh, HIGH(mLayoutCallbackExpandChildrenMatchingPack) + ldi zl, LOW(mLayoutCallbackExpandMatchingPack) + ldi zh, HIGH(mLayoutCallbackExpandMatchingPack) rcall mLayoutForEveryObjectContiguous ; (r18, r19, Y) pop yh pop yl @@ -653,7 +651,7 @@ mLayoutExpandChildrenMatchingPackContiguous: ; --------------------------------------------------------------------------- -; @routine mLayoutExpandChildrenMatchingPackSkipped +; @routine mLayoutExpandMatchingPackSkipped ; ; @param Y object whose TMP value is to be added ; @param r21:r20 value to add to TMP @@ -662,12 +660,11 @@ mLayoutExpandChildrenMatchingPackContiguous: ; @param r25 number of widgets to skip ; @clobbers r18, r19 -mLayoutExpandChildrenMatchingPackSkipped: +mLayoutExpandMatchingPackSkipped: push yl push yh - clr r20 - ldi zl, LOW(mLayoutCallbackExpandChildrenMatchingPack) - ldi zh, HIGH(mLayoutCallbackExpandChildrenMatchingPack) + ldi zl, LOW(mLayoutCallbackExpandMatchingPack) + ldi zh, HIGH(mLayoutCallbackExpandMatchingPack) rcall mLayoutForEveryObjectSkipped ; (r18, r19, Y) pop yh pop yl @@ -677,7 +674,7 @@ mLayoutExpandChildrenMatchingPackSkipped: ; --------------------------------------------------------------------------- -; @routine mLayoutCallbackExpandChildrenMatchingPack +; @routine mLayoutCallbackExpandMatchingPack ; ; @param Y object whose TMP value is to be added ; @param r21:r20 space to add to expandable widgets @@ -686,21 +683,21 @@ mLayoutExpandChildrenMatchingPackSkipped: ; @return CFLAG clear (to not abort the loop function) ; @clobbers r18, r19 -mLayoutCallbackExpandChildrenMatchingPack: +mLayoutCallbackExpandMatchingPack: ldd r18, Y+OBJECT_OFFS_FLAGS sbrs r18, WIDGET_FLAGS_VISIBLE_BIT - rjmp mLayoutCallbackExpandChildrenMatchingPack_ret + rjmp mLayoutCallbackExpandMatchingPack_ret ldd r18, Y+WIDGET_OFFS_PACK eor r18, r23 and r18, r22 - brne mLayoutCallbackExpandChildrenMatchingPack_ret + brne mLayoutCallbackExpandMatchingPack_ret ldd r18, Y+WIDGET_OFFS_TMP_LO ldd r19, Y+WIDGET_OFFS_TMP_HI add r18, r20 adc r19, r21 std Y+WIDGET_OFFS_TMP_LO, r18 std Y+WIDGET_OFFS_TMP_HI, r19 -mLayoutCallbackExpandChildrenMatchingPack_ret: +mLayoutCallbackExpandMatchingPack_ret: clc ret ; @end @@ -871,7 +868,7 @@ mLayoutCallbackCopyTmpToHeight: ; @param r22 spacing between widgets ; @param r23 border at beginning and and ; @return r21:r20 total size in the given dimension including borders and inter-widget spacing -; @clobbers r18, r19, r25 +; @clobbers r18, r19 mLayoutSumContiguous: push yl @@ -880,7 +877,7 @@ mLayoutSumContiguous: clr r21 ldi zl, LOW(mLayoutCallbackAddToSum) ldi zh, HIGH(mLayoutCallbackAddToSum) - rcall mLayoutForEveryObjectContiguous ; (r18, r19, r25, Y) + rcall mLayoutForEveryObjectContiguous ; (r18, r19, Y) sub r20, r22 ; undo last adding inter-widget space sbc r21, r22 add r21, r22 @@ -1081,18 +1078,19 @@ mLayoutGetBorders: ; @param r22 spacing (between widgets) ; @return R21:R20 pos ; @return R19:R18 new size of widget -; @clobbers r17, r18, r19 +; @clobbers r16, r17, r18, r19 mLayoutPackCell: clr r20 ; preset pos clr r21 - mov r18, r13 ; preset widget size - mov r19, r12 + mov r18, r12 ; preset widget size + mov r19, r13 ; subtract borders from cell size + clr r16 sub r10, r22 ; subtract spacing - sbc r11, r22 - add r11, r22 + sbc r11, r16 + brcs mLayoutPackCell_ret andi r17, 3 ; only 2 bits pack mode cpi r17, WIDGET_PACK_FILLED diff --git a/avr/modules/lcd2/gui2/base/mlayout_column.asm b/avr/modules/lcd2/gui2/base/mlayout_column.asm index c4a0c7a..e102bd6 100644 --- a/avr/modules/lcd2/gui2/base/mlayout_column.asm +++ b/avr/modules/lcd2/gui2/base/mlayout_column.asm @@ -132,14 +132,16 @@ mLayoutColumnLayoutHorizontally: ; possibly distribute free space to expandable columns push r22 ; spacing push r23 ; border - push r25 -; rcall mLayoutColumnExpandColumns ; (r16-r23, r25) - pop r25 + rcall mLayoutColumnExpandColumns ; (r16-r23) pop r23 pop r22 - rcall mLayoutColumnPositionX + rcall mLayoutColumnGridX rcall mLayoutColumnCopyXTmpFromFirstRow + push r25 + clr r25 + rcall mLayoutColumnPackX ; (r10-r13, r16-r21, X) + pop r25 pop yh pop yl @@ -345,7 +347,7 @@ mLayoutCallbackColumnPositionXRow: push yh push zl push zh - rcall mLayoutColumnPositionX ; (r12, r13, r16-r21, X, Z) + rcall mLayoutColumnGridX ; (r12, r13, r16-r21, X, Z) pop zh pop zl pop yh @@ -357,7 +359,7 @@ mLayoutCallbackColumnPositionXRow: ; --------------------------------------------------------------------------- -; @routine mLayoutColumnPositionX +; @routine mLayoutColumnGridX ; ; Set X and width to all columns of the row ; @@ -367,13 +369,13 @@ mLayoutCallbackColumnPositionXRow: ; @param R25 widgets per row/column ; @clobbers r12, r13, r16-r21, X, Z -mLayoutColumnPositionX: +mLayoutColumnGridX: mov xl, r23 ; start at border clr xh push yl push yh - ldi zl, LOW(mLayoutCallbackPositionX) - ldi zh, HIGH(mLayoutCallbackPositionX) + ldi zl, LOW(mLayoutCallbackGridX) + ldi zh, HIGH(mLayoutCallbackGridX) rcall mLayoutForEveryObjectContiguous ; (r12, r13, r16-r21, Y) pop yh pop yl @@ -382,6 +384,24 @@ mLayoutColumnPositionX: +; --------------------------------------------------------------------------- +; @routine mLayoutColumnPackX +; +; Pack each widget inside its cell. +; +; @param Y first widget of current row +; @param r22 spacing between widgets +; @param r23 border at beginning and and +; @param R25 widgets per row/column +; @clobbers r10-r13, r16-r21, X + +mLayoutColumnPackX: + M_MLAYOUT_FOREVERY_CONT mLayoutCallbackPackX ; (r10-r13, r16-r21, X) + ret +; @end + + + ; --------------------------------------------------------------------------- ; @routine mLayoutColumnPositionAllY ; @@ -463,15 +483,29 @@ mLayoutColumnPositionY: ; @param R25 widgets per row/column ; @return CFLAG set if there is additional space to distribute ; @return r21:r20 space to add to every expandable widget -; @clobbers r16-r23 +; @clobbers r16-r21 mLayoutColumnExpandColumns: + push yl + push yh + bigcall OBJ_GetParent + mov yl, r18 + mov yh, r19 + ldd r18, Y+WIDGET_OFFS_WIDTH_LO + ldd r19, Y+WIDGET_OFFS_WIDTH_HI + pop yh + pop yl + rcall mLayoutColumnCalcAddSpacePerColumn ; r21:r20=additional space (r16-r23) brcc mLayoutColumnExpandColumns_ret - ldi r22, (1<