gui: sorted files. started working on TextSel class.
This commit is contained in:
@@ -531,18 +531,19 @@ GUI_MODULE_BEGIN:
|
|||||||
.include "modules/lcd2/gui/base/hlayout.asm"
|
.include "modules/lcd2/gui/base/hlayout.asm"
|
||||||
.include "modules/lcd2/gui/base/vlayout.asm"
|
.include "modules/lcd2/gui/base/vlayout.asm"
|
||||||
.include "modules/lcd2/gui/base/mclayout.asm"
|
.include "modules/lcd2/gui/base/mclayout.asm"
|
||||||
.include "modules/lcd2/gui/base/hspinner.asm"
|
.include "modules/lcd2/gui/composite/hspinner.asm"
|
||||||
.include "modules/lcd2/gui/base/mainwindow.asm"
|
.include "modules/lcd2/gui/composite/mainwindow.asm"
|
||||||
.include "modules/lcd2/gui/base/keypad.asm"
|
.include "modules/lcd2/gui/base/keypad.asm"
|
||||||
.include "modules/lcd2/gui/base/keypad_num.asm"
|
.include "modules/lcd2/gui/base/keypad_num.asm"
|
||||||
.include "modules/lcd2/gui/base/d_numinput.asm"
|
.include "modules/lcd2/gui/composite/d_numinput.asm"
|
||||||
.include "modules/lcd2/gui/base/cwidget.asm"
|
.include "modules/lcd2/gui/base/cwidget.asm"
|
||||||
.include "modules/lcd2/gui/base/dialog.asm"
|
.include "modules/lcd2/gui/composite/dialog.asm"
|
||||||
.include "modules/lcd2/gui/base/cdialog.asm"
|
.include "modules/lcd2/gui/composite/cdialog.asm"
|
||||||
.include "modules/lcd2/gui/aqhome/sensorwatch.asm"
|
.include "modules/lcd2/gui/aqhome/sensorwatch.asm"
|
||||||
.include "modules/lcd2/gui/aqhome/lightsettings.asm"
|
.include "modules/lcd2/gui/aqhome/lightsettings.asm"
|
||||||
.include "modules/lcd2/gui/aqhome/d_light_conns.asm"
|
.include "modules/lcd2/gui/aqhome/d_light_conns.asm"
|
||||||
.include "modules/lcd2/gui/aqhome/d_nodevalueid.asm"
|
.include "modules/lcd2/gui/aqhome/d_nodevalueid.asm"
|
||||||
|
.include "modules/lcd2/gui/composite/textsel.asm"
|
||||||
.include "modules/lcd2/gui/screensavers/simple.asm"
|
.include "modules/lcd2/gui/screensavers/simple.asm"
|
||||||
GUI_MODULE_END:
|
GUI_MODULE_END:
|
||||||
.equ MODULE_SIZE_GUI = GUI_MODULE_END-GUI_MODULE_BEGIN
|
.equ MODULE_SIZE_GUI = GUI_MODULE_END-GUI_MODULE_BEGIN
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
<subdirs>
|
<subdirs>
|
||||||
aqhome
|
aqhome
|
||||||
base
|
base
|
||||||
|
composite
|
||||||
screensavers
|
screensavers
|
||||||
</subdirs>
|
</subdirs>
|
||||||
|
|
||||||
|
|||||||
@@ -4,19 +4,29 @@
|
|||||||
|
|
||||||
<extradist>
|
<extradist>
|
||||||
button.asm
|
button.asm
|
||||||
|
buttongroup.asm
|
||||||
|
checkbox.asm
|
||||||
|
cwidget.asm
|
||||||
guiapp.asm
|
guiapp.asm
|
||||||
|
hbuttongroup.asm
|
||||||
hlayout.asm
|
hlayout.asm
|
||||||
|
imagebutton.asm
|
||||||
|
imagelabel.asm
|
||||||
imageview.asm
|
imageview.asm
|
||||||
|
keypad.asm
|
||||||
|
keypad_num.asm
|
||||||
label.asm
|
label.asm
|
||||||
layout.asm
|
layout.asm
|
||||||
mainwindow.asm
|
|
||||||
mclayout.asm
|
mclayout.asm
|
||||||
object.asm
|
object.asm
|
||||||
rootwindow.asm
|
rootwindow.asm
|
||||||
textbutton.asm
|
textbutton.asm
|
||||||
|
tile.asm
|
||||||
valuelabel.asm
|
valuelabel.asm
|
||||||
vlayout.asm
|
vlayout.asm
|
||||||
widget.asm
|
widget.asm
|
||||||
|
wlist.asm
|
||||||
|
wlist_elem.asm
|
||||||
</extradist>
|
</extradist>
|
||||||
|
|
||||||
</gwbuild>
|
</gwbuild>
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ OBJ_Fini:
|
|||||||
; CAVEAT: Y is invalid after return!
|
; CAVEAT: Y is invalid after return!
|
||||||
;
|
;
|
||||||
; @param Y address of object in SDRAM
|
; @param Y address of object in SDRAM
|
||||||
; @clobbers none
|
; @clobbers any, !Y
|
||||||
|
|
||||||
OBJ_Free:
|
OBJ_Free:
|
||||||
tst yl
|
tst yl
|
||||||
@@ -1111,6 +1111,42 @@ OBJ_CountDirectChildren_done:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine OBJ_FreeChildren @global
|
||||||
|
;
|
||||||
|
; @param Y address of object whose children are to be free'd
|
||||||
|
; @clobbers any, !Y
|
||||||
|
|
||||||
|
OBJ_FreeChildren:
|
||||||
|
push yl
|
||||||
|
push yh
|
||||||
|
clr r16
|
||||||
|
rcall OBJ_GetFirstChild
|
||||||
|
brcc OBJ_FreeChildren_done
|
||||||
|
OBJ_FreeChildren_loop:
|
||||||
|
mov yl, r18
|
||||||
|
mov yh, r19
|
||||||
|
rcall OBJ_GetNext
|
||||||
|
brcs OBJ_FreeChildren_loopFree
|
||||||
|
clr r18
|
||||||
|
clr r19
|
||||||
|
OBJ_FreeChildren_loopFree:
|
||||||
|
push r18
|
||||||
|
push r19
|
||||||
|
rcall OBJ_Free
|
||||||
|
pop r19
|
||||||
|
pop r18
|
||||||
|
mov r16, r18
|
||||||
|
or r16, r19
|
||||||
|
brne OBJ_FreeChildren_loop
|
||||||
|
OBJ_FreeChildren_done:
|
||||||
|
pop yh
|
||||||
|
pop yl
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ***************************************************************************
|
; ***************************************************************************
|
||||||
; data in FLASH
|
; data in FLASH
|
||||||
|
|
||||||
|
|||||||
@@ -1089,6 +1089,7 @@ Widget_DrawCharAt:
|
|||||||
; @param R5:R4 X relative to widget
|
; @param R5:R4 X relative to widget
|
||||||
; @param R7:R6 Y relative to widget
|
; @param R7:R6 Y relative to widget
|
||||||
; @return Z pointer to next char to write if CFLAG clear
|
; @return Z pointer to next char to write if CFLAG clear
|
||||||
|
; @return R5:R4 X pos behind last written char
|
||||||
; @clobbers any, !Y
|
; @clobbers any, !Y
|
||||||
|
|
||||||
Widget_DrawTextFlash:
|
Widget_DrawTextFlash:
|
||||||
@@ -1127,6 +1128,7 @@ Widget_DrawTextRam:
|
|||||||
; @param Z byte address pointer to text in flash (for LPM!)
|
; @param Z byte address pointer to text in flash (for LPM!)
|
||||||
; @return CFLAG set if completely written
|
; @return CFLAG set if completely written
|
||||||
; @return Z pointer to next char to write if CFLAG clear
|
; @return Z pointer to next char to write if CFLAG clear
|
||||||
|
; @return R5:R4 X pos behind last written char
|
||||||
; @clobbers any, !Y
|
; @clobbers any, !Y
|
||||||
|
|
||||||
Widget_DrawColoredTextFlash:
|
Widget_DrawColoredTextFlash:
|
||||||
|
|||||||
200
avr/modules/lcd2/gui/base/wlist.asm
Normal file
200
avr/modules/lcd2/gui/base/wlist.asm
Normal file
@@ -0,0 +1,200 @@
|
|||||||
|
; ***************************************************************************
|
||||||
|
; 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_WLIST_ASM
|
||||||
|
#define AQH_AVR_GUI2_WLIST_ASM
|
||||||
|
|
||||||
|
|
||||||
|
; ***************************************************************************
|
||||||
|
; defines
|
||||||
|
|
||||||
|
.equ WLIST_OFFS_BEGIN = VLAYOUT_SIZE
|
||||||
|
.equ WLIST_OFFS_ELEMLIST_LO = VLAYOUT_OFFS_BEGIN+0
|
||||||
|
.equ WLIST_OFFS_ELEMLIST_HI = VLAYOUT_OFFS_BEGIN+1
|
||||||
|
.equ WLIST_OFFS_ELEMOFFSET = VLAYOUT_OFFS_BEGIN+2
|
||||||
|
.equ WLIST_OFFS_ELEMNUM = VLAYOUT_OFFS_BEGIN+3
|
||||||
|
.equ WLIST_SIZE = VLAYOUT_OFFS_BEGIN+4
|
||||||
|
|
||||||
|
|
||||||
|
; signals
|
||||||
|
.equ WLIST_SIGNAL_MKOBJECT = WIDGET_SIGNAL_NEXTFREE+0
|
||||||
|
.equ WLIST_SIGNAL_NEXTFREE = WIDGET_SIGNAL_NEXTFREE+1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ***************************************************************************
|
||||||
|
; code
|
||||||
|
|
||||||
|
.cseg
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine WList_new @global
|
||||||
|
;
|
||||||
|
; @return CFLAG set of okay, cleared otherwise
|
||||||
|
; @return Y address of newly created object
|
||||||
|
; @param X parent widget
|
||||||
|
; @param r16 value for OBJECT_OFFS_OPTS
|
||||||
|
; @param r17 value for WIDGET_OFFS_PACK
|
||||||
|
; @clobbers any
|
||||||
|
|
||||||
|
WList_new:
|
||||||
|
ldi r24, LOW(VLAYOUT_SIZE)
|
||||||
|
ldi r25, HIGH(VLAYOUT_SIZE)
|
||||||
|
bigcall Object_Alloc ; (!r16, !r17, !X)
|
||||||
|
brcc WList_new_ret
|
||||||
|
rcall WList_Init ; (r16, r17, X)
|
||||||
|
sec
|
||||||
|
WList_new_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine WList_Init @global
|
||||||
|
;
|
||||||
|
; @param Y address of widget
|
||||||
|
; @param X parent widget (if any)
|
||||||
|
; @param r16 value for OBJECT_OFFS_OPTS
|
||||||
|
; @param r17 value for WIDGET_OFFS_PACK
|
||||||
|
; @clobbers r16, r17, X
|
||||||
|
|
||||||
|
WList_Init:
|
||||||
|
; call base class
|
||||||
|
ldi r20, VLAYOUT_MODE_EXPAND
|
||||||
|
bigcall VLayout_Init ; (r16, r17, X)
|
||||||
|
|
||||||
|
; set widget-specific data
|
||||||
|
|
||||||
|
; set default signal map
|
||||||
|
ldi r16, LOW(WList_DefaultSignalmap*2)
|
||||||
|
std Y+OBJECT_OFFS_SIGNALMAP_LO, r16
|
||||||
|
ldi r16, HIGH(WList_DefaultSignalmap*2)
|
||||||
|
std Y+OBJECT_OFFS_SIGNALMAP_HI, r16
|
||||||
|
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
wListRebuild:
|
||||||
|
; release current widgets
|
||||||
|
bigcall OBJ_FreeChildren ; (any, !Y)
|
||||||
|
|
||||||
|
rcall wListGetStartElement
|
||||||
|
brcc wListRebuild_ret
|
||||||
|
|
||||||
|
; get startY and height
|
||||||
|
bigcall Widget_GetBorderAndSpacing
|
||||||
|
mov r6, r23 ; YPOS (start after border)
|
||||||
|
clr r7
|
||||||
|
ldd r10, Y+WIDGET_OFFS_HEIGHT_LO
|
||||||
|
ldd r11, Y+WIDGET_OFFS_HEIGHT_HI
|
||||||
|
sub r10, r23
|
||||||
|
sbc r11, r23
|
||||||
|
add r11, r23
|
||||||
|
|
||||||
|
wListRebuild_loop:
|
||||||
|
; check height (does element fit?)
|
||||||
|
adiw xh:xl, WLIST_ELEM_OFFS_HEIGHT_LO
|
||||||
|
ld r18, X+
|
||||||
|
ld r19, X
|
||||||
|
sbiw xh:xl, (WLIST_ELEM_OFFS_HEIGHT_LO+1)
|
||||||
|
add r18, r6 ; height+currentY
|
||||||
|
adc r19, r7
|
||||||
|
cp r18, r10
|
||||||
|
cpc r19, r11
|
||||||
|
brcc wListRebuild_ret ; outside window, done
|
||||||
|
|
||||||
|
; create child widget for item
|
||||||
|
push r6
|
||||||
|
push r7
|
||||||
|
push r10
|
||||||
|
push r11
|
||||||
|
push r22
|
||||||
|
push xl
|
||||||
|
push xh
|
||||||
|
ldi r16, WLIST_SIGNAL_MKOBJECT ; in: list element
|
||||||
|
clr r17
|
||||||
|
bigcall OBJ_HandleSignal ; out: r19:r18=result (if CFLAG set)
|
||||||
|
pop xh
|
||||||
|
pop xl
|
||||||
|
pop r22
|
||||||
|
pop r11
|
||||||
|
pop r10
|
||||||
|
pop r7
|
||||||
|
pop r6
|
||||||
|
brcc wListRebuild_ret
|
||||||
|
|
||||||
|
; increment Y
|
||||||
|
adiw xh:xl, WLIST_ELEM_OFFS_HEIGHT_LO
|
||||||
|
ld r18, X+
|
||||||
|
ld r19, X
|
||||||
|
sbiw xh:xl, (WLIST_ELEM_OFFS_HEIGHT_LO+1)
|
||||||
|
add r6, r18 ; add item height
|
||||||
|
adc r7, r19
|
||||||
|
add r6, r22 ; add spacing
|
||||||
|
adc r7, r22
|
||||||
|
sub r7, r22
|
||||||
|
|
||||||
|
; next element
|
||||||
|
ld r16, X+
|
||||||
|
ld r17, X
|
||||||
|
mov xl, r16
|
||||||
|
mov xh, r17
|
||||||
|
or r16, r17
|
||||||
|
brne wListRebuild_loop
|
||||||
|
|
||||||
|
wListRebuild_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine wListGetStartElement @global
|
||||||
|
;
|
||||||
|
; @param Y address of widget
|
||||||
|
; @return CFLAG set if start element found, cleared otherwise
|
||||||
|
; @return X pointer to start element
|
||||||
|
|
||||||
|
wListGetStartElement:
|
||||||
|
push yl
|
||||||
|
push yh
|
||||||
|
ldd r16, Y+WLIST_OFFS_ELEMOFFSET
|
||||||
|
ldd r17, Y+WLIST_OFFS_ELEMLIST_LO
|
||||||
|
ldd yh, Y+WLIST_OFFS_ELEMLIST_HI
|
||||||
|
mov yl, r17
|
||||||
|
bigcall List_GetItemAt ; X=element at (r16, r17)
|
||||||
|
pop yh
|
||||||
|
pop yl
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ***************************************************************************
|
||||||
|
; data in FLASH
|
||||||
|
|
||||||
|
WList_DefaultSignalmap:
|
||||||
|
; header
|
||||||
|
.dw VLayout_DefaultSignalmap*2 ; next table to use
|
||||||
|
; entries
|
||||||
|
|
||||||
|
.db 0, 0, 0, 0 ; end of table
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
86
avr/modules/lcd2/gui/base/wlist_elem.asm
Normal file
86
avr/modules/lcd2/gui/base/wlist_elem.asm
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
; ***************************************************************************
|
||||||
|
; 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_GUI_WLIST_ELEM_ASM
|
||||||
|
#define AQH_AVR_GUI_WLIST_ELEM_ASM
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ***************************************************************************
|
||||||
|
; defines
|
||||||
|
|
||||||
|
.equ WLIST_ELEM_OFFS_BEGIN = LIST_SIZE
|
||||||
|
.equ WLIST_ELEM_OFFS_IMGRES_LO = WLIST_ELEM_OFFS_BEGIN+0
|
||||||
|
.equ WLIST_ELEM_OFFS_IMGRES_HI = WLIST_ELEM_OFFS_BEGIN+1
|
||||||
|
.equ WLIST_ELEM_OFFS_TXTRES_LO = WLIST_ELEM_OFFS_BEGIN+2
|
||||||
|
.equ WLIST_ELEM_OFFS_TXTRES_HI = WLIST_ELEM_OFFS_BEGIN+3
|
||||||
|
.equ WLIST_ELEM_OFFS_USER_LO = WLIST_ELEM_OFFS_BEGIN+4
|
||||||
|
.equ WLIST_ELEM_OFFS_USER_HI = WLIST_ELEM_OFFS_BEGIN+5
|
||||||
|
.equ WLIST_ELEM_OFFS_HEIGHT_LO = WLIST_ELEM_OFFS_BEGIN+6
|
||||||
|
.equ WLIST_ELEM_OFFS_HEIGHT_HI = WLIST_ELEM_OFFS_BEGIN+7
|
||||||
|
.equ WLIST_ELEM_SIZE = WLIST_ELEM_OFFS_BEGIN+8
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ***************************************************************************
|
||||||
|
; code
|
||||||
|
|
||||||
|
.cseg
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine WidgetListElem_new @global
|
||||||
|
;
|
||||||
|
; @return Y address of created object
|
||||||
|
|
||||||
|
WidgetListElem_new:
|
||||||
|
ldi r24, LOW(WLIST_ELEM_SIZE)
|
||||||
|
ldi r25, HIGH(WLIST_ELEM_SIZE)
|
||||||
|
bigcall Heap_AllocAndZero
|
||||||
|
brcc WidgetListElem_new_ret
|
||||||
|
mov yl, xl
|
||||||
|
mov yh, xh
|
||||||
|
bigcall List_InitObject ; (r16)
|
||||||
|
sec
|
||||||
|
ret
|
||||||
|
WidgetListElem_new_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine WidgetListElem_free @global
|
||||||
|
;
|
||||||
|
; @param Y address of object
|
||||||
|
; @clobbers r16, r17, r24, r25, X
|
||||||
|
|
||||||
|
WidgetListElem_free:
|
||||||
|
tst yl
|
||||||
|
brne WidgetListElem_free_notNull
|
||||||
|
tst yh
|
||||||
|
brne WidgetListElem_free_notNull
|
||||||
|
rjmp WidgetListElem_free_ret
|
||||||
|
WidgetListElem_free_notNull:
|
||||||
|
bigcall List_FiniObject ; (r16)
|
||||||
|
mov xl, yl
|
||||||
|
mov xh, yh
|
||||||
|
bigcall Heap_Free ; (r16, r17, r24, r25, X)
|
||||||
|
WidgetListElem_free_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
15
avr/modules/lcd2/gui/composite/0BUILD
Normal file
15
avr/modules/lcd2/gui/composite/0BUILD
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<?xml?>
|
||||||
|
|
||||||
|
<gwbuild>
|
||||||
|
|
||||||
|
<extradist>
|
||||||
|
cdialog.asm
|
||||||
|
d_numinput.asm
|
||||||
|
dialog.asm
|
||||||
|
hspinner.asm
|
||||||
|
mainwindow.asm
|
||||||
|
</extradist>
|
||||||
|
|
||||||
|
</gwbuild>
|
||||||
|
|
||||||
|
|
||||||
506
avr/modules/lcd2/gui/composite/textsel.asm
Normal file
506
avr/modules/lcd2/gui/composite/textsel.asm
Normal file
@@ -0,0 +1,506 @@
|
|||||||
|
; ***************************************************************************
|
||||||
|
; 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_GUI_TEXTSEL_ASM
|
||||||
|
#define AQH_AVR_GUI_TEXTSEL_ASM
|
||||||
|
|
||||||
|
|
||||||
|
; ***************************************************************************
|
||||||
|
; ***************************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ***************************************************************************
|
||||||
|
; defines
|
||||||
|
|
||||||
|
.equ TEXTSEL_OFFS_BEGIN = HLAYOUT_SIZE
|
||||||
|
.equ TEXTSEL_OFFS_CURVALUE_LO = TEXTSEL_OFFS_BEGIN+0
|
||||||
|
.equ TEXTSEL_OFFS_CURVALUE_HI = TEXTSEL_OFFS_BEGIN+1
|
||||||
|
.equ TEXTSEL_OFFS_TEXTLIST_LO = TEXTSEL_OFFS_BEGIN+2
|
||||||
|
.equ TEXTSEL_OFFS_TEXTLIST_HI = TEXTSEL_OFFS_BEGIN+3
|
||||||
|
.equ TEXTSEL_OFFS_CURRIDX = TEXTSEL_OFFS_BEGIN+4
|
||||||
|
.equ TEXTSEL_OFFS_COUNT = TEXTSEL_OFFS_BEGIN+5
|
||||||
|
.equ TEXTSEL_SIZE = TEXTSEL_OFFS_BEGIN+6
|
||||||
|
|
||||||
|
|
||||||
|
; selectors
|
||||||
|
.equ TEXTSEL_SEL_LEFT = 1
|
||||||
|
.equ TEXTSEL_SEL_RIGHT = 2
|
||||||
|
|
||||||
|
|
||||||
|
; child widgets
|
||||||
|
.equ TEXTSEL_CHILDIDX_LEFT = 0
|
||||||
|
.equ TEXTSEL_CHILDIDX_VALUE = 1
|
||||||
|
.equ TEXTSEL_CHILDIDX_EIGHT = 2
|
||||||
|
|
||||||
|
|
||||||
|
; ***************************************************************************
|
||||||
|
; code
|
||||||
|
|
||||||
|
.cseg
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine TextSel_new @global
|
||||||
|
;
|
||||||
|
; @return CFLAG set of okay, cleared otherwise
|
||||||
|
; @return Y address of newly created object
|
||||||
|
; @param X parent widget
|
||||||
|
; @param r16 value for OBJECT_OFFS_OPTS
|
||||||
|
; @param r17 value for WIDGET_OFFS_PACK
|
||||||
|
; @param r21:r20 pointer to null-terminated list of text ressources in FLASH (byte address for LPM!)
|
||||||
|
; @clobbers any
|
||||||
|
|
||||||
|
TextSel_new:
|
||||||
|
ldi r24, LOW(TEXTSEL_SIZE)
|
||||||
|
ldi r25, HIGH(TEXTSEL_SIZE)
|
||||||
|
push r20
|
||||||
|
push r21
|
||||||
|
bigcall Object_Alloc ; (!r16, !r17, !X)
|
||||||
|
pop r21
|
||||||
|
pop r20
|
||||||
|
brcc TextSel_new_ret
|
||||||
|
rcall TextSel_Init ; (any, !Y)
|
||||||
|
sec
|
||||||
|
TextSel_new_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine TextSel_Init @global
|
||||||
|
;
|
||||||
|
; @param Y address of widget
|
||||||
|
; @param X parent widget (if any)
|
||||||
|
; @param r16 value for OBJECT_OFFS_OPTS
|
||||||
|
; @param r17 value for WIDGET_OFFS_PACK
|
||||||
|
; @param r21:r20 pointer to null-terminated list of text ressources in FLASH (byte address for LPM!)
|
||||||
|
; @clobbers any, !Y
|
||||||
|
|
||||||
|
TextSel_Init:
|
||||||
|
; call base class
|
||||||
|
push r20
|
||||||
|
push r21
|
||||||
|
ldi r20, HLAYOUT_MODE_EXPAND
|
||||||
|
bigcall HLayout_Init
|
||||||
|
pop r21
|
||||||
|
pop r20
|
||||||
|
brcc TextSel_Init_ret
|
||||||
|
|
||||||
|
; set values
|
||||||
|
std Y+TEXTSEL_OFFS_TEXTLIST_LO, r20
|
||||||
|
std Y+TEXTSEL_OFFS_TEXTLIST_HI, r21
|
||||||
|
|
||||||
|
; set default signal map
|
||||||
|
ldi r16, LOW(TextSel_DefaultSignalmap*2)
|
||||||
|
std Y+OBJECT_OFFS_SIGNALMAP_LO, r16
|
||||||
|
ldi r16, HIGH(TextSel_DefaultSignalmap*2)
|
||||||
|
std Y+OBJECT_OFFS_SIGNALMAP_HI, r16
|
||||||
|
|
||||||
|
rcall textSelCreateChildren ; (any, !Y)
|
||||||
|
TextSel_Init_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine textSelCreateChildren
|
||||||
|
;
|
||||||
|
; @param Y spinner object
|
||||||
|
; @clobbers any, !Y
|
||||||
|
|
||||||
|
textSelCreateChildren:
|
||||||
|
push yl
|
||||||
|
push yh
|
||||||
|
mov xl, yl ; parent
|
||||||
|
mov xh, yh
|
||||||
|
|
||||||
|
; create left button
|
||||||
|
call textSelCreateLeftButton
|
||||||
|
brcc textSelCreateChildren_popRet
|
||||||
|
; create label
|
||||||
|
ldi r16, 0 ; OPTS
|
||||||
|
ldi r17, (WIDGET_PACK_END<<WIDGET_PACK_HSELF0_BIT) | (WIDGET_PACK_CENTER<<WIDGET_PACK_VSELF0_BIT) | \
|
||||||
|
(WIDGET_PACK_END<<WIDGET_PACK_HCONTENT0_BIT) | (WIDGET_PACK_CENTER<<WIDGET_PACK_VCONTENT0_BIT) ; PACK
|
||||||
|
clr r20
|
||||||
|
clr r21
|
||||||
|
push xl
|
||||||
|
push xh
|
||||||
|
bigcall Label_new
|
||||||
|
pop xh
|
||||||
|
pop xl
|
||||||
|
brcc textSelCreateChildren_popRet
|
||||||
|
|
||||||
|
; create right button
|
||||||
|
call textSelCreateRightButton
|
||||||
|
textSelCreateChildren_popRet:
|
||||||
|
pop yh
|
||||||
|
pop yl
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
textSelCreateLeftButton:
|
||||||
|
push xl
|
||||||
|
push xh
|
||||||
|
; create button
|
||||||
|
ldi r16, (1<<WIDGET_OPTS_BORDER_BIT) ; OPTS
|
||||||
|
ldi r17, (WIDGET_PACK_BEGIN<<WIDGET_PACK_HSELF0_BIT) | (WIDGET_PACK_CENTER<<WIDGET_PACK_VSELF0_BIT) ; PACK
|
||||||
|
ldi r20, LOW(RESSOURCE_TXT_LESSERTHAN_C) ; text ressource
|
||||||
|
ldi r21, HIGH(RESSOURCE_TXT_LESSERTHAN_C)
|
||||||
|
ldi r22, TEXTSEL_SEL_LEFT ; selector
|
||||||
|
ldi r23, BUTTON_MODE_REPEATED
|
||||||
|
bigcall TextButton_new
|
||||||
|
brcc textSelCreateLeftButton_done
|
||||||
|
|
||||||
|
; set style in Label part of the text button
|
||||||
|
bigcall OBJ_GetFirstChild
|
||||||
|
brcc textSelCreateLeftButton_done
|
||||||
|
mov yl, r18
|
||||||
|
mov yh, r19
|
||||||
|
ldi r16, LOW(TextSel_ButtonStyle*2)
|
||||||
|
std Y+WIDGET_OFFS_STYLE_LO, r16
|
||||||
|
ldi r16, HIGH(TextSel_ButtonStyle*2)
|
||||||
|
std Y+WIDGET_OFFS_STYLE_HI, r16
|
||||||
|
textSelCreateLeftButton_done:
|
||||||
|
pop xh
|
||||||
|
pop xl
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
textSelCreateRightButton:
|
||||||
|
push xl
|
||||||
|
push xh
|
||||||
|
; create button
|
||||||
|
ldi r16, (1<<WIDGET_OPTS_BORDER_BIT) ; OPTS
|
||||||
|
ldi r17, (WIDGET_PACK_BEGIN<<WIDGET_PACK_HSELF0_BIT) | (WIDGET_PACK_CENTER<<WIDGET_PACK_VSELF0_BIT) ; PACK
|
||||||
|
ldi r20, LOW(RESSOURCE_TXT_GREATERTHAN_C) ; text ressource
|
||||||
|
ldi r21, HIGH(RESSOURCE_TXT_GREATERTHAN_C)
|
||||||
|
ldi r22, TEXTSEL_SEL_RIGHT ; selector
|
||||||
|
ldi r23, BUTTON_MODE_REPEATED
|
||||||
|
bigcall TextButton_new
|
||||||
|
brcc textSelCreateRightButton_done
|
||||||
|
|
||||||
|
; set style in Label part of the text button
|
||||||
|
bigcall OBJ_GetFirstChild
|
||||||
|
brcc textSelCreateRightButton_done
|
||||||
|
mov yl, r18
|
||||||
|
mov yh, r19
|
||||||
|
ldi r16, LOW(TextSel_ButtonStyle*2)
|
||||||
|
std Y+WIDGET_OFFS_STYLE_LO, r16
|
||||||
|
ldi r16, HIGH(TextSel_ButtonStyle*2)
|
||||||
|
std Y+WIDGET_OFFS_STYLE_HI, r16
|
||||||
|
textSelCreateRightButton_done:
|
||||||
|
pop xh
|
||||||
|
pop xl
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine textSelSetValue
|
||||||
|
;
|
||||||
|
; @param Y widget
|
||||||
|
; @param X new value
|
||||||
|
; @clobbers any, !Y
|
||||||
|
|
||||||
|
textSelSetValue:
|
||||||
|
std Y+TEXTSEL_OFFS_CURVALUE_LO, xl
|
||||||
|
std Y+TEXTSEL_OFFS_CURVALUE_HI, xh
|
||||||
|
rjmp textSelSendValue
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
textSelSendValue:
|
||||||
|
ldi r16, TEXTSEL_CHILDIDX_VALUE
|
||||||
|
bigcall OBJ_GetChildAt ; r19:r18=value label (r16)
|
||||||
|
brcc textSelSendValue_ret
|
||||||
|
push yl
|
||||||
|
push yh
|
||||||
|
ldd xl, Y+TEXTSEL_OFFS_CURVALUE_LO
|
||||||
|
ldd xh, Y+TEXTSEL_OFFS_CURVALUE_HI
|
||||||
|
mov yl, r18
|
||||||
|
mov yh, r19
|
||||||
|
ldi r17, LABEL_VALUE_TEXTRES
|
||||||
|
bigcall Widget_SetValue ; (any, !Y)
|
||||||
|
pop yh
|
||||||
|
pop yl
|
||||||
|
rcall textSelEmitCmdSignal
|
||||||
|
textSelSendValue_ret:
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine textSelEmitCmdSignal
|
||||||
|
;
|
||||||
|
; @param Y widget
|
||||||
|
; @clobbers any, !Y
|
||||||
|
|
||||||
|
textSelEmitCmdSignal:
|
||||||
|
ldi r16, WIDGET_SIGNAL_COMMAND
|
||||||
|
ldd xl, Y+TEXTSEL_OFFS_CURVALUE_LO
|
||||||
|
ldd xh, Y+TEXTSEL_OFFS_CURVALUE_HI
|
||||||
|
bigjmp OBJ_EmitSignal
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine textCountRessources
|
||||||
|
;
|
||||||
|
; @param Y widget
|
||||||
|
; @clobbers r16-r19
|
||||||
|
|
||||||
|
textCountRessources:
|
||||||
|
push zl
|
||||||
|
push zh
|
||||||
|
ldd zl, Y+TEXTSEL_OFFS_TEXTLIST_LO
|
||||||
|
ldd zh, Y+TEXTSEL_OFFS_TEXTLIST_HI
|
||||||
|
mov r16, zl
|
||||||
|
or r16, zh
|
||||||
|
breq textCountRessources_done
|
||||||
|
clr r17
|
||||||
|
textCountRessources_loop:
|
||||||
|
lpm r18, Z+
|
||||||
|
lpm r19, Z+
|
||||||
|
mov r16, r18
|
||||||
|
or r16, r19
|
||||||
|
breq textCountRessources_done
|
||||||
|
inc r17
|
||||||
|
rjmp textCountRessources_loop
|
||||||
|
textCountRessources_done:
|
||||||
|
pop zh
|
||||||
|
pop zl
|
||||||
|
std Y+TEXTSEL_OFFS_COUNT, r17
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine textSelGetRessIdAt
|
||||||
|
;
|
||||||
|
; @param Y widget
|
||||||
|
; @param r16 idx
|
||||||
|
; @return CFLAG set if ressource id found
|
||||||
|
; @return X ressource id (if CFLAG set)
|
||||||
|
; @clobbers r16, r17
|
||||||
|
|
||||||
|
textSelGetRessIdAt:
|
||||||
|
push zl
|
||||||
|
push zh
|
||||||
|
ldd r17, Y+TEXTSEL_OFFS_COUNT
|
||||||
|
cp r16, r17
|
||||||
|
brcc textSelGetRessIdAt_done
|
||||||
|
add r16, r16
|
||||||
|
ldd zl, Y+TEXTSEL_OFFS_TEXTLIST_LO
|
||||||
|
ldd zh, Y+TEXTSEL_OFFS_TEXTLIST_HI
|
||||||
|
mov r17, zl
|
||||||
|
or r17, zh
|
||||||
|
clc
|
||||||
|
breq textSelGetRessIdAt_done
|
||||||
|
add zl, r16
|
||||||
|
adc zh, r16
|
||||||
|
sub zh, r16
|
||||||
|
lpm xl, Z+
|
||||||
|
lpm xh, Z
|
||||||
|
mov r17, xl
|
||||||
|
or r17, xh
|
||||||
|
clc
|
||||||
|
breq textSelGetRessIdAt_done
|
||||||
|
sec
|
||||||
|
textSelGetRessIdAt_done:
|
||||||
|
pop zh
|
||||||
|
pop zl
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine textGetIdxForRessource
|
||||||
|
;
|
||||||
|
; @param Y widget
|
||||||
|
; @param X ressource id to look for
|
||||||
|
; @return CFLAG set if found, cleared otherwise
|
||||||
|
; @return r16 idx
|
||||||
|
|
||||||
|
textGetIdxForRessource:
|
||||||
|
push zl
|
||||||
|
push zh
|
||||||
|
ldd zl, Y+TEXTSEL_OFFS_TEXTLIST_LO
|
||||||
|
ldd zh, Y+TEXTSEL_OFFS_TEXTLIST_HI
|
||||||
|
mov r16, zl
|
||||||
|
or r16, zh
|
||||||
|
breq textGetIdxForRessource_done
|
||||||
|
clr r16
|
||||||
|
textGetIdxForRessource_loop:
|
||||||
|
lpm r18, Z+
|
||||||
|
lpm r19, Z+
|
||||||
|
mov r17, r18
|
||||||
|
or r17, r19
|
||||||
|
clc
|
||||||
|
breq textGetIdxForRessource_done
|
||||||
|
cp r18, xl
|
||||||
|
brne textGetIdxForRessource_next
|
||||||
|
cp r19, xh
|
||||||
|
brne textGetIdxForRessource_next
|
||||||
|
sec
|
||||||
|
rjmp textGetIdxForRessource_done
|
||||||
|
textGetIdxForRessource_next:
|
||||||
|
inc r16
|
||||||
|
rjmp textGetIdxForRessource_loop
|
||||||
|
textGetIdxForRessource_done:
|
||||||
|
pop zh
|
||||||
|
pop zl
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ***************************************************************************
|
||||||
|
; signal handlers
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine TextSel_OnCmdLeft @global
|
||||||
|
;
|
||||||
|
; @param Y widget
|
||||||
|
|
||||||
|
TextSel_OnCmdLeft:
|
||||||
|
ldd r16, Y+TEXTSEL_OFFS_CURRIDX
|
||||||
|
tst r16
|
||||||
|
breq TextSel_OnCmdLeft_ret
|
||||||
|
dec r16
|
||||||
|
std Y+TEXTSEL_OFFS_CURRIDX, r16
|
||||||
|
rcall textSelGetRessIdAt ; X=ressource id (r16, r17)
|
||||||
|
brcc TextSel_OnCmdLeft_ret
|
||||||
|
std Y+TEXTSEL_OFFS_CURVALUE_LO, xl
|
||||||
|
std Y+TEXTSEL_OFFS_CURVALUE_HI, xh
|
||||||
|
rcall textSelSetValue
|
||||||
|
TextSel_OnCmdLeft_ret:
|
||||||
|
sec
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine TextSel_OnCmdRight @global
|
||||||
|
;
|
||||||
|
; @param Y widget
|
||||||
|
|
||||||
|
TextSel_OnCmdRight:
|
||||||
|
ldd r16, Y+TEXTSEL_OFFS_CURRIDX
|
||||||
|
ldd r17, Y+TEXTSEL_OFFS_COUNT
|
||||||
|
inc r16
|
||||||
|
cp r16, r17
|
||||||
|
brcc TextSel_OnCmdRight_ret
|
||||||
|
std Y+TEXTSEL_OFFS_CURRIDX, r16
|
||||||
|
rcall textSelGetRessIdAt ; X=ressource id (r16, r17)
|
||||||
|
brcc TextSel_OnCmdRight_ret
|
||||||
|
std Y+TEXTSEL_OFFS_CURVALUE_LO, xl
|
||||||
|
std Y+TEXTSEL_OFFS_CURVALUE_HI, xh
|
||||||
|
rcall textSelSetValue
|
||||||
|
TextSel_OnCmdRight_ret:
|
||||||
|
sec
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine TextSel_OnSetValue @global
|
||||||
|
;
|
||||||
|
; @param Y widget
|
||||||
|
; @param X new value (selected text ressource id)
|
||||||
|
|
||||||
|
TextSel_OnSetValue:
|
||||||
|
rcall textGetIdxForRessource
|
||||||
|
brcc TextSel_OnSetValue_ret
|
||||||
|
std Y+TEXTSEL_OFFS_CURRIDX, r16
|
||||||
|
std Y+TEXTSEL_OFFS_CURVALUE_LO, xl
|
||||||
|
std Y+TEXTSEL_OFFS_CURVALUE_HI, xh
|
||||||
|
rcall textSelSendValue
|
||||||
|
TextSel_OnSetValue_ret:
|
||||||
|
sec
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ---------------------------------------------------------------------------
|
||||||
|
; @routine TextSel_OnGetValue @global
|
||||||
|
;
|
||||||
|
; @param Y widget
|
||||||
|
; @return r19:r18 value
|
||||||
|
|
||||||
|
TextSel_OnGetValue:
|
||||||
|
ldd r18, Y+TEXTSEL_OFFS_CURVALUE_LO
|
||||||
|
ldd r19, Y+TEXTSEL_OFFS_CURVALUE_HI
|
||||||
|
sec
|
||||||
|
ret
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ***************************************************************************
|
||||||
|
; data in FLASH
|
||||||
|
|
||||||
|
|
||||||
|
TextSel_ButtonStyle:
|
||||||
|
.dw DISPLAY_COLOR_BLACK ; frontCol_norm
|
||||||
|
.dw DISPLAY_COLOR_WHITE ; backCol_norm
|
||||||
|
.dw DISPLAY_COLOR_BLACK ; borderCol_norm
|
||||||
|
.dw DISPLAY_COLOR_WHITE ; shadowCol_norm
|
||||||
|
|
||||||
|
.dw DISPLAY_COLOR_WHITE ; frontCol_activated
|
||||||
|
.dw DISPLAY_COLOR_NAVY ; backCol_activated
|
||||||
|
.dw DISPLAY_COLOR_BLACK ; borderCol_activated
|
||||||
|
.dw DISPLAY_COLOR_WHITE ; shadowCol_activated
|
||||||
|
|
||||||
|
.db 6, 0 ; outerBorderSize, innerBorderSize
|
||||||
|
.dw ili9341Font12x16_1*2 ; font
|
||||||
|
.db 12, 16 ; charWidth, charHeight
|
||||||
|
; @end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
TextSel_DefaultSignalmap:
|
||||||
|
; header
|
||||||
|
.dw HLayout_DefaultSignalmap*2 ; next table to use
|
||||||
|
; entries
|
||||||
|
|
||||||
|
.db TEXTSEL_SEL_LEFT, WIDGET_SIGNAL_COMMAND, LOW(TextSel_OnCmdLeft), HIGH(TextSel_OnCmdLeft)
|
||||||
|
.db TEXTSEL_SEL_RIGHT, WIDGET_SIGNAL_COMMAND, LOW(TextSel_OnCmdRight), HIGH(TextSel_OnCmdRight)
|
||||||
|
.db WIDGET_VALUE_CURRENTVALUE, WIDGET_SIGNAL_SETVALUE, LOW(TextSel_OnSetValue), HIGH(TextSel_OnSetValue)
|
||||||
|
.db WIDGET_VALUE_CURRENTVALUE, WIDGET_SIGNAL_GETVALUE, LOW(TextSel_OnGetValue), HIGH(TextSel_OnGetValue)
|
||||||
|
.db 0, 0, 0, 0 ; end of table
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
Reference in New Issue
Block a user