gui2: more work (vlayout doesn't work, yet).

This commit is contained in:
Martin Preuss
2026-03-09 02:08:33 +01:00
parent 92efebccf1
commit 0758579b43
11 changed files with 657 additions and 523 deletions

View File

@@ -31,6 +31,14 @@ DEBUG2:
rjmp DEBUG2 rjmp DEBUG2
DEBUG3:
ldi r19, 50
ldi r20, 18
ldi r21, 2
rcall blinkLed
rjmp DEBUG3
; @param r19 loop count ; @param r19 loop count
; @param r20 on time ; @param r20 on time

View File

@@ -250,16 +250,44 @@ test:
ldi r16, 0 ldi r16, 0
ldi r17, 0 ldi r17, 0
bigcall GuiApp_new bigcall GuiApp_new
brcs test_ok brcc DEBUG_STOP
bigjmp DEBUG1
test_ok:
sts guiApp, yl sts guiApp, yl
sts guiApp+1, yh sts guiApp+1, yh
bigcall GuiApp_GetRootWindow
brcc DEBUG_STOP
sts rootWindow, r18
sts rootWindow+1, r19
mov xl, r18
mov xh, r19
ldi r16, 0 ; OPTS
ldi r17, (WIDGET_PACK_FILLED<<WIDGET_PACK_HSELF0_BIT) | (WIDGET_PACK_FILLED<<WIDGET_PACK_VSELF0_BIT) ; PACK
ldi r20, LOW(RESSSOURCE_TXT_LIVINGROOM)
ldi r21, HIGH(RESSSOURCE_TXT_LIVINGROOM)
bigcall MainWindow_new
brcc DEBUG_STOP
sts mainWin1, yl
sts mainWin1+1, yh
ldd r16, Y+OBJECT_OFFS_FLAGS
sbr r16, (1<<WIDGET_FLAGS_VISIBLE_BIT) | (1<<WIDGET_FLAGS_LAYOUT_BIT) | (1<<WIDGET_FLAGS_DIRTY_BIT)
std Y+OBJECT_OFFS_FLAGS, r16
ret ret
DEBUG_STOP:
bigjmp DEBUG1
DEBUG_STOP2:
bigjmp DEBUG2
DEBUG_STOP3:
bigjmp DEBUG3
; *************************************************************************** ; ***************************************************************************
@@ -320,8 +348,10 @@ test_ok:
.dseg .dseg
guiApp: .byte 2 guiApp: .byte 2
; debug
rootWindow: .byte 2
mainWin1: .byte 2
heapStart: heapStart:

View File

@@ -55,8 +55,7 @@ guiapp_touch_event:
; ;
; @return CFLAG set of okay, cleared otherwise ; @return CFLAG set of okay, cleared otherwise
; @return Y address of newly created object ; @return Y address of newly created object
; @param r16 value for OBJECT_OFFS_OPTS_LO ; @param r16 value for OBJECT_OFFS_OPTS
; @param r17 value for OBJECT_OFFS_OPTS_HI
; @clobbers any ; @clobbers any
GuiApp_new: GuiApp_new:
@@ -76,22 +75,13 @@ GuiApp_new_ret:
; @routine GuiApp_Init @global ; @routine GuiApp_Init @global
; ;
; @param Y address of object in SDRAM ; @param Y address of object in SDRAM
; @param r16 value for OBJECT_OFFS_OPTS_LO ; @param r16 value for OBJECT_OFFS_OPTS
; @param r17 value for OBJECT_OFFS_OPTS_HI
; @clobbers r16, r17, X ; @clobbers r16, r17, X
GuiApp_Init: GuiApp_Init:
; call base class ; call base class
bigcall OBJ_Init ; (r16, r17, X) bigcall OBJ_Init ; (r16, r17, X)
; clear object-specific data
mov xl, yl
mov xh, yh
adiw xh:xl, GUIAPP_OFFS_BEGIN
clr r16
ldi r17, (GUIAPP_SIZE-GUIAPP_OFFS_BEGIN)
bigcall Utils_FillSram ; (r17, X)
; set default signal map ; set default signal map
ldi r16, LOW(GuiApp_DefaultSignalmap*2) ldi r16, LOW(GuiApp_DefaultSignalmap*2)
std Y+OBJECT_OFFS_SIGNALMAP_LO, r16 std Y+OBJECT_OFFS_SIGNALMAP_LO, r16
@@ -103,13 +93,13 @@ GuiApp_Init:
push yh push yh
mov xl, yl mov xl, yl
mov xh, yh mov xh, yh
ldi r16, 0 ; opts_lo ldi r16, 0 ; opts
ldi r17, 0 ; opts_hi ldi r17, 0 ; pack
bigcall RootWindow_new bigcall RootWindow_new
; always visible ; always visible
ldd r16, Y+OBJECT_OFFS_FLAGS ldd r16, Y+OBJECT_OFFS_FLAGS
sbr r16, (1<<WIDGET_FLAGS_VISIBLE_BIT) sbr r16, (1<<WIDGET_FLAGS_VISIBLE_BIT) | (1<<WIDGET_FLAGS_LAYOUT_BIT) | (1<<WIDGET_FLAGS_DIRTY_BIT)
std Y+OBJECT_OFFS_FLAGS, r16 std Y+OBJECT_OFFS_FLAGS, r16
mov xl, yl mov xl, yl
@@ -245,6 +235,7 @@ GuiApp_UngrabTouchEvents_ret:
; ;
; @param Y address of object in SDRAM ; @param Y address of object in SDRAM
; @param CFLAG set if response is not a NULL pointer ; @param CFLAG set if response is not a NULL pointer
; @return r19:r18 root window
; @clobbers none ; @clobbers none
GuiApp_GetRootWindow: GuiApp_GetRootWindow:
@@ -377,8 +368,8 @@ GuiApp_OnDestroy:
; @clobbers any, !Y ; @clobbers any, !Y
GuiApp_OnTimer: GuiApp_OnTimer:
rcall guiAppCheckTouch ; (any, !Y) ; rcall guiAppCheckTouch ; (any, !Y)
rcall guiAppSendTimerEvents ; (any, !Y) ; rcall guiAppSendTimerEvents ; (any, !Y)
rcall guiAppCheckSendGuiEvents ; (any, !Y) rcall guiAppCheckSendGuiEvents ; (any, !Y)
sec sec
ret ret
@@ -421,9 +412,9 @@ GuiApp_OnTouch:
guiAppSendTimerEvents: guiAppSendTimerEvents:
ldi r16, OBJECT_SIGNAL_TIMER ldi r16, OBJECT_SIGNAL_TIMER
clr r17 clr r17
ldi r20, (1<<OBJECT_OPTSLO_TIMER_BIT) ldi r20, (1<<OBJECT_OPTS_TIMER_BIT)
ldi r21, (1<<OBJECT_OPTSLO_TIMER_BIT) ldi r21, (1<<OBJECT_OPTS_TIMER_BIT)
rcall guiAppSendRootEventsIfOptsLo rcall guiAppSendRootEventsIfOpts
sec sec
ret ret
; @end ; @end
@@ -460,7 +451,7 @@ guiAppCheckSendGuiEvents:
clr r17 clr r17
ldi r20, (1<<WIDGET_FLAGS_VISIBLE_BIT) | (1<<WIDGET_FLAGS_LAYOUT_BIT) ldi r20, (1<<WIDGET_FLAGS_VISIBLE_BIT) | (1<<WIDGET_FLAGS_LAYOUT_BIT)
bigcall OBJ_TreeHandleSignalIfFlagsSet ; (any, !Y) bigcall OBJ_TreeHandleSignalIfFlagsSet ; (any, !Y)
ldi r16, WIDGET_SIGNAL_DRAW ldi r16, WIDGET_SIGNAL_DRAW
clr r17 clr r17
ldi r20, (1<<WIDGET_FLAGS_VISIBLE_BIT) | (1<<WIDGET_FLAGS_DIRTY_BIT) ldi r20, (1<<WIDGET_FLAGS_VISIBLE_BIT) | (1<<WIDGET_FLAGS_DIRTY_BIT)
@@ -507,9 +498,9 @@ guiAppSendTouchEvents_sendToAll:
mov yh, r19 mov yh, r19
ldi r16, WIDGET_SIGNAL_TOUCH ldi r16, WIDGET_SIGNAL_TOUCH
clr r17 clr r17
ldi r20, (1<<WIDGET_OPTSLO_INPUT_BIT) ldi r20, (1<<WIDGET_OPTS_INPUT_BIT)
ldi r21, (1<<WIDGET_OPTSLO_INPUT_BIT) ldi r21, (1<<WIDGET_OPTS_INPUT_BIT)
bigcall OBJ_TreeHandleSignalIfMatchingOptsLo bigcall OBJ_TreeHandleSignalIfMatchingOpts
guiAppSendTouchEvents_done: guiAppSendTouchEvents_done:
pop yh pop yh
pop yl pop yl
@@ -533,9 +524,9 @@ guiAppSendTouchEvents_done:
guiAppSendRootMsgEvents: guiAppSendRootMsgEvents:
ldi r16, WIDGET_SIGNAL_TOUCH ldi r16, WIDGET_SIGNAL_TOUCH
clr r17 clr r17
ldi r20, (1<<OBJECT_OPTSLO_MSGRECV_BIT) ldi r20, (1<<OBJECT_OPTS_MSGRECV_BIT)
ldi r21, (1<<OBJECT_OPTSLO_MSGRECV_BIT) ldi r21, (1<<OBJECT_OPTS_MSGRECV_BIT)
rcall guiAppSendRootEventsIfOptsLo rcall guiAppSendRootEventsIfOpts
sec sec
ret ret
; @end ; @end
@@ -543,7 +534,7 @@ guiAppSendRootMsgEvents:
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine guiAppSendRootEventsIfOptsLo ; @routine guiAppSendRootEventsIfOpts
; ;
; Send events to all widgets with matching OPTS_LO. ; Send events to all widgets with matching OPTS_LO.
; ;
@@ -552,20 +543,20 @@ guiAppSendRootMsgEvents:
; @param R17 selector ; @param R17 selector
; @param xl param1 ; @param xl param1
; @param xh param2 ; @param xh param2
; @param r20 mask for OBJECT_OFFS_OPTS_LO ; @param r20 mask for OBJECT_OFFS_OPTS
; @param r21 value for OBJECT_OFFS_OPTS_LO to match ; @param r21 value for OBJECT_OFFS_OPTS to match
; @clobbers any, !Y ; @clobbers any, !Y
guiAppSendRootEventsIfOptsLo: guiAppSendRootEventsIfOpts:
push yl push yl
push yh push yh
rcall GuiApp_GetRootWindow ; r19:r18=root window (none) rcall GuiApp_GetRootWindow ; r19:r18=root window (none)
brcc guiAppSendRootEventsIfOptsLo_done brcc guiAppSendRootEventsIfOpts_done
; send signal to root window and all below ; send signal to root window and all below
mov yl, r18 mov yl, r18
mov yh, r19 mov yh, r19
bigcall OBJ_TreeHandleSignalIfMatchingOptsLo bigcall OBJ_TreeHandleSignalIfMatchingOpts
guiAppSendRootEventsIfOptsLo_done: guiAppSendRootEventsIfOpts_done:
pop yh pop yh
pop yl pop yl
ret ret
@@ -609,7 +600,7 @@ guiAppCheckTouch_ret:
GuiApp_DefaultSignalmap: GuiApp_DefaultSignalmap:
; header ; header
.dw Object_DefaultSignalmap ; next table to use .dw Object_DefaultSignalmap*2 ; next table to use
; entries ; entries
.db 0, OBJECT_SIGNAL_TIMER, LOW(GuiApp_OnTimer), HIGH(GuiApp_OnTimer) .db 0, OBJECT_SIGNAL_TIMER, LOW(GuiApp_OnTimer), HIGH(GuiApp_OnTimer)
.db 0, OBJECT_SIGNAL_DESTROY, LOW(GuiApp_OnDestroy), HIGH(GuiApp_OnDestroy) .db 0, OBJECT_SIGNAL_DESTROY, LOW(GuiApp_OnDestroy), HIGH(GuiApp_OnDestroy)

View File

@@ -34,8 +34,8 @@
; @return CFLAG set of okay, cleared otherwise ; @return CFLAG set of okay, cleared otherwise
; @return Y address of newly created object ; @return Y address of newly created object
; @param X parent widget ; @param X parent widget
; @param r16 value for OBJECT_OFFS_OPTS_LO ; @param r16 value for OBJECT_OFFS_OPTS
; @param r17 value for OBJECT_OFFS_OPTS_HI ; @param r17 value for WIDGET_OFFS_PACK
; @param r21:r20 ressource id for title ; @param r21:r20 ressource id for title
; @clobbers any ; @clobbers any
@@ -127,21 +127,21 @@ HLayout_OnGetDefaultWidth:
HLayout_OnGetDefaultHeight: HLayout_OnGetDefaultHeight:
rcall Layout_SetDefaultHeights rcall Layout_SetDefaultHeights
rcall Layout_GetMaxTmp rcall Layout_GetMaxTmp ; r19:r18=max tmp value (r20, r21)
; get outer border ; get outer border
ldd zl, Y+WIDGET_OFFS_STYLE_LO ldd zl, Y+WIDGET_OFFS_STYLE_LO
ldd zh, Y+WIDGET_OFFS_STYLE_HI ldd zh, Y+WIDGET_OFFS_STYLE_HI
adiw zh:zl, WIDGET_STYLE_OFFS_OUTERBORDERSIZE adiw zh:zl, WIDGET_STYLE_OFFS_OUTERBORDERSIZE
lpm r16, Z lpm r20, Z
clr r17 clr r21
sbiw zh:zl, WIDGET_STYLE_OFFS_OUTERBORDERSIZE sbiw zh:zl, WIDGET_STYLE_OFFS_OUTERBORDERSIZE
add r18, r16 ; add outer border (top) add r18, r20 ; add outer border (top)
adc r19, r17 adc r19, r21
add r18, r16 ; add outer border (bottom) add r18, r20 ; add outer border (bottom)
adc r19, r17 adc r19, r21
sec sec
ret ret
@@ -156,51 +156,6 @@ HLayout_OnGetDefaultHeight:
; @clobbers r16, r17, r18, r19, r20, r21, r22, r23, Z ; @clobbers r16, r17, r18, r19, r20, r21, r22, r23, Z
hLayoutSetX: hLayoutSetX:
ldd zl, Y+WIDGET_OFFS_STYLE_LO
ldd zh, Y+WIDGET_OFFS_STYLE_HI
; get spacing
adiw zh:zl, WIDGET_STYLE_OFFS_SPACING
lpm r22, Z
clr r23
sbiw zh:zl, WIDGET_STYLE_OFFS_SPACING
; get outer border
adiw zh:zl, WIDGET_STYLE_OFFS_OUTERBORDERSIZE
lpm r20, Z
clr r21
sbiw zh:zl, WIDGET_STYLE_OFFS_OUTERBORDERSIZE
push yl
push yh
bigcall OBJ_GetFirstChild
hLayoutSetX_loop:
brcc hLayoutSetX_loopEnd
mov yl, r18
mov yh, r19
; set X
std Y+WIDGET_OFFS_X_LO, r20
std Y+WIDGET_OFFS_X_HI, r21
; set width
ldd r16, Y+WIDGET_OFFS_TMP_LO
ldd r17, Y+WIDGET_OFFS_TMP_HI
std Y+WIDGET_OFFS_WIDTH_LO, r16
std Y+WIDGET_OFFS_WIDTH_HI, r17
; advance r21:r20
add r20, r16 ; add widget size
adc r21, r17
add r20, r22 ; add spacing
adc r21, r23
; force direct children to re-layout and re-draw
ldd r16, Y+OBJECT_OFFS_FLAGS
ori r16, (1<<WIDGET_FLAGS_DIRTY_BIT) | (1<<WIDGET_FLAGS_LAYOUT_BIT)
std Y+OBJECT_OFFS_FLAGS, r16
rcall OBJ_GetNext
rjmp hLayoutSetX_loop
hLayoutSetX_loopEnd:
pop yh
pop yl
ret ret
; @end ; @end
@@ -213,87 +168,12 @@ hLayoutSetX_loopEnd:
; @clobbers r17, r18, r19, r20, r21, r22, r23, Z ; @clobbers r17, r18, r19, r20, r21, r22, r23, Z
hLayoutVerticalAdjust: hLayoutVerticalAdjust:
bigcall Layout_SetDefaultHeights
ldd zl, Y+WIDGET_OFFS_STYLE_LO
ldd zh, Y+WIDGET_OFFS_STYLE_HI
; get outer border
adiw zh:zl, WIDGET_STYLE_OFFS_OUTERBORDERSIZE
lpm r20, Z
clr r21
sbiw zh:zl, WIDGET_STYLE_OFFS_OUTERBORDERSIZE
ldd r22, Y+WIDGET_OFFS_HEIGHT_LO
ldd r23, Y+WIDGET_OFFS_HEIGHT_HI
sub r22, r20 ; subtract border (top)
sbc r23, r21
sub r22, r20 ; subtract border (bottom)
sbc r23, r21
push yl
push yh
bigcall OBJ_GetFirstChild
hLayoutVerticalAdjust_loop:
brcc hLayoutVerticalAdjust_loopEnd
mov yl, r18
mov yh, r19
std Y+WIDGET_OFFS_Y_LO, r20
std Y+WIDGET_OFFS_Y_HI, r21
ldd r18, Y+WIDGET_OFFS_TMP_LO
ldd r19, Y+WIDGET_OFFS_TMP_HI
ldd r17, Y+OBJECT_OFFS_OPTS_LO
sbrs r17, WIDGET_OPTSLO_FILLY_BIT
rjmp hLayoutVerticalAdjust_setHeight
mov r18, r22 ; increase height to full height
mov r19, r23
hLayoutVerticalAdjust_setHeight:
std Y+WIDGET_OFFS_HEIGHT_LO, r18
std Y+WIDGET_OFFS_HEIGHT_HI, r19
rcall OBJ_GetNext
rjmp hLayoutVerticalAdjust_loop
hLayoutVerticalAdjust_loopEnd:
pop yh
pop yl
ret ret
; @end ; @end
hLayoutHorizontally: hLayoutHorizontally:
rcall Layout_SetDefaultWidths
rcall Layout_SumTmpValues ; r21:r20=width
ldd r22, Y+WIDGET_OFFS_WIDTH_LO
ldd r23, Y+WIDGET_OFFS_WIDTH_HI
sub r22, r20
sbc r23, r21
breq hLayoutHorizontally_setX
brcs hLayoutHorizontally_setX
; r23:r22=remaining space to distribute
push r22
ldi r22, (1<<WIDGET_OPTSLO_FILLX_BIT)
rcall LayoutCountExpandableChildren ; r16=number of expandable child widgets
pop r22
tst r16
breq hLayoutHorizontally_setX
; calc space to add to each expandable child widget and add it
mov r20, r22
mov r21, r23
mov r22, r16
clr r23
bigcall Utils_Divu16_16_16 ; r17:r16=space per expandable child widget
mov r20, r16
mov r21, r17
ldi r22, (1<<WIDGET_OPTSLO_FILLX_BIT)
rcall Layout_AddToTmpOfFillXChildren
hLayoutHorizontally_setX:
rcall hLayoutSetX
ret ret
; @end ; @end
@@ -306,7 +186,7 @@ hLayoutHorizontally_setX:
HLayout_DefaultSignalmap: HLayout_DefaultSignalmap:
; header ; header
.dw Widget_DefaultSignalmap ; next table to use .dw Widget_DefaultSignalmap*2 ; next table to use
; entries ; entries
.db 0, WIDGET_SIGNAL_LAYOUT, LOW(HLayout_OnLayout), HIGH(HLayout_OnLayout) .db 0, WIDGET_SIGNAL_LAYOUT, LOW(HLayout_OnLayout), HIGH(HLayout_OnLayout)
.db WIDGET_VALUE_DEFAULT_WIDTH, WIDGET_SIGNAL_GETVALUE, LOW(HLayout_OnGetDefaultWidth), HIGH(HLayout_OnGetDefaultWidth) .db WIDGET_VALUE_DEFAULT_WIDTH, WIDGET_SIGNAL_GETVALUE, LOW(HLayout_OnGetDefaultWidth), HIGH(HLayout_OnGetDefaultWidth)

View File

@@ -35,8 +35,8 @@
; @return CFLAG set of okay, cleared otherwise ; @return CFLAG set of okay, cleared otherwise
; @return Y address of newly created object ; @return Y address of newly created object
; @param X parent widget ; @param X parent widget
; @param r16 value for OBJECT_OFFS_OPTS_LO ; @param r16 value for OBJECT_OFFS_OPTS
; @param r17 value for OBJECT_OFFS_OPTS_HI ; @param r17 value for WIDGET_OFFS_PACK
; @param r21:r20 ressource id for label text ; @param r21:r20 ressource id for label text
; @clobbers any ; @clobbers any
@@ -62,8 +62,8 @@ Label_new_ret:
; ;
; @param Y address of widget ; @param Y address of widget
; @param X parent widget (if any) ; @param X parent widget (if any)
; @param r16 value for OBJECT_OFFS_OPTS_LO ; @param r16 value for OBJECT_OFFS_OPTS
; @param r17 value for OBJECT_OFFS_OPTS_HI ; @param r17 value for WIDGET_OFFS_PACK
; @param r21:r20 ressource id for label text ; @param r21:r20 ressource id for label text
; @clobbers r16, r17, X ; @clobbers r16, r17, X
@@ -72,14 +72,6 @@ Label_Init:
push r21 push r21
; call base class ; call base class
bigcall Widget_Init ; (r16, r17, X) bigcall Widget_Init ; (r16, r17, X)
; clear widget-specific data
mov xl, yl
mov xh, yh
adiw xh:xl, LABEL_OFFS_BEGIN
clr r16
ldi r17, (LABEL_SIZE-LABEL_OFFS_BEGIN)
bigcall Utils_FillSram ; (r17, X)
pop r21 pop r21
pop r20 pop r20
@@ -138,8 +130,8 @@ Label_OnDraw:
bigcall Widget_Clear bigcall Widget_Clear
rcall labelWriteText rcall labelWriteText
ldd r16, Y+OBJECT_OFFS_OPTS_LO ldd r16, Y+OBJECT_OFFS_OPTS
andi r16, (1<<WIDGET_OPTSLO_BORDER_BIT) andi r16, (1<<WIDGET_OPTS_BORDER_BIT)
breq Label_OnDraw_done breq Label_OnDraw_done
bigcall Widget_DrawBorder bigcall Widget_DrawBorder
@@ -169,10 +161,17 @@ Label_OnGetDefaultWidth:
rcall labelCalcTextWidth rcall labelCalcTextWidth
mov r18, r12 mov r18, r12
mov r19, r13 mov r19, r13
ldi r16, 2 ; add small border around text
add r18, r16 ; add borders
adc r19, r16 ldd zl, Y+WIDGET_OFFS_STYLE_LO
sub r19, r16 ldd zh, Y+WIDGET_OFFS_STYLE_HI
adiw zh:zl, WIDGET_STYLE_OFFS_OUTERBORDERSIZE
lpm r20, Z
clr r21
add r18, r20 ; add border at begin
adc r19, r21
add r18, r20 ; add border at end
adc r19, r21
sec sec
ret ret
; @end ; @end
@@ -183,7 +182,6 @@ Label_OnGetDefaultWidth:
; @routine Label_OnGetDefaultHeight @global ; @routine Label_OnGetDefaultHeight @global
; ;
; @param Y address of widget ; @param Y address of widget
; @param r17 value requested
; @param xl param1 ; @param xl param1
; @param xh param2 ; @param xh param2
; @return CFLAG set if signal handled ; @return CFLAG set if signal handled
@@ -194,10 +192,17 @@ Label_OnGetDefaultHeight:
rcall Widget_GetCharHeight ; R16=char height rcall Widget_GetCharHeight ; R16=char height
mov r18, r16 mov r18, r16
clr r19 clr r19
ldi r16, 2 ; add small border around text
add r18, r16 ; add borders
adc r19, r16 ldd zl, Y+WIDGET_OFFS_STYLE_LO
sub r19, r16 ldd zh, Y+WIDGET_OFFS_STYLE_HI
adiw zh:zl, WIDGET_STYLE_OFFS_OUTERBORDERSIZE
lpm r20, Z
clr r21
add r18, r20 ; add border at begin
adc r19, r21
add r18, r20 ; add border at end
adc r19, r21
sec sec
ret ret
; @end ; @end
@@ -231,12 +236,12 @@ labelWriteText_ret:
labelAlignTextXY: labelAlignTextXY:
rcall labelCalcTextWidth ; Z=text, R13:R12=text width (r16, r17, r18) rcall labelCalcTextWidth ; Z=text, R13:R12=text width (r16, r17, r18)
rcall Widget_AlignContentX ; (r8, r9, r10, r11, r12, r13, r14, r15, r16, r17, r18, r19, r20, r21, r22, r23, r24, r25) rcall Widget_PackContentX ; R5:R4=X (r17, r18, r19, r20, r21)
rcall Widget_GetCharHeight ; R16=char height rcall Widget_GetCharHeight ; R16=char height
mov r12, r16 mov r12, r16
clr r13 clr r13
rcall Widget_AlignContentY ; (r8, r9, r10, r11, r12, r13, r14, r15, r16, r17, r18, r19, r20, r21, r22, r23, r24, r25) rcall Widget_PackContentY ; R7:R6=Y (r17, r18, r19, r20, r21)
ret ret
; @end ; @end
@@ -274,7 +279,7 @@ labelCalcTextWidth_ret:
Label_DefaultSignalmap: Label_DefaultSignalmap:
; header ; header
.dw Widget_DefaultSignalmap ; next table to use .dw Widget_DefaultSignalmap*2 ; next table to use
; entries ; entries
.db 0, WIDGET_SIGNAL_DRAW, LOW(Label_OnDraw), HIGH(Label_OnDraw) .db 0, WIDGET_SIGNAL_DRAW, LOW(Label_OnDraw), HIGH(Label_OnDraw)
.db WIDGET_VALUE_DEFAULT_WIDTH, WIDGET_SIGNAL_GETVALUE, LOW(Label_OnGetDefaultWidth), HIGH(Label_OnGetDefaultWidth) .db WIDGET_VALUE_DEFAULT_WIDTH, WIDGET_SIGNAL_GETVALUE, LOW(Label_OnGetDefaultWidth), HIGH(Label_OnGetDefaultWidth)

View File

@@ -27,7 +27,8 @@
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine Layout_SetDefaultWidths ; @routine Layout_SetDefaultWidths
; ;
; Set defaultWidth in WIDGET_OFFS_TMP_LO/HI ; Set default width in WIDGET_OFFS_TMP_LO/HI of child widgets
; Ignores invisible widgets.
; ;
; @param Y pointer to widget ; @param Y pointer to widget
; @clobbers any, !Y ; @clobbers any, !Y
@@ -36,15 +37,19 @@ Layout_SetDefaultWidths:
push yl push yl
push yh push yh
bigcall OBJ_GetFirstChild bigcall OBJ_GetFirstChild
brcc Layout_SetDefaultWidths_ret
Layout_SetDefaultWidths_loop: Layout_SetDefaultWidths_loop:
brcc Layout_SetDefaultWidths_ret
mov yl, r18 mov yl, r18
mov yh, r19 mov yh, r19
ldd r18, Y+OBJECT_OFFS_FLAGS
sbrs r18, WIDGET_FLAGS_VISIBLE_BIT
rjmp Layout_SetDefaultWidths_next
bigcall Widget_GetDefaultWidth bigcall Widget_GetDefaultWidth
std Y+WIDGET_OFFS_TMP_LO, r18 std Y+WIDGET_OFFS_TMP_LO, r18
std Y+WIDGET_OFFS_TMP_HI, r19 std Y+WIDGET_OFFS_TMP_HI, r19
Layout_SetDefaultWidths_next:
rcall OBJ_GetNext rcall OBJ_GetNext
rjmp Layout_SetDefaultWidths_loop brcs Layout_SetDefaultWidths_loop
Layout_SetDefaultWidths_ret: Layout_SetDefaultWidths_ret:
pop yh pop yh
pop yl pop yl
@@ -56,6 +61,9 @@ Layout_SetDefaultWidths_ret:
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine Layout_SetDefaultHeights ; @routine Layout_SetDefaultHeights
; ;
; Set default height in WIDGET_OFFS_TMP_LO/HI of child widgets
; Ignores invisible widgets.
;
; @param Y pointer to widget ; @param Y pointer to widget
; @clobbers any, !Y ; @clobbers any, !Y
@@ -63,15 +71,19 @@ Layout_SetDefaultHeights:
push yl push yl
push yh push yh
bigcall OBJ_GetFirstChild bigcall OBJ_GetFirstChild
brcc Layout_SetDefaultHeights_ret
Layout_SetDefaultHeights_loop: Layout_SetDefaultHeights_loop:
brcc Layout_SetDefaultHeights_ret
mov yl, r18 mov yl, r18
mov yh, r19 mov yh, r19
ldd r18, Y+OBJECT_OFFS_FLAGS
sbrs r18, WIDGET_FLAGS_VISIBLE_BIT
rjmp Layout_SetDefaultHeights_next
bigcall Widget_GetDefaultHeight bigcall Widget_GetDefaultHeight
std Y+WIDGET_OFFS_TMP_LO, r18 std Y+WIDGET_OFFS_TMP_LO, r18
std Y+WIDGET_OFFS_TMP_HI, r19 std Y+WIDGET_OFFS_TMP_HI, r19
Layout_SetDefaultHeights_next:
rcall OBJ_GetNext rcall OBJ_GetNext
rjmp Layout_SetDefaultHeights_loop brcs Layout_SetDefaultHeights_loop
Layout_SetDefaultHeights_ret: Layout_SetDefaultHeights_ret:
pop yh pop yh
pop yl pop yl
@@ -83,6 +95,8 @@ Layout_SetDefaultHeights_ret:
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine Layout_SumTmpValues ; @routine Layout_SumTmpValues
; ;
; Ignores invisible widgets.
;
; @param Y pointer to widget ; @param Y pointer to widget
; @return r19:r18 total width of all child widgets plus space between ; @return r19:r18 total width of all child widgets plus space between
; @clobbers r16, r17, r18, r19, r20, r21, r22, r23, Z ; @clobbers r16, r17, r18, r19, r20, r21, r22, r23, Z
@@ -105,20 +119,23 @@ Layout_SumTmpValues:
push yl push yl
push yh push yh
bigcall OBJ_GetFirstChild bigcall OBJ_GetFirstChild
brcc Layout_SumTmpValues_loopEnd
Layout_SumTmpValues_loop: Layout_SumTmpValues_loop:
brcc Layout_SumTmpValues_loopEnd
mov yl, r18 mov yl, r18
mov yh, r19 mov yh, r19
ldd r18, Y+OBJECT_OFFS_FLAGS
sbrs r18, WIDGET_FLAGS_VISIBLE_BIT
rjmp Layout_SumTmpValues_next
ldd r18, Y+WIDGET_OFFS_TMP_LO ldd r18, Y+WIDGET_OFFS_TMP_LO
ldd r19, Y+WIDGET_OFFS_TMP_HI ldd r19, Y+WIDGET_OFFS_TMP_HI
add r20, r18 ; add widget size add r20, r18 ; add widget size
adc r21, r19 adc r21, r19
add r20, r22 ; add spacing add r20, r22 ; add spacing
adc r20, r22 adc r21, r22
sub r20, r22 sub r21, r22
Layout_SumTmpValues_next:
rcall OBJ_GetNext rcall OBJ_GetNext
rjmp Layout_SumTmpValues_loop brcs Layout_SumTmpValues_loop
Layout_SumTmpValues_loopEnd: Layout_SumTmpValues_loopEnd:
mov r16, r20 mov r16, r20
or r16, r21 or r16, r21
@@ -145,9 +162,11 @@ Layout_SumTmpValues_done:
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine Layout_GetMaxTmp ; @routine Layout_GetMaxTmp
; ;
; Ignores invisible widgets.
;
; @param Y pointer to widget ; @param Y pointer to widget
; @return r19:r18 maximum value in WIDGET_OFFS_TMP_LO/HI of children ; @return r19:r18 maximum value in WIDGET_OFFS_TMP_LO/HI of children
; @clobbers any, !Y ; @clobbers r20, r21
Layout_GetMaxTmp: Layout_GetMaxTmp:
clr r20 clr r20
@@ -159,6 +178,9 @@ Layout_GetMaxTmp_loop:
brcc Layout_GetMaxTmp_ret brcc Layout_GetMaxTmp_ret
mov yl, r18 mov yl, r18
mov yh, r19 mov yh, r19
ldd r18, Y+OBJECT_OFFS_FLAGS
sbrs r18, WIDGET_FLAGS_VISIBLE_BIT
rjmp Layout_GetMaxTmp_next
ldd r18, Y+WIDGET_OFFS_TMP_LO ldd r18, Y+WIDGET_OFFS_TMP_LO
ldd r19, Y+WIDGET_OFFS_TMP_HI ldd r19, Y+WIDGET_OFFS_TMP_HI
; max ; max
@@ -181,34 +203,35 @@ Layout_GetMaxTmp_ret:
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine Layout_AddToTmpOfFillXChildren ; @routine LayoutCountChildrenWithPackMode
; ;
; @param Y pointer to widget ; @param Y pointer to widget
; @param R21:R20 value to add to tmp value of expandable widgets ; @param r22 mask for WIDGET_OFFS_PACK
; @param r22 mask for OBJECT_OFFS_OPTS_LO (e.g. 1<<WIDGET_OPTSLO_FILLX_BIT) ; @param r23 value for WIDGET_OFFS_PACK
; @return r16 number of matching children
; @clobbers r17, r18, r19
Layout_AddToTmpOfFillXChildren: LayoutCountChildrenWithPackMode:
clr r16 clr r16
push yl push yl
push yh push yh
bigcall OBJ_GetFirstChild bigcall OBJ_GetFirstChild
Layout_AddToTmpOfFillXChildren_loop: LayoutCountChildrenWithPackMode_loop:
brcc Layout_AddToTmpOfFillXChildren_done brcc LayoutCountChildrenWithPackMode_done
mov yl, r18 mov yl, r18
mov yh, r19 mov yh, r19
ldd r17, Y+OBJECT_OFFS_OPTS_LO ldd r17, Y+OBJECT_OFFS_FLAGS
sbrs r17, WIDGET_FLAGS_VISIBLE_BIT ; skip invisible widgets
rjmp LayoutCountChildrenWithPackMode_next
ldd r17, Y+WIDGET_OFFS_PACK
eor r17, r23
and r17, r22 and r17, r22
breq Layout_AddToTmpOfFillXChildren_next brne LayoutCountChildrenWithPackMode_next
ldd r16, Y+WIDGET_OFFS_TMP_LO inc r16
ldd r17, Y+WIDGET_OFFS_TMP_HI LayoutCountChildrenWithPackMode_next:
add r16, r20
adc r17, r21
std Y+WIDGET_OFFS_TMP_LO, r16
std Y+WIDGET_OFFS_TMP_HI, r17
Layout_AddToTmpOfFillXChildren_next:
rcall OBJ_GetNext rcall OBJ_GetNext
rjmp Layout_AddToTmpOfFillXChildren_loop rjmp LayoutCountChildrenWithPackMode_loop
Layout_AddToTmpOfFillXChildren_done: LayoutCountChildrenWithPackMode_done:
pop yh pop yh
pop yl pop yl
ret ret
@@ -217,30 +240,71 @@ Layout_AddToTmpOfFillXChildren_done:
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine LayoutCountExpandableChildren ; @routine LayoutCountVisibleChildren
; ;
; @param Y pointer to widget ; @param Y pointer to widget
; @param r22 mask for OBJECT_OFFS_OPTS_LO (e.g. 1<<WIDGET_OPTSLO_FILLX_BIT) ; @return r16 number of matching children
; @return r16 number of children with opt WIDGET_OPTSLO_FILLX_BIT
; @clobbers r17, r18, r19 ; @clobbers r17, r18, r19
LayoutCountExpandableChildren: LayoutCountVisibleChildren:
clr r16 clr r16
push yl push yl
push yh push yh
bigcall OBJ_GetFirstChild bigcall OBJ_GetFirstChild
LayoutCountExpandableChildren_loop: LayoutCountVisibleChildren_loop:
brcc LayoutCountExpandableChildren_done brcc LayoutCountVisibleChildren_done
mov yl, r18 mov yl, r18
mov yh, r19 mov yh, r19
ldd r17, Y+OBJECT_OFFS_OPTS_LO ldd r17, Y+OBJECT_OFFS_FLAGS
and r17, r22 sbrc r17, WIDGET_FLAGS_VISIBLE_BIT ; skip invisible widgets
breq LayoutCountExpandableChildren_next inc r16
inc r16 LayoutCountVisibleChildren_next:
LayoutCountExpandableChildren_next:
rcall OBJ_GetNext rcall OBJ_GetNext
rjmp LayoutCountExpandableChildren_loop rjmp LayoutCountVisibleChildren_loop
LayoutCountExpandableChildren_done: LayoutCountVisibleChildren_done:
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine LayoutIncTmpOnMatchingPack
;
; Ignores invisible widgets.
;
; @param Y pointer to widget
; @param R21:R20 value to add to tmp value of expandable widgets
; @param r22 mask for WIDGET_OFFS_PACK
; @param r23 value for WIDGET_OFFS_PACK
; @clobbers r16, r18, r19
LayoutIncTmpOnMatchingPack:
push yl
push yh
bigcall OBJ_GetFirstChild
brcc LayoutIncTmpOnMatchingPack_done
LayoutIncTmpOnMatchingPack_loop:
mov yl, r18
mov yh, r19
ldd r16, Y+OBJECT_OFFS_FLAGS
sbrs r16, WIDGET_FLAGS_VISIBLE_BIT ; skip invisible widgets
rjmp LayoutIncTmpOnMatchingPack_next
ldd r16, Y+WIDGET_OFFS_PACK
eor r16, r23
and r16, r22
brne LayoutIncTmpOnMatchingPack_next
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
LayoutIncTmpOnMatchingPack_next:
rcall OBJ_GetNext
brcs LayoutIncTmpOnMatchingPack_loop
LayoutIncTmpOnMatchingPack_done:
pop yh pop yh
pop yl pop yl
ret ret
@@ -251,5 +315,8 @@ LayoutCountExpandableChildren_done:
#endif #endif

View File

@@ -10,8 +10,6 @@
#ifndef AQH_AVR_GUI2_MAINWINDOW_ASM #ifndef AQH_AVR_GUI2_MAINWINDOW_ASM
#define AQH_AVR_GUI2_MAINWINDOW_ASM #define AQH_AVR_GUI2_MAINWINDOW_ASM
; TODO: base on VLayout!
; *************************************************************************** ; ***************************************************************************
; defines ; defines
@@ -35,8 +33,8 @@
; @return CFLAG set of okay, cleared otherwise ; @return CFLAG set of okay, cleared otherwise
; @return Y address of newly created object ; @return Y address of newly created object
; @param X parent widget ; @param X parent widget
; @param r16 value for OBJECT_OFFS_OPTS_LO ; @param r16 value for OBJECT_OFFS_OPTS
; @param r17 value for OBJECT_OFFS_OPTS_HI ; @param r17 value for WIDGET_OFFS_PACK
; @param r21:r20 ressource id for title ; @param r21:r20 ressource id for title
; @clobbers any ; @clobbers any
@@ -62,6 +60,8 @@ MainWindow_new_ret:
; ;
; @param Y address of widget ; @param Y address of widget
; @param X parent widget (if any) ; @param X parent widget (if any)
; @param r16 value for OBJECT_OFFS_OPTS
; @param r17 value for WIDGET_OFFS_PACK
; @param r21:r20 ressource id for title ; @param r21:r20 ressource id for title
; @clobbers r16, r17, X ; @clobbers r16, r17, X
@@ -81,14 +81,14 @@ MainWindow_Init:
; set style which has no spacing and no borders so needs no drawing because ; set style which has no spacing and no borders so needs no drawing because
; the children fill the screen completely ; the children fill the screen completely
ldi r16, LOW(MainWindow_DefaultStyle) ldi r16, LOW(MainWindow_DefaultStyle*2)
std Y+WIDGET_OFFS_STYLE_LO, r16 std Y+WIDGET_OFFS_STYLE_LO, r16
ldi r16, HIGH(MainWindow_DefaultStyle) ldi r16, HIGH(MainWindow_DefaultStyle*2)
std Y+WIDGET_OFFS_STYLE_HI, r16 std Y+WIDGET_OFFS_STYLE_HI, r16
; create sub widgets ; create sub widgets
rcall mainWindowCreateTitleWidget rcall mainWindowCreateTitleWidget
rcall mainWindowCreateContentWidget ; rcall mainWindowCreateContentWidget
ret ret
; @end ; @end
@@ -168,8 +168,9 @@ mainWindowCreateTitleWidget:
push yh push yh
mov xl, yl mov xl, yl
mov xh, yh mov xh, yh
ldi r16, (1<<WIDGET_OPTSLO_FILLX_BIT) ldi r16, 0
ldi r17, (WIDGET_XALIGN_LEFT<<WIDGET_OPTSHI_CONTENT_XALIGN0_BIT) | (WIDGET_YALIGN_CENTER<<WIDGET_OPTSHI_CONTENT_YALIGN0_BIT) ldi r17, (WIDGET_PACK_FILLED<<WIDGET_PACK_HSELF0_BIT) | (WIDGET_PACK_BEGIN<<WIDGET_PACK_VSELF0_BIT) | \
(WIDGET_PACK_BEGIN <<WIDGET_PACK_HCONTENT0_BIT) | (WIDGET_PACK_CENTER<<WIDGET_PACK_VCONTENT0_BIT)
bigcall Label_new bigcall Label_new
brcc mainWindowCreateTitleWidget_done brcc mainWindowCreateTitleWidget_done
; set style for title widget ; set style for title widget
@@ -199,9 +200,9 @@ mainWindowCreateContentWidget:
push yh push yh
mov xl, yl mov xl, yl
mov xh, yh mov xh, yh
ldi r16, (1<<WIDGET_OPTSLO_FILLX_BIT) | (1<<WIDGET_OPTSLO_FILLY_BIT) ldi r16, 0 ; OPTS
ldi r17, 0 ; opts hi ldi r17, (WIDGET_PACK_FILLED<<WIDGET_PACK_HSELF0_BIT) | (WIDGET_PACK_FILLED<<WIDGET_PACK_VSELF0_BIT) ; PACK
bigcall Widget_new bigcall VLayout_new
brcc mainWindowCreateContentWidget_done brcc mainWindowCreateContentWidget_done
; set style for title widget ; set style for title widget
ldi r16, LOW(MainWindow_ContentStyle*2) ldi r16, LOW(MainWindow_ContentStyle*2)
@@ -223,7 +224,7 @@ mainWindowCreateContentWidget_done:
MainWindow_DefaultSignalmap: MainWindow_DefaultSignalmap:
; header ; header
.dw VLayout_DefaultSignalmap ; next table to use .dw VLayout_DefaultSignalmap*2 ; next table to use
; entries ; entries
.db 0, WIDGET_SIGNAL_DRAW, LOW(Widget_OnDraw), HIGH(Widget_OnDraw) .db 0, WIDGET_SIGNAL_DRAW, LOW(Widget_OnDraw), HIGH(Widget_OnDraw)
.db WIDGET_VALUE_DEFAULT_WIDTH, WIDGET_SIGNAL_GETVALUE, LOW(MainWindow_OnGetDefaultWidth), HIGH(MainWindow_OnGetDefaultWidth) .db WIDGET_VALUE_DEFAULT_WIDTH, WIDGET_SIGNAL_GETVALUE, LOW(MainWindow_OnGetDefaultWidth), HIGH(MainWindow_OnGetDefaultWidth)

View File

@@ -51,15 +51,14 @@
.equ OBJECT_OFFS_SELECTOR = 7 .equ OBJECT_OFFS_SELECTOR = 7
.equ OBJECT_OFFS_TARGET_LO = 8 .equ OBJECT_OFFS_TARGET_LO = 8
.equ OBJECT_OFFS_TARGET_HI = 9 .equ OBJECT_OFFS_TARGET_HI = 9
.equ OBJECT_OFFS_OPTS_LO = 10 .equ OBJECT_OFFS_SIGNALMAP_LO = 10 ; byte address (for LPM!)
.equ OBJECT_OFFS_OPTS_HI = 11 .equ OBJECT_OFFS_SIGNALMAP_HI = 11
.equ OBJECT_OFFS_SIGNALMAP_LO = 12 ; byte address (for LPM!) .equ OBJECT_OFFS_OPTS = 12
.equ OBJECT_OFFS_SIGNALMAP_HI = 13 .equ OBJECT_SIZE = 13
.equ OBJECT_SIZE = 14
; object opts_lo ; object opts_lo
.equ OBJECT_OPTSLO_TIMER_BIT = 7 .equ OBJECT_OPTS_TIMER_BIT = 7
.equ OBJECT_OPTSLO_MSGRECV_BIT = 6 .equ OBJECT_OPTS_MSGRECV_BIT = 6
; SignalMap entries ; SignalMap entries
.equ OBJECT_SIGNALMAP_OFFS_HEADER = 0 .equ OBJECT_SIGNALMAP_OFFS_HEADER = 0
@@ -99,12 +98,21 @@ Object_Alloc:
push xh push xh
push r16 push r16
push r17 push r17
bigcall Heap_Alloc ; X=mem allocated (r16, r17, r18, r19, r24, r25, X) push r24
push r25
bigcall Heap_Alloc ; X=mem allocated (r16, r17, r18, r19, r24, r25, X)
pop r25
pop r24
pop r17 pop r17
pop r16 pop r16
brcc Object_Alloc_ret brcc Object_Alloc_ret
mov yl, xl mov yl, xl
mov yh, xh mov yh, xh
clr r18
Object_Alloc_loop:
st X+, r18
sbiw r25:r24, 1
brne Object_Alloc_loop
sec sec
Object_Alloc_ret: Object_Alloc_ret:
pop xh pop xh
@@ -118,24 +126,12 @@ Object_Alloc_ret:
; @routine OBJ_Init @global ; @routine OBJ_Init @global
; ;
; @param Y address of object in SDRAM ; @param Y address of object in SDRAM
; @param r16 value for OBJECT_OFFS_OPTS_LO ; @param r16 value for OBJECT_OFFS_OPTS
; @param r17 value for OBJECT_OFFS_OPTS_HI
; @clobbers r16, r17, X ; @clobbers r16, r17, X
OBJ_Init: OBJ_Init:
push r16
push r17
mov xl, yl
mov xh, yh
clr r16
ldi r17, OBJECT_SIZE
bigcall Utils_FillSram ; (r17, X)
pop r17
pop r16
; set opts ; set opts
std Y+OBJECT_OFFS_OPTS_LO, r16 std Y+OBJECT_OFFS_OPTS, r16
std Y+OBJECT_OFFS_OPTS_HI, r17
; set default signal map ; set default signal map
ldi r16, LOW(Object_DefaultSignalmap*2) ldi r16, LOW(Object_DefaultSignalmap*2)
@@ -287,8 +283,8 @@ OBJ_GetFirstChild:
brne OBJ_GetFirstChild_notNull brne OBJ_GetFirstChild_notNull
rjmp OBJ_GetFirstChild_clcRet rjmp OBJ_GetFirstChild_clcRet
OBJ_GetFirstChild_notNull: OBJ_GetFirstChild_notNull:
ldd r18, Y+OBJECT_OFFS_PARENT_LO ldd r18, Y+OBJECT_OFFS_CHILD_LO
ldd r19, Y+OBJECT_OFFS_PARENT_HI ldd r19, Y+OBJECT_OFFS_CHILD_HI
tst r18 tst r18
brne OBJ_GetFirstChild_secRet brne OBJ_GetFirstChild_secRet
tst r19 tst r19
@@ -394,7 +390,7 @@ OBJ_AddChild:
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine objAddObjXAsChildToY ; @routine objAddObjXAsChildToY
; ;
; @param Y object to add to ; @param Y designated parent
; @param X object to add ; @param X object to add
; @clobbers r18, r19 ; @clobbers r18, r19
@@ -551,7 +547,15 @@ OBJ_HandleSignal_loop:
; try this table ; try this table
push zl push zl
push zh push zh
rcall objHandleSignalWithMap ; (any, !Y) push r16
push r17
push xl
push xh
rcall objHandleSignalWithMap ; (any, !Y)
pop xh
pop xl
pop r17
pop r16
pop zh pop zh
pop zl pop zl
brcs OBJ_HandleSignal_ret brcs OBJ_HandleSignal_ret
@@ -608,18 +612,18 @@ OBJ_TreeHandleSignal_done:
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine OBJ_TreeHandleSignalIfMatchingOptsLo @global @recursive ; @routine OBJ_TreeHandleSignalIfMatchingOpts @global @recursive
; ;
; @param Y address of object ; @param Y address of object
; @param R16 signal number ; @param R16 signal number
; @param R17 selector ; @param R17 selector
; @param xl param1 ; @param xl param1
; @param xh param2 ; @param xh param2
; @param r20 mask for OBJECT_OFFS_OPTS_LO ; @param r20 mask for OBJECT_OFFS_OPTS
; @param r21 value for OBJECT_OFFS_OPTS_LO to match ; @param r21 value for OBJECT_OFFS_OPTS to match
; @clobbers any, !R16, !R17, !X, !Y ; @clobbers any, !R16, !R17, !X, !Y
OBJ_TreeHandleSignalIfMatchingOptsLo: OBJ_TreeHandleSignalIfMatchingOpts:
push yl push yl
push yh push yh
; call signal handler ; call signal handler
@@ -627,30 +631,30 @@ OBJ_TreeHandleSignalIfMatchingOptsLo:
push r17 push r17
push xl push xl
push xh push xh
ldd r18, Y+OBJECT_OFFS_OPTS_LO ldd r18, Y+OBJECT_OFFS_OPTS
eor r18, r21 eor r18, r21
and r18, r20 and r18, r20
brne OBJ_TreeHandleSignalIfMatchingOptsLo_l1 brne OBJ_TreeHandleSignalIfMatchingOpts_l1
push r20 push r20
push r21 push r21
rcall OBJ_HandleSignal ; (any, !Y) rcall OBJ_HandleSignal ; (any, !Y)
pop r21 pop r21
pop r20 pop r20
OBJ_TreeHandleSignalIfMatchingOptsLo_l1: OBJ_TreeHandleSignalIfMatchingOpts_l1:
pop xh pop xh
pop xl pop xl
pop r17 pop r17
pop r16 pop r16
; handle children ; handle children
rcall OBJ_GetFirstChild ; r19:r18=object (none) rcall OBJ_GetFirstChild ; r19:r18=object (none)
OBJ_TreeHandleSignalIfMatchingOptsLo_loop: OBJ_TreeHandleSignalIfMatchingOpts_loop:
brcc OBJ_TreeHandleSignalIfMatchingOptsLo_done brcc OBJ_TreeHandleSignalIfMatchingOpts_done
mov yl, r18 mov yl, r18
mov yh, r19 mov yh, r19
rcall OBJ_TreeHandleSignalIfMatchingOptsLo ; recursion! rcall OBJ_TreeHandleSignalIfMatchingOpts ; recursion!
rcall OBJ_GetNext ; r19:r18=object (none) rcall OBJ_GetNext ; r19:r18=object (none)
rjmp OBJ_TreeHandleSignalIfMatchingOptsLo_loop rjmp OBJ_TreeHandleSignalIfMatchingOpts_loop
OBJ_TreeHandleSignalIfMatchingOptsLo_done: OBJ_TreeHandleSignalIfMatchingOpts_done:
pop yh pop yh
pop yl pop yl
ret ret
@@ -678,8 +682,8 @@ OBJ_TreeHandleSignalIfFlagsSet:
push xl push xl
push xh push xh
ldd r18, Y+OBJECT_OFFS_FLAGS ldd r18, Y+OBJECT_OFFS_FLAGS
and r18, r20
eor r18, r20 eor r18, r20
and r18, r20
brne OBJ_TreeHandleSignalIfFlagsSet_l1 brne OBJ_TreeHandleSignalIfFlagsSet_l1
push r20 push r20
rcall OBJ_HandleSignal ; (any, !Y) rcall OBJ_HandleSignal ; (any, !Y)

View File

@@ -33,8 +33,8 @@
; ;
; @return CFLAG set of okay, cleared otherwise ; @return CFLAG set of okay, cleared otherwise
; @return Y address of newly created object ; @return Y address of newly created object
; @param r16 value for OBJECT_OFFS_OPTS_LO ; @param r16 value for OBJECT_OFFS_OPTS
; @param r17 value for OBJECT_OFFS_OPTS_HI ; @param r17 value for WIDGET_OFFS_PACK
; @param X pointer to GUIAPP ; @param X pointer to GUIAPP
; @clobbers any ; @clobbers any
@@ -56,8 +56,8 @@ RootWindow_new_ret:
; ;
; @return CFLAG set if okay, cleared otherwise ; @return CFLAG set if okay, cleared otherwise
; @param Y address of widget ; @param Y address of widget
; @param r16 value for OBJECT_OFFS_OPTS_LO ; @param r16 value for OBJECT_OFFS_OPTS
; @param r17 value for OBJECT_OFFS_OPTS_HI ; @param r17 value for WIDGET_OFFS_PACK
; @param X pointer to GUIAPP ; @param X pointer to GUIAPP
; @clobbers r16, r17, X ; @clobbers r16, r17, X
@@ -68,21 +68,13 @@ RootWindow_Init:
clr xh clr xh
; call base class ; call base class
bigcall Widget_Init ; (r16, r17, X) bigcall Widget_Init ; (r16, r17, X)
; clear widget-specific data
mov xl, yl
mov xh, yh
adiw xh:xl, ROOTWINDOW_OFFS_BEGIN
clr r16
ldi r17, (ROOTWINDOW_SIZE-ROOTWINDOW_OFFS_BEGIN)
bigcall Utils_FillSram ; (r17, X)
pop xh pop xh
pop xl pop xl
std Y+ROOTWINDOW_OFFS_GUIAPP_LO, xl std Y+ROOTWINDOW_OFFS_GUIAPP_LO, xl
std Y+ROOTWINDOW_OFFS_GUIAPP_HI, xh std Y+ROOTWINDOW_OFFS_GUIAPP_HI, xh
bigcall Widget_SetFullScreen bigcall Widget_SetFullScreen ; (R16)
; set default signal map ; set default signal map
ldi r16, LOW(RootWindow_DefaultSignalmap*2) ldi r16, LOW(RootWindow_DefaultSignalmap*2)
@@ -129,25 +121,26 @@ RootWindow_GetApp:
; @clobbers any, !Y ; @clobbers any, !Y
RootWindow_OnLayout: RootWindow_OnLayout:
ldd r20, Y+WIDGET_OFFS_WIDTH_LO
ldd r21, Y+WIDGET_OFFS_WIDTH_HI
ldd r22, Y+WIDGET_OFFS_HEIGHT_LO
ldd r23, Y+WIDGET_OFFS_HEIGHT_HI
push yl push yl
push yh push yh
bigcall OBJ_GetFirstChild bigcall OBJ_GetFirstChild
brcc RootWindow_OnLayout_done
RootWindow_OnLayout_loop: RootWindow_OnLayout_loop:
brcc RootWindow_OnLayout_ret
mov yl, r18 mov yl, r18
mov yh, r19 mov yh, r19
; all children are MainWindow, set to fullscreen ; all children are MainWindow, set to fullscreen
bigcall Widget_SetFullScreen bigcall Widget_SetFullScreen ; (R16)
rcall OBJ_GetNext rcall OBJ_GetNext
rjmp RootWindow_OnLayout_loop brcs RootWindow_OnLayout_loop
RootWindow_OnLayout_ret: RootWindow_OnLayout_done:
pop yh pop yh
pop yl pop yl
ldd r17, Y+OBJECT_OFFS_FLAGS
cbr r17, (1<<WIDGET_FLAGS_LAYOUT_BIT)
std Y+OBJECT_OFFS_FLAGS, r17
sec
sec
ret ret
; @end ; @end
@@ -160,10 +153,10 @@ RootWindow_OnLayout_ret:
RootWindow_DefaultSignalmap: RootWindow_DefaultSignalmap:
; header ; header
.dw Widget_DefaultSignalmap ; next table to use .dw Widget_DefaultSignalmap*2 ; next table to use
; entries ; entries
; .db 0, WIDGET_SIGNAL_DRAW, LOW(Widget_OnDrawNop), HIGH(Widget_OnDrawNop) ; .db 0, WIDGET_SIGNAL_DRAW, LOW(Widget_OnDrawNop), HIGH(Widget_OnDrawNop)
.db 0, WIDGET_SIGNAL_DRAW, LOW(Widget_OnDraw), HIGH(Widget_OnDraw) .db 0, WIDGET_SIGNAL_DRAW, LOW(Widget_OnDraw), HIGH(Widget_OnDraw)
.db 0, WIDGET_SIGNAL_LAYOUT, LOW(RootWindow_OnLayout), HIGH(RootWindow_OnLayout) .db 0, WIDGET_SIGNAL_LAYOUT, LOW(RootWindow_OnLayout), HIGH(RootWindow_OnLayout)
.db 0, 0, 0, 0 ; end of table .db 0, 0, 0, 0 ; end of table

View File

@@ -15,8 +15,14 @@
; defines ; defines
.equ VLAYOUT_OFFS_BEGIN = WIDGET_SIZE .equ VLAYOUT_OFFS_BEGIN = WIDGET_SIZE
; no data for now .equ VLAYOUT_OFFS_MODE = VLAYOUT_OFFS_BEGIN+0
.equ VLAYOUT_SIZE = VLAYOUT_OFFS_BEGIN+0 .equ VLAYOUT_SIZE = VLAYOUT_OFFS_BEGIN+1
; values for VLAYOUT_OFFS_MODE
.equ VLAYOUT_MODE_EXPAND = 0
.equ VLAYOUT_MODE_SPREAD = 1
@@ -34,19 +40,14 @@
; @return CFLAG set of okay, cleared otherwise ; @return CFLAG set of okay, cleared otherwise
; @return Y address of newly created object ; @return Y address of newly created object
; @param X parent widget ; @param X parent widget
; @param r16 value for OBJECT_OFFS_OPTS_LO ; @param r16 value for OBJECT_OFFS_OPTS
; @param r17 value for OBJECT_OFFS_OPTS_HI ; @param r17 value for WIDGET_OFFS_PACK
; @param r21:r20 ressource id for title
; @clobbers any ; @clobbers any
VLayout_new: VLayout_new:
push r20 ldi r24, LOW(VLAYOUT_SIZE)
push r21 ldi r25, HIGH(VLAYOUT_SIZE)
ldi r24, LOW(VLAYOUT_SIZE) bigcall Object_Alloc ; (!r16, !r17, !X)
ldi r25, HIGH(VLAYOUT_SIZE)
bigcall Object_Alloc ; (!r16, !r17, !X)
pop r21
pop r20
brcc VLayout_new_ret brcc VLayout_new_ret
rcall VLayout_Init ; (r16, r17, X) rcall VLayout_Init ; (r16, r17, X)
sec sec
@@ -61,6 +62,8 @@ VLayout_new_ret:
; ;
; @param Y address of widget ; @param Y address of widget
; @param X parent widget (if any) ; @param X parent widget (if any)
; @param r16 value for OBJECT_OFFS_OPTS
; @param r17 value for WIDGET_OFFS_PACK
; @clobbers r16, r17, X ; @clobbers r16, r17, X
VLayout_Init: VLayout_Init:
@@ -90,7 +93,7 @@ VLayout_Init:
VLayout_OnLayout: VLayout_OnLayout:
rcall vLayoutVertically rcall vLayoutVertically
rcall vLayoutHorizontalAdjust rcall vLayoutHorizontally
; force re-drawing of this widget, clear layout bit ; force re-drawing of this widget, clear layout bit
ldd r16, Y+OBJECT_OFFS_FLAGS ldd r16, Y+OBJECT_OFFS_FLAGS
sbr r16, (1<<WIDGET_FLAGS_DIRTY_BIT) sbr r16, (1<<WIDGET_FLAGS_DIRTY_BIT)
@@ -174,10 +177,13 @@ vLayoutSetY:
push yl push yl
push yh push yh
bigcall OBJ_GetFirstChild bigcall OBJ_GetFirstChild
brcc vLayoutSetY_loopEnd
vLayoutSetY_loop: vLayoutSetY_loop:
brcc vLayoutSetY_loopEnd
mov yl, r18 mov yl, r18
mov yh, r19 mov yh, r19
ldd r16, Y+OBJECT_OFFS_FLAGS
sbrs r16, WIDGET_FLAGS_VISIBLE_BIT
rjmp vLayoutSetY_next
; set Y ; set Y
std Y+WIDGET_OFFS_Y_LO, r20 std Y+WIDGET_OFFS_Y_LO, r20
std Y+WIDGET_OFFS_Y_HI, r21 std Y+WIDGET_OFFS_Y_HI, r21
@@ -196,9 +202,9 @@ vLayoutSetY_loop:
ldd r16, Y+OBJECT_OFFS_FLAGS ldd r16, Y+OBJECT_OFFS_FLAGS
ori r16, (1<<WIDGET_FLAGS_DIRTY_BIT) | (1<<WIDGET_FLAGS_LAYOUT_BIT) ori r16, (1<<WIDGET_FLAGS_DIRTY_BIT) | (1<<WIDGET_FLAGS_LAYOUT_BIT)
std Y+OBJECT_OFFS_FLAGS, r16 std Y+OBJECT_OFFS_FLAGS, r16
vLayoutSetY_next:
rcall OBJ_GetNext rcall OBJ_GetNext
rjmp vLayoutSetY_loop brcs vLayoutSetY_loop
vLayoutSetY_loopEnd: vLayoutSetY_loopEnd:
pop yh pop yh
pop yl pop yl
@@ -208,54 +214,52 @@ vLayoutSetY_loopEnd:
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine vLayoutHorizontalAdjust ; @routine vLayoutHorizontally
; ;
; @param Y pointer to widget ; @param Y pointer to widget
; @clobbers r17, r18, r19, r20, r21, r22, r23, Z ; @clobbers any, !Y
vLayoutHorizontalAdjust:
bigcall Layout_SetDefaultHeights
ldd zl, Y+WIDGET_OFFS_STYLE_LO
ldd zh, Y+WIDGET_OFFS_STYLE_HI
; get outer border
adiw zh:zl, WIDGET_STYLE_OFFS_OUTERBORDERSIZE
lpm r20, Z
clr r21
sbiw zh:zl, WIDGET_STYLE_OFFS_OUTERBORDERSIZE
vLayoutHorizontally:
bigcall Layout_SetDefaultWidths ; (any, !Y)
; calc usable width of host widget
ldd r22, Y+WIDGET_OFFS_WIDTH_LO ldd r22, Y+WIDGET_OFFS_WIDTH_LO
ldd r23, Y+WIDGET_OFFS_WIDTH_HI ldd r23, Y+WIDGET_OFFS_WIDTH_HI
sub r22, r20 ; subtract border (top) ldd zl, Y+WIDGET_OFFS_STYLE_LO
sbc r23, r21 ldd zh, Y+WIDGET_OFFS_STYLE_HI
sub r22, r20 ; subtract border (bottom) adiw zh:zl, WIDGET_STYLE_OFFS_OUTERBORDERSIZE
sbc r23, r21 lpm r18, Z+
lpm r19, Z
sub r22, r18
sbc r23, r19
sub r22, r18
sbc r23, r19
; r23:r22=width of host widget
push yl push yl
push yh push yh
bigcall OBJ_GetFirstChild bigcall OBJ_GetFirstChild
vLayoutHorizontalAdjust_loop: vLayoutHorizontally_loop:
brcc vLayoutHorizontalAdjust_loopEnd brcc vLayoutHorizontally_loopEnd
mov yl, r18 mov yl, r18
mov yh, r19 mov yh, r19
std Y+WIDGET_OFFS_X_LO, r20
std Y+WIDGET_OFFS_X_HI, r21
ldd r18, Y+WIDGET_OFFS_TMP_LO ldd r12, Y+WIDGET_OFFS_TMP_LO
ldd r19, Y+WIDGET_OFFS_TMP_HI ldd r13, Y+WIDGET_OFFS_TMP_HI
ldd r17, Y+OBJECT_OFFS_OPTS_LO ldd r17, Y+OBJECT_OFFS_OPTS
sbrs r17, WIDGET_OPTSLO_FILLY_BIT andi r17, (1<<WIDGET_PACK_HSELF1_BIT) | (1<<WIDGET_PACK_HSELF0_BIT)
rjmp vLayoutHorizontalAdjust_setWidth cpi r17, (WIDGET_PACK_FILLED<<WIDGET_PACK_HSELF0_BIT)
mov r18, r22 ; increase height to full height brne vLayoutHorizontally_setWidth
mov r19, r23 mov r12, r22
vLayoutHorizontalAdjust_setWidth: mov r13, r23
std Y+WIDGET_OFFS_WIDTH_LO, r18 vLayoutHorizontally_setWidth:
std Y+WIDGET_OFFS_WIDTH_HI, r19 std Y+WIDGET_OFFS_WIDTH_LO, r12
std Y+WIDGET_OFFS_WIDTH_HI, r13
rcall Widget_PackSelfX ; R5:R4=new pos (r17, r18, r19, r20, r21)
std Y+WIDGET_OFFS_X_LO, r4
std Y+WIDGET_OFFS_X_HI, r5
rcall OBJ_GetNext rcall OBJ_GetNext
rjmp vLayoutHorizontalAdjust_loop rjmp vLayoutHorizontally_loop
vLayoutHorizontalAdjust_loopEnd: vLayoutHorizontally_loopEnd:
pop yh pop yh
pop yl pop yl
ret ret
@@ -263,24 +267,50 @@ vLayoutHorizontalAdjust_loopEnd:
; ---------------------------------------------------------------------------
; @routine vLayoutVertically
;
; @param Y pointer to widget
; @clobbers any, !Y
vLayoutVertically: vLayoutVertically:
ldd r16, Y+VLAYOUT_OFFS_MODE
cpi r16, VLAYOUT_MODE_SPREAD
breq vLayoutVertically_spread
rjmp vLayoutExpand
vLayoutVertically_spread:
rjmp vLayoutSpread
; @end
; ---------------------------------------------------------------------------
; @routine vLayoutExpand
;
; @param Y pointer to widget
; @clobbers any, !Y
vLayoutExpand:
rcall Layout_SetDefaultHeights rcall Layout_SetDefaultHeights
rcall Layout_SumTmpValues ; r21:r20=width rcall Layout_SumTmpValues ; r19:r18=width+borders
ldd r22, Y+WIDGET_OFFS_HEIGHT_LO ldd r22, Y+WIDGET_OFFS_HEIGHT_LO
ldd r23, Y+WIDGET_OFFS_HEIGHT_HI ldd r23, Y+WIDGET_OFFS_HEIGHT_HI
sub r22, r20 sub r22, r18
sbc r23, r21 sbc r23, r19 ; r23:r22=(height-usedSpace)=unusedSpace
breq vLayoutVertically_setY breq vLayoutExpand_setY
brcs vLayoutVertically_setY brcs vLayoutExpand_setY
; r23:r22=remaining space to distribute ; r23:r22=remaining space to distribute
push r22 push r22
ldi r22, (1<<WIDGET_OPTSLO_FILLY_BIT) push r23
rcall LayoutCountExpandableChildren ; r16=number of expandable child widgets ldi r22, (1<<WIDGET_PACK_VSELF1_BIT) | (1<<WIDGET_PACK_VSELF0_BIT) ; mask
ldi r23, (WIDGET_PACK_FILLED<<WIDGET_PACK_VSELF0_BIT) ; value
rcall LayoutCountChildrenWithPackMode ; r16=number of expandable child widgets
pop r23
pop r22 pop r22
tst r16 tst r16
breq vLayoutVertically_setY breq vLayoutExpand_setY
; calc space to add to each expandable child widget and add it ; calc space to add to each expandable child widget and add it
mov r20, r22 mov r20, r22
@@ -290,17 +320,139 @@ vLayoutVertically:
bigcall Utils_Divu16_16_16 ; r17:r16=space per expandable child widget bigcall Utils_Divu16_16_16 ; r17:r16=space per expandable child widget
mov r20, r16 mov r20, r16
mov r21, r17 mov r21, r17
ldi r22, (1<<WIDGET_OPTSLO_FILLY_BIT)
rcall Layout_AddToTmpOfFillXChildren
vLayoutVertically_setY: ldi r22, (1<<WIDGET_PACK_VSELF1_BIT) | (1<<WIDGET_PACK_VSELF0_BIT) ; mask
ldi r23, (WIDGET_PACK_FILLED<<WIDGET_PACK_VSELF0_BIT) ; value
bigcall LayoutIncTmpOnMatchingPack
vLayoutExpand_setY:
rcall vLayoutSetY rcall vLayoutSetY
ret ret
; @end ; @end
; ---------------------------------------------------------------------------
; @routine vLayoutExpand
;
; @param Y pointer to widget
; @clobbers any, !Y
vLayoutSpread:
rcall vLayoutPrepareSpread ; (any, !Y)
rcall vLayoutFinalizeSpread ; (r18, r19, X)
ret
; @end
; ---------------------------------------------------------------------------
; @routine vLayoutPrepareSpread
;
; @param Y pointer to widget
; @return X startpos
; @return r21:r20 extra space (in pixels)
; @return r25:r24 spacing (including extra space)
; @clobbers any, !Y
vLayoutPrepareSpread:
rcall Layout_SetDefaultHeights ; (any, !Y)
rcall Layout_SumTmpValues ; r21:r20=width+borders
ldd r18, Y+WIDGET_OFFS_HEIGHT_LO
ldd r19, Y+WIDGET_OFFS_HEIGHT_HI
sub r18, r20
sbc r19, r21
mov r20, r18
mov r21, r19 ; remaining space
rcall LayoutCountVisibleChildren ; r16=number of visible child widgets (r17, r18, r19)
inc r16
mov r22, r16
push r22
ldi r22, (1<<WIDGET_PACK_VSELF1_BIT) | \
(1<<WIDGET_PACK_VSELF0_BIT) ; mask
ldi r23, (WIDGET_PACK_FILLED<<WIDGET_PACK_VSELF0_BIT) ; value
rcall LayoutCountChildrenWithPackMode ; r16=number of expandable children (r17, r18, r19)
pop r22
add r22, r16
clr r23
bigcall Utils_Divu16_16_16 ; r17:r16=space per element
mov r20, r18
mov r21, r19 ; r21:20=additional space per element
; get and adjust spacing, setup start pos
ldd zl, Y+WIDGET_OFFS_STYLE_LO
ldd zh, Y+WIDGET_OFFS_STYLE_HI
adiw zh:zl, WIDGET_STYLE_OFFS_OUTERBORDERSIZE
lpm xl, Z+ ; border
clr xh
lpm r24, Z ; spacing
clr r25
add r24, r20 ; add extra space to spacing
adc r25, r21
add xl, r20 ; add extra space to border
adc xh, r21
ret
; @end
; ---------------------------------------------------------------------------
; @routine vLayoutFinalizeSpread
;
; @param Y pointer to widget
; @param X startpos
; @param r21:r20 extra space (in pixels)
; @param r25:r24 spacing (including extra space)
; @clobbers r18, r19, X
vLayoutFinalizeSpread:
push yl
push yh
bigcall OBJ_GetFirstChild
brcc vLayoutFinalizeSpread_done
vLayoutFinalizeSpread_loop:
mov yl, r18
mov yh, r19
ldd r17, Y+OBJECT_OFFS_FLAGS
sbrs r17, WIDGET_FLAGS_VISIBLE_BIT ; skip invisible widgets
rjmp vLayoutFinalizeSpread_next
; store pos
std Y+WIDGET_OFFS_Y_LO, xl
std Y+WIDGET_OFFS_Y_LO, xh
; determine final height of child widget
ldd r18, Y+WIDGET_OFFS_TMP_LO
ldd r19, Y+WIDGET_OFFS_TMP_LO
ldd r16, Y+WIDGET_OFFS_PACK
andi r16, (1<<WIDGET_PACK_VSELF1_BIT) | (1<<WIDGET_PACK_VSELF0_BIT)
cpi r16, (WIDGET_PACK_FILLED<<WIDGET_PACK_VSELF0_BIT)
brne vLayoutFinalizeSpread_setHeight
add r18, r20 ; add extra space
adc r19, r21
vLayoutFinalizeSpread_setHeight:
std Y+WIDGET_OFFS_HEIGHT_LO, r18
std Y+WIDGET_OFFS_HEIGHT_HI, r19
; advance pos
add xl, r18 ; add height to current pos
adc xh, r19
add xl, r24 ; add spacing to current pos
adc xh, r25
vLayoutFinalizeSpread_next:
rcall OBJ_GetNext ; r19:r18=object (none)
brcs vLayoutFinalizeSpread_loop
vLayoutFinalizeSpread_done:
pop yh
pop yl
ret
; @end
; *************************************************************************** ; ***************************************************************************
@@ -308,7 +460,7 @@ vLayoutVertically_setY:
VLayout_DefaultSignalmap: VLayout_DefaultSignalmap:
; header ; header
.dw Widget_DefaultSignalmap ; next table to use .dw Widget_DefaultSignalmap*2 ; next table to use
; entries ; entries
.db 0, WIDGET_SIGNAL_LAYOUT, LOW(VLayout_OnLayout), HIGH(VLayout_OnLayout) .db 0, WIDGET_SIGNAL_LAYOUT, LOW(VLayout_OnLayout), HIGH(VLayout_OnLayout)
.db WIDGET_VALUE_DEFAULT_WIDTH, WIDGET_SIGNAL_GETVALUE, LOW(VLayout_OnGetDefaultWidth), HIGH(VLayout_OnGetDefaultWidth) .db WIDGET_VALUE_DEFAULT_WIDTH, WIDGET_SIGNAL_GETVALUE, LOW(VLayout_OnGetDefaultWidth), HIGH(VLayout_OnGetDefaultWidth)

View File

@@ -27,9 +27,10 @@
.equ WIDGET_OFFS_HEIGHT_HI = WIDGET_OFFS_BEGIN+7 .equ WIDGET_OFFS_HEIGHT_HI = WIDGET_OFFS_BEGIN+7
.equ WIDGET_OFFS_STYLE_LO = WIDGET_OFFS_BEGIN+8 ; byte address (for LPM!) .equ WIDGET_OFFS_STYLE_LO = WIDGET_OFFS_BEGIN+8 ; byte address (for LPM!)
.equ WIDGET_OFFS_STYLE_HI = WIDGET_OFFS_BEGIN+9 .equ WIDGET_OFFS_STYLE_HI = WIDGET_OFFS_BEGIN+9
.equ WIDGET_OFFS_TMP_LO = WIDGET_OFFS_BEGIN+10 .equ WIDGET_OFFS_PACK = WIDGET_OFFS_BEGIN+10
.equ WIDGET_OFFS_TMP_HI = WIDGET_OFFS_BEGIN+11 .equ WIDGET_OFFS_TMP_LO = WIDGET_OFFS_BEGIN+11
.equ WIDGET_SIZE = WIDGET_OFFS_BEGIN+12 .equ WIDGET_OFFS_TMP_HI = WIDGET_OFFS_BEGIN+12
.equ WIDGET_SIZE = WIDGET_OFFS_BEGIN+13
; widget style object ; widget style object
.equ WIDGET_STYLE_OFFS_FRONTCOL_NORM = 0 .equ WIDGET_STYLE_OFFS_FRONTCOL_NORM = 0
@@ -48,29 +49,25 @@
.equ WIDGET_STYLE_OFFS_CHARHEIGHT = 21 .equ WIDGET_STYLE_OFFS_CHARHEIGHT = 21
.equ WIDGET_STYLE_SIZE = 22 .equ WIDGET_STYLE_SIZE = 22
; widget opts_lo (bits 7 and 6 used by OBJECT_OPTSLO) ; widget opts_lo (bits 7 and 6 used by OBJECT_OPTS)
.equ WIDGET_OPTSLO_INPUT_BIT = 5 ; TOUCH, KEY .equ WIDGET_OPTS_INPUT_BIT = 5 ; TOUCH, KEY
.equ WIDGET_OPTSLO_BORDER_BIT = 4 .equ WIDGET_OPTS_BORDER_BIT = 4
.equ WIDGET_OPTSLO_FILLX_BIT = 3
.equ WIDGET_OPTSLO_FILLY_BIT = 2
; widget opts_hi ; widget WIDGET_OFFS_PACK
.equ WIDGET_OPTSHI_CONTENT_XALIGN1_BIT = 7 ; (2 bit: left, right, center, filled) .equ WIDGET_PACK_HSELF0_BIT = 0
.equ WIDGET_OPTSHI_CONTENT_XALIGN0_BIT = 6 .equ WIDGET_PACK_HSELF1_BIT = 1
.equ WIDGET_OPTSHI_CONTENT_YALIGN1_BIT = 5 ; (2 bit: top, bottom, center, filled) .equ WIDGET_PACK_VSELF0_BIT = 2
.equ WIDGET_OPTSHI_CONTENT_YALIGN0_BIT = 4 .equ WIDGET_PACK_VSELF1_BIT = 3
.equ WIDGET_PACK_HCONTENT0_BIT = 4
.equ WIDGET_PACK_HCONTENT1_BIT = 5
.equ WIDGET_PACK_VCONTENT0_BIT = 6
.equ WIDGET_PACK_VCONTENT1_BIT = 7
; values for WIDGET_OPTSHI_CONTENT_XALIGN (2 bits) ; values for WIDGET_OFFS_PACK (2 bits)
.equ WIDGET_XALIGN_LEFT = 0 .equ WIDGET_PACK_BEGIN = 0
.equ WIDGET_XALIGN_RIGHT = 1 .equ WIDGET_PACK_END = 1
.equ WIDGET_XALIGN_CENTER = 2 .equ WIDGET_PACK_CENTER = 2
.equ WIDGET_XALIGN_FILLED = 3 .equ WIDGET_PACK_FILLED = 3
; values for WIDGET_OPTSHI_CONTENT_YALIGN (2 bits)
.equ WIDGET_YALIGN_TOP = 0
.equ WIDGET_YALIGN_BOTTOM = 1
.equ WIDGET_YALIGN_CENTER = 2
.equ WIDGET_YALIGN_FILLED = 3
; widget flags ; widget flags
.equ WIDGET_FLAGS_VISIBLE_BIT = 7 .equ WIDGET_FLAGS_VISIBLE_BIT = 7
@@ -105,11 +102,6 @@
.equ WIDGET_VALUE_DEFAULT_HEIGHT = 2 .equ WIDGET_VALUE_DEFAULT_HEIGHT = 2
.equ WIDGET_VALUE_NEXTFREE = 3 .equ WIDGET_VALUE_NEXTFREE = 3
; args to Widget_AlignPos
.equ WIDGET_1DALIGN_END_BIT = 0
.equ WIDGET_1DALIGN_CENTER_BIT = 1
.equ WIDGET_1DALIGN_BORDER_BIT = 2
; *************************************************************************** ; ***************************************************************************
@@ -125,8 +117,8 @@
; @return CFLAG set of okay, cleared otherwise ; @return CFLAG set of okay, cleared otherwise
; @return Y address of newly created object ; @return Y address of newly created object
; @param X parent widget ; @param X parent widget
; @param r16 value for OBJECT_OFFS_OPTS_LO ; @param r16 value for OBJECT_OFFS_OPTS
; @param r17 value for OBJECT_OFFS_OPTS_HI ; @param r17 value for WIDGET_OFFS_PACK
; @clobbers any ; @clobbers any
Widget_new: Widget_new:
@@ -145,27 +137,23 @@ Widget_new_ret:
; @routine Widget_Init @global ; @routine Widget_Init @global
; ;
; @param Y address of object in SDRAM ; @param Y address of object in SDRAM
; @param r16 value for OBJECT_OFFS_OPTS_LO ; @param r16 value for OBJECT_OFFS_OPTS
; @param r17 value for OBJECT_OFFS_OPTS_HI ; @param r17 value for WIDGET_OFFS_PACK
; @param X parent widget (if any) ; @param X parent widget (if any)
; @clobbers r16, r17, X ; @clobbers r16, r17, X
Widget_Init: Widget_Init:
push xl push xl
push xh push xh
; call base class push r17
bigcall OBJ_Init ; (r16, r17, X) ; call base class
bigcall OBJ_Init ; (r16, r17, X)
; clear widget-specific data pop r17
mov xl, yl
mov xh, yh
adiw xh:xl, WIDGET_OFFS_BEGIN
clr r16
ldi r17, (WIDGET_SIZE-WIDGET_OFFS_BEGIN)
bigcall Utils_FillSram ; (r17, X)
pop xh pop xh
pop xl pop xl
std Y+WIDGET_OFFS_PACK, r17
; set default signal map ; set default signal map
ldi r16, LOW(Widget_DefaultSignalmap*2) ldi r16, LOW(Widget_DefaultSignalmap*2)
std Y+OBJECT_OFFS_SIGNALMAP_LO, r16 std Y+OBJECT_OFFS_SIGNALMAP_LO, r16
@@ -754,134 +742,98 @@ Widget_CalcStringWidthFLASH_done:
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine Widget_AlignContentX @global ; @routine Widget_PackSelfX @global
;
; Calc pos according to WIDGET_PACK_HSELF in WIDGET_OFFS_PACK.
; ;
; @param Y address of widget ; @param Y address of widget
; @param R13:R12 width of object to align ; @param R13:R12 width of object to align
; @return R5:R4 X ; @return R5:R4 X
; @clobbers r8, r9, r10, r11, r12, r13, r14, r15, r16, r17, r18, r19, r20, r21, r22, r23, r24, r25 ; @clobbers r17, r18, r19, r20, r21
Widget_AlignContentX: Widget_PackSelfX:
ldd r8, Y+WIDGET_OFFS_WIDTH_LO ldd r18, Y+WIDGET_OFFS_WIDTH_LO
ldd r9, Y+WIDGET_OFFS_WIDTH_HI ldd r19, Y+WIDGET_OFFS_WIDTH_HI
ldd r17, Y+WIDGET_OFFS_PACK
ldd r24, Y+OBJECT_OFFS_OPTS_LO andi r17, 3 ; WIDGET_PACK_HSELF0_BIT = 0, no shift necessary
ldd r25, Y+OBJECT_OFFS_OPTS_HI rcall widgetPack ; r21:r20=new pos (r17, r18, r19)
mov r4, r20
; align horizontally mov r5, r21
clr r17
sbrc r24, WIDGET_OPTSLO_BORDER_BIT
ori r17, (1<<WIDGET_1DALIGN_BORDER_BIT)
mov r16, r25
andi r16, (1<<WIDGET_OPTSHI_CONTENT_XALIGN1_BIT) | (1<<WIDGET_OPTSHI_CONTENT_XALIGN0_BIT)
cpi r16, (WIDGET_XALIGN_RIGHT<<WIDGET_OPTSHI_CONTENT_XALIGN0_BIT)
brne Widget_AlignContentX_h1
ori r17, (1<<WIDGET_1DALIGN_END_BIT)
Widget_AlignContentX_h1:
cpi r16, (WIDGET_XALIGN_CENTER<<WIDGET_OPTSHI_CONTENT_XALIGN0_BIT)
brne Widget_AlignContentX_h2
ori r17, (1<<WIDGET_1DALIGN_CENTER_BIT)
Widget_AlignContentX_h2:
mov r18, r8 ; widget width
mov r19, r9
rcall Widget_AlignPos1D ; (r16, r18, r19)
mov r4, r22
mov r5, r23
ret ret
; @end ; @end
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine Widget_AlignContentY @global ; @routine Widget_PackSelfY @global
;
; Calc pos according to WIDGET_PACK_VSELF in WIDGET_OFFS_PACK.
; ;
; @param Y address of widget ; @param Y address of widget
; @param R13:R12 height of object to align ; @param R13:R12 height of object to align
; @return R7:R6 Y ; @return R7:R6 Y
; @clobbers r8, r9, r10, r11, r12, r13, r14, r15, r16, r17, r18, r19, r20, r21, r22, r23, r24, r25 ; @clobbers r17, r18, r19, r20, r21
Widget_AlignContentY: Widget_PackSelfY:
ldd r10, Y+WIDGET_OFFS_HEIGHT_LO ldd r18, Y+WIDGET_OFFS_HEIGHT_LO
ldd r11, Y+WIDGET_OFFS_HEIGHT_HI ldd r19, Y+WIDGET_OFFS_HEIGHT_HI
ldd r17, Y+WIDGET_OFFS_PACK
ldd r24, Y+OBJECT_OFFS_OPTS_LO lsr r17 ; WIDGET_PACK_VSELF0_BIT = 2 -> shift 2 times right
ldd r25, Y+OBJECT_OFFS_OPTS_HI lsr r17
andi r17, 3
; align vertically rcall widgetPack ; r21:r20=new pos (r17, r18, r19)
clr r17 mov r6, r20
sbrc r24, WIDGET_OPTSLO_BORDER_BIT mov r7, r21
ori r17, (1<<WIDGET_1DALIGN_BORDER_BIT)
mov r16, r24
andi r16, (1<<WIDGET_OPTSHI_CONTENT_YALIGN1_BIT) | (1<<WIDGET_OPTSHI_CONTENT_YALIGN0_BIT)
cpi r16, (WIDGET_YALIGN_BOTTOM<<WIDGET_OPTSHI_CONTENT_YALIGN0_BIT)
brne Widget_AlignContentY_v1
ori r17, (1<<WIDGET_1DALIGN_END_BIT)
Widget_AlignContentY_v1:
cpi r16, (WIDGET_YALIGN_CENTER<<WIDGET_OPTSHI_CONTENT_YALIGN0_BIT)
brne Widget_AlignContentY_v2
ori r17, (1<<WIDGET_1DALIGN_CENTER_BIT)
Widget_AlignContentY_v2:
mov r18, r10 ; widget height
mov r19, r11
rcall Widget_AlignPos1D ; (r16, r18, r19)
mov r6, r22
mov r7, r23
ret ret
; @end ; @end
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine Widget_AlignPos1D ; @routine Widget_PackContentX @global
; ;
; one-dimensional routine. ; Calc pos according to WIDGET_PACK_HCONTENT in WIDGET_OFFS_PACK.
; ;
; @param R19:R18 size of target ; @param Y address of widget
; @param R13:R12 size of object to align ; @param R13:R12 width of object to align
; @param ; @return R5:R4 X
; @param R17 opts (bit 0: align end, bit 1: align center, bit 2: account for border) ; @clobbers r17, r18, r19, r20, r21
; @return R23:R22 pos
; @clobbers r16, r18, r19
Widget_AlignPos1D: Widget_PackContentX:
clr r22 ldd r18, Y+WIDGET_OFFS_WIDTH_LO
clr r23 ldd r19, Y+WIDGET_OFFS_WIDTH_HI
ldd r17, Y+WIDGET_OFFS_PACK
swap r17 ; WIDGET_PACK_HCONTENT0_BIT = 4 -> shift 4 times right
andi r17, 3
rcall widgetPack ; r21:r20=new pos (r17, r18, r19)
mov r4, r20
mov r5, r21
ret
; @end
sbrc r17, WIDGET_1DALIGN_BORDER_BIT
rcall Widget_AlignPos1D_subBordersFromSize
sbrc r17, WIDGET_1DALIGN_END_BIT
rcall Widget_AlignPos1D_alignEnd
sbrc r17, WIDGET_1DALIGN_CENTER_BIT
rcall Widget_AlignPos1D_alignCenter
sbrc r17, WIDGET_1DALIGN_BORDER_BIT
rcall Widget_AlignPos1D_addBordersToPos ; ---------------------------------------------------------------------------
Widget_AlignPos1D_ret: ; @routine Widget_PackContentY @global
ret ;
Widget_AlignPos1D_alignEnd: ; Calc pos according to WIDGET_PACK_VCONTENT in WIDGET_OFFS_PACK.
mov r22, r18 ;
mov r23, r19 ; @param Y address of widget
sub r22, r12 ; @param R13:R12 height of object to align
sbc r23, r13 ; @return R7:R6 Y
brcc Widget_AlignPos1D_ret ; @clobbers r17, r18, r19, r20, r21
clr r22
clr r23 Widget_PackContentY:
ret ldd r18, Y+WIDGET_OFFS_HEIGHT_LO
Widget_AlignPos1D_alignCenter: ldd r19, Y+WIDGET_OFFS_HEIGHT_HI
rcall Widget_AlignPos1D_alignEnd ldd r17, Y+WIDGET_OFFS_PACK
lsr r23 swap r17 ; WIDGET_PACK_VCONTENT0_BIT = 6 -> shift 6 times right
ror r22 lsr r17
ret lsr r17
Widget_AlignPos1D_subBordersFromSize: andi r17, 3
subi r18, 4 rcall widgetPack ; r21:r20=new pos (r17, r18, r19)
sbci r19, 0 mov r6, r20
ret mov r7, r21
Widget_AlignPos1D_addBordersToPos:
ldi r16, 2
add r22, r16
adc r23, r16
sub r23, r16
ret ret
; @end ; @end
@@ -1044,6 +996,57 @@ widgetCalcAbsPosAndBorders:
; ---------------------------------------------------------------------------
; @routine widgetPack
;
; @param Y address of widget
; @param r19:r18 size of target widget (i.e. width or height)
; @param r17 pack mode (see @ref WIDGET_PACK_BEGIN)
; @param R13:R12 size of object to pack (i.e. width or height)
; @return R21:R20 pos
; @clobbers r17, r18, r19
widgetPack:
; subtract borders
push zl
push zh
ldd zl, Y+WIDGET_OFFS_STYLE_LO
ldd zh, Y+WIDGET_OFFS_STYLE_HI
adiw zh:zl, WIDGET_STYLE_OFFS_OUTERBORDERSIZE
lpm r20, Z
pop zh
pop zl
clr r21
sub r18, r20 ; subtract border at begin
sbc r19, r21
sub r18, r20 ; subtract border at end
sbc r19, r21
andi r17, 3 ; only 2 bits pack mode
cpi r17, WIDGET_PACK_END
breq widgetPack_end
cpi r17, WIDGET_PACK_CENTER
breq widgetPack_center
rjmp widgetPack_ret ; begin/filled, align at begin
widgetPack_end:
sub r18, r12
sbc r19, r13
add r20, r18
adc r21, r19
rjmp widgetPack_ret
widgetPack_center:
sub r18, r12
sbc r19, r13
lsr r19
ror r18
add r20, r18
adc r21, r19
rjmp widgetPack_ret
widgetPack_ret:
ret
; @end
@@ -1052,7 +1055,7 @@ widgetCalcAbsPosAndBorders:
Widget_DefaultSignalmap: Widget_DefaultSignalmap:
; header ; header
.dw Object_DefaultSignalmap ; next table to use .dw Object_DefaultSignalmap*2 ; next table to use
; entries ; entries
.db 0, WIDGET_SIGNAL_DRAW, LOW(Widget_OnDraw), HIGH(Widget_OnDraw) .db 0, WIDGET_SIGNAL_DRAW, LOW(Widget_OnDraw), HIGH(Widget_OnDraw)
.db 0, WIDGET_SIGNAL_LAYOUT, LOW(Widget_OnLayout), HIGH(Widget_OnLayout) .db 0, WIDGET_SIGNAL_LAYOUT, LOW(Widget_OnLayout), HIGH(Widget_OnLayout)