; *************************************************************************** ; 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_MLAYOUT_COLUMN_ASM #define AQH_AVR_GUI2_MLAYOUT_COLUMN_ASM ; *************************************************************************** ; defines ; *************************************************************************** ; code .cseg ; --------------------------------------------------------------------------- ; @routine MLayout_OnGetDefaultWidth_ColumnMode @global ; ; @param Y widget ; @return r19:r18 value ; @clobbers any, !Y MLayout_OnGetDefaultWidth_ColumnMode: ; DEBUG ldi r18, 10 clr r19 sec ret rcall mLayoutSetDefaultWidthToTmp ; (any, !Y) rcall mLayoutGetBorders ; r22=spacing, r23=border push yl push yh rcall MLayout_GetFirstChildToY rcall mLayoutSumContiguous ; r21:r20 needed minimum row width (r18, r19, r25) pop yh pop yl mov r18, r20 mov r19, r21 sec ret ; @end ; --------------------------------------------------------------------------- ; @routine MLayout_OnGetDefaultHeight_ColumnMode @global ; ; @param Y widget ; @return r19:r18 value ; @clobbers any, !Y MLayout_OnGetDefaultHeight_ColumnMode: ; DEBUG ldi r18, 10 clr r19 sec ret bigcall OBJ_GetFirstChild push yl push yh mov yl, r18 mov yh, r19 rcall mLayoutSetDefaultHeightToTmp ; (any, !Y) rcall mLayoutGetBorders ; r22=spacing, r23=border rcall mLayoutSumSkipped ; r21:r20 needed minimum row width (r18, r19, r25) mov r18, r20 mov r19, r21 pop yh pop yl sec ret ; @end ; --------------------------------------------------------------------------- ; @routine MLayout_LayoutColumnMode @global ; ; @param Y widget ; @clobbers any, !Y MLayout_Layout_ColumnMode: rcall mLayoutColumnLayoutHorizontally rcall mLayoutColumnLayoutVertically sec ret ; @end ; --------------------------------------------------------------------------- ; @routine mLayoutColumnLayoutHorizontally ; ; @param Y widget ; @clobbers any, !Y mLayoutColumnLayoutHorizontally: rcall mLayoutGetBorders ; r22=spacing, r23=border ldd r25, Y+MLAYOUT_OFFS_COLSORROWS push yl push yh rcall MLayout_GetFirstChildToY ; (none) push r22 push r23 push r25 clr r25 rcall mLayoutSetDefaultWidthToTmp ; (any, !Y) clr r25 rcall mLayoutCopyTmpToWidth ; (r18, r19, Z) pop r25 pop r23 pop r22 ; prepare first row rcall mLayoutSetupFirstContiguous ; set max column widths to first row (r18, r19, Z) rcall mLayoutColumnExpandColumns ; (r16-r23) rcall mLayoutColumnGridX rcall mLayoutColumnCopyXTmpFromFirstRow rcall mLayoutColumnPackX ; (r10-r13, r16-r21, X) pop yh pop yl ret ; @end mLayoutColumnLayoutVertically: rcall mLayoutGetBorders ; r22=spacing, r23=border ldd r25, Y+MLAYOUT_OFFS_COLSORROWS push yl push yh rcall MLayout_GetFirstChildToY ; (none) push r22 push r23 push r25 clr r25 rcall mLayoutSetDefaultHeightToTmp ; (any, !Y) clr r25 rcall mLayoutCopyTmpToHeight ; (r18, r19, Z) pop r25 pop r23 pop r22 rcall mLayoutSetupFirstSkipped ; set max column heights to first column (r18, r19, Z) rcall mLayoutColumnExpandRows ; (r16-r23) rcall mLayoutColumnGridY rcall mLayoutColumnCopyTmpFromFirstColumn rcall mLayoutColumnPackY ; (r10-r13, r16-r21, X) pop yh pop yl ret ; @end ; --------------------------------------------------------------------------- ; @routine mLayoutColumnCopyXTmpFromFirstRow ; ; @param Y widget ; @param R25 widgets per row/column ; @clobbers r18-r21, Z mLayoutColumnCopyXTmpFromFirstRow: M_MLAYOUT_FOREVERY_CONT mLayoutCallbackColumnCopyRow ret ; @end ; --------------------------------------------------------------------------- ; @routine mLayoutCallbackColumnCopyRow ; ; @param Y widget ; @clobbers r18, r19, r20, r21 mLayoutCallbackColumnCopyRow: push zl push zh rcall mLayoutColumnCopyXTmpAcrossColumn ; (r18, r19, r20, r21, X, Z) pop zh pop zl clc ret ; @end ; --------------------------------------------------------------------------- ; @routine mLayoutColumnCopyXTmpAcrossColumn ; ; @param Y widget ; @param R25 widgets per row/column ; @clobbers r18, r19, r20, r21, X, Z mLayoutColumnCopyXTmpAcrossColumn: push yl push yh ldd r20, Y+WIDGET_OFFS_TMP_LO ldd r21, Y+WIDGET_OFFS_TMP_HI ldd xl, Y+WIDGET_OFFS_X_LO ldd xh, Y+WIDGET_OFFS_X_HI ldi zl, LOW(mLayoutCallbackSetXTmp) ldi zh, HIGH(mLayoutCallbackSetXTmp) rcall mLayoutForEveryObjectSkipped ; (r18, r19, Y) pop yh pop yl ret ; @end ; --------------------------------------------------------------------------- ; @routine mLayoutColumnCopyTmpFromFirstColumn ; ; @param Y widget ; @param R25 widgets per row/column ; @clobbers r18-r21, Z mLayoutColumnCopyTmpFromFirstColumn: push yl push yh ldi zl, LOW(mLayoutCallbackColumnCopyColumn) ldi zh, HIGH(mLayoutCallbackColumnCopyColumn) rcall mLayoutForEveryObjectSkipped ; (r18-r21, Y) pop yh pop yl ret ; @end ; --------------------------------------------------------------------------- ; @routine mLayoutCallbackColumnCopyColumn ; ; @param Y widget ; @param R25 widgets per row/column ; @clobbers r18, r19, r20, r21 mLayoutCallbackColumnCopyColumn: push zl push zh rcall mLayoutColumnCopyYTmpAcrossRow ; (r18, r19, r20, r21, Z) pop zh pop zl clc ret ; @end ; --------------------------------------------------------------------------- ; @routine mLayoutColumnCopyTmpAcrossRow ; ; @param Y widget ; @param R25 widgets per row/column ; @clobbers r18, r19, r20, r21, Z mLayoutColumnCopyYTmpAcrossRow: push yl push yh ldd r20, Y+WIDGET_OFFS_TMP_LO ldd r21, Y+WIDGET_OFFS_TMP_HI ldd xl, Y+WIDGET_OFFS_Y_LO ldd xh, Y+WIDGET_OFFS_Y_HI ldi zl, LOW(mLayoutCallbackSetYTmp) ldi zh, HIGH(mLayoutCallbackSetYTmp) rcall mLayoutForEveryObjectContiguous ; (r18, r19, Y) pop yh pop yl ret ; @end ; --------------------------------------------------------------------------- ; @routine mLayoutColumnGridX ; ; Set X and width to all columns of the row ; ; @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 r12, r13, r16-r21, X, Z mLayoutColumnGridX: mov xl, r23 ; start at border clr xh push yl push yh ldi zl, LOW(mLayoutCallbackGridX) ldi zh, HIGH(mLayoutCallbackGridX) rcall mLayoutForEveryObjectContiguous ; (r12, r13, r16-r21, Y) pop yh pop yl ret ; @end ; --------------------------------------------------------------------------- ; @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: push r25 clr r25 M_MLAYOUT_FOREVERY_CONT mLayoutCallbackPackX ; (r10-r13, r16-r21, X) pop r25 ret ; @end ; --------------------------------------------------------------------------- ; @routine mLayoutColumnGridY ; ; Set Y and height to all rows of a column ; ; @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 r12, r13, r16-r21, X, Z mLayoutColumnGridY: mov xl, r23 ; start at border clr xh push yl push yh ldi zl, LOW(mLayoutCallbackGridY) ldi zh, HIGH(mLayoutCallbackGridY) rcall mLayoutForEveryObjectSkipped ; (r12, r13, r16-r21, Y) pop yh pop yl ret ; @end ; --------------------------------------------------------------------------- ; @routine mLayoutColumnPackY ; ; 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 ; @clobbers r10-r13, r16-r21, X mLayoutColumnPackY: push r25 clr r25 M_MLAYOUT_FOREVERY_CONT mLayoutCallbackPackY ; (r10-r13, r16-r21, X) pop r25 ret ; @end ; --------------------------------------------------------------------------- ; @routine mLayoutColumnExpandColumns ; ; Calculate additional space per expandable widget in a row. ; ; @param Y first widget of current row ; @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-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 push r22 push r23 ldi r22, (1<