; *************************************************************************** ; copyright : (C) 2025 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. * ; *************************************************************************** ; *************************************************************************** ; defs .equ WID_WIDGET_INTER_BORDER = 2 ; *************************************************************************** ; code .cseg ; --------------------------------------------------------------------------- ; @routine WID_Widget_new @global ; ; @param Y pointer to window SRAM ; @param X pointer to parent ; @param r18 WID_OFFS_OPTIONS1 ; @param r19 WID_OFFS_OPTIONS2 WID_Widget_Init: push r18 push r19 push xl push xh ldi zl, LOW(WID_Widget_Handler) ldi zh, HIGH(WID_Widget_Handler) clr r17 rcall OBJ_Init pop xh pop xl pop r19 pop r18 std Y+WID_OFFS_OPTIONS1, r18 std Y+WID_OFFS_OPTIONS2, r19 mov r16, xl or r16, xh breq WID_Widget_noParent ; copy defaults from parent adiw xh:xl, WID_OFFS_BG_COL_LO ld r16, X+ ; WID_OFFS_BG_COL_LO std Y+WID_OFFS_BG_COL_LO, r16 ld r16, X+ ; WID_OFFS_BG_COL_HI std Y+WID_OFFS_BG_COL_HI, r16 ld r16, X+ ; WID_OFFS_FG_COL_LO std Y+WID_OFFS_FG_COL_LO, r16 ld r16, X+ ; WID_OFFS_FG_COL_HI std Y+WID_OFFS_FG_COL_HI, r16 ld r16, X+ ; WID_OFFS_FONT_LO std Y+WID_OFFS_FONT_LO, r16 ld r16, X+ ; WID_OFFS_FONT_HI std Y+WID_OFFS_FONT_HI, r16 rjmp WID_Widget_end WID_Widget_noParent: ; preset without parent clr r16 std Y+WID_OFFS_FONT_LO, r16 std Y+WID_OFFS_FONT_HI, r16 std Y+WID_OFFS_FG_COL_LO, r16 ; foreground black std Y+WID_OFFS_FG_COL_HI, r16 dec r16 std Y+WID_OFFS_BG_COL_LO, r16 ; background white std Y+WID_OFFS_BG_COL_HI, r16 ldi r16, 2 ; default borders std Y+WID_OFFS_BORDER_TOP, r16 std Y+WID_OFFS_BORDER_BOT, r16 std Y+WID_OFFS_BORDER_LEFT, r16 std Y+WID_OFFS_BORDER_RIGHT, r16 WID_Widget_end: ret ; @end ; --------------------------------------------------------------------------- ; @routine WID_Widget_Handler ; ; Signal handler for an object. A signal can have up to 3 parameters ; conveyed in registers R18, R19 and X. ; ; @param Y pointer to object SRAM ; @param r16 signal ; @param R18 1st param ; @param R19 2nd param ; @param X 3rd param ; @clobbers any, !Y WID_Widget_Handler: cpi r16, WID_SIGNAL_GETMINWIDTH breq WID_Widget_Handler_getMinWidth cpi r16, WID_SIGNAL_GETMINHEIGHT breq WID_Widget_Handler_getMinHeight ; for now just forward signal to all children WID_Widget_Handler_forward: rcall OBJ_ForwardSignalToChildren ret WID_Widget_Handler_getMinWidth: rjmp widgetGetMinWidth WID_Widget_Handler_getMinHeight: rjmp widgetGetMinHeight ; @end ; --------------------------------------------------------------------------- ; @routine widgetGetMinWidth ; ; @return r19:r18 minimum width of widget ; @clobbers any, !Y widgetGetMinWidth: ldi r16, WID_SIGNAL_GETMINWIDTH rjmp widgetGetMinSize ; @end ; --------------------------------------------------------------------------- ; @routine widgetGetMinHeight ; ; @return r19:r18 minimum height of widget ; @clobbers any, !Y widgetGetMinHeight: ldi r16, WID_SIGNAL_GETMINHEIGHT rjmp widgetGetMinSize ; @end ; --------------------------------------------------------------------------- ; @routine widgetGetMinSize ; ; @param r16 signal to send (WID_SIGNAL_GETMINWIDTH, WID_SIGNAL_GETMINHEIGHT) ; @return r19:r18 minimum width or height of widget ; @clobbers any, !Y widgetGetMinSize: push yl push yh rcall Tree_GetFirstChildObject ; (none) clr r24 clr r25 widgetGetMinSize_loop: mov r17, xl or r17, xh breq widgetGetMinSize_loopEnd mov yl, xl mov yh, yl push r16 push r24 push r25 ldi r18, 1 ; default value for when the signal is not handled ldi r19, 0 ; default value for when the signal is not handled rcall OBJ_Handler ; ask child for its minimum size pop r25 pop r24 pop r16 add r24, r18 ; TODO: handle carry later adc r25, r19 adiw r25:r24, WID_WIDGET_INTER_BORDER rcall Tree_GetNextSibling ; (none) rjmp widgetGetMinSize_loop widgetGetMinSize_loopEnd: mov r18, r24 mov r19, r25 pop yh pop yl ret ; @end