; *************************************************************************** ; 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 = 1 ; *************************************************************************** ; 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_GETMINSIZE breq WID_Widget_Handler_getMinSize ; for now just forward signal to all children WID_Widget_Handler_forward: rcall OBJ_ForwardSignalToChildren ret WID_Widget_Handler_getMinSize: rjmp widgetGetMinSize ; @end ; --------------------------------------------------------------------------- ; @routine widgetGetMinSize ; ; @return r18 minimum width of widget ; @return r19 minimum height of widget ; @clobbers any, !Y widgetGetMinSize: push yl push yh rcall Tree_GetFirstChildObject ; (none) clr r20 clr r21 widgetGetMinSize_loop: mov r17, xl or r17, xh breq widgetGetMinSize_loopEnd mov yl, xl mov yh, yl push r20 push r21 ldi r16, WID_SIGNAL_GETMINSIZE ldi r18, 1 ; default value for when the signal is not handled ldi r19, 1 ; default value for when the signal is not handled rcall OBJ_Handler ; ask child for its minimum size pop r21 pop r20 add r20, r18 ; TODO: handle carry later subi r20, -WID_WIDGET_INTER_BORDER add r21, r19 ; TODO: handle carry later subi r21, -WID_WIDGET_INTER_BORDER rcall Tree_GetNextSibling ; (none) rjmp widgetGetMinSize_loop widgetGetMinSize_loopEnd: mov r18, r20 mov r19, r21 pop yh pop yl ret ; @end