implement range selection for listbox

This commit is contained in:
Iris Lightshard 2023-03-18 21:54:53 -06:00
parent 883686d4a2
commit 766a98f43b
Signed by: nilix
GPG key ID: 3B7FBC22144E6398

View file

@ -12,6 +12,8 @@
%MID_SEPARATOR { #0008 }
%BOTTOM_SECTION { #0040 }
( listbox helper macros )
%LB_DATA { #02 ADD }
%LB_LEN { #04 ADD }
%LB_OFFSET { #06 ADD }
@ -19,9 +21,10 @@
%LB_TOP { #09 ADD }
%LB_HEIGHT { #0b ADD }
%LB_SELECT_IDX { #0c ADD }
%SB_LEN { #0e ADD }
%SB_POS { #0f ADD }
%SB_STEP { #11 ADD }
%LB_SELECT_LEN { #0e ADD }
%SB_LEN { #10 ADD }
%SB_POS { #11 ADD }
%SB_STEP { #13 ADD }
|00 @System &vector $2 &wst $1 &rst $1 &eaddr $2 &ecode $1 &pad $1 &r $2 &g $2 &b $2 &debug $1 &halt $1
|10 @Console &vector $2 &read $1 &pad $5 &write $1 &error $1
@ -44,10 +47,10 @@
@resizing [ $1 &x $2 &y $2 &dx $2 &dy $2 ]
@decoding [ $1 &msg_type $1 &counting $1 &count $2 &processed $2 ]
@mboxes [ &bytes $2 &data $2 &len $2 &offset $2 &elem_offset $1
&top $2 &height $1 &select_index $2
&top $2 &height $1 &select_index $2 &select_len $2
&sb_len $1 &sb_pos $2 &sb_step $2 ]
@list [ &bytes $2 &data $2 &len $2 &offset $2 &elem_offset $1
&top $2 &height $1 &select_index $2
&top $2 &height $1 &select_index $2 &select_len $2
&sb_len $1 &sb_pos $2 &sb_step $2 ]
( program )
@ -64,6 +67,8 @@
;list_data .list/data STZ2
;mbox_data .mboxes/data STZ2
#0001 .list/select_len STZ2
#0001 .mboxes/select_len STZ2
.Screen/height DEI2 TOP_SECTION BOTTOM_SECTION ADD2 MID_SEPARATOR ADD2 SUB2 #03 SFT2 NIP .list/height STZ
TOP_SECTION #03 SFT2 NIP .mboxes/height STZ
@ -72,6 +77,11 @@
;on_screen .Screen/vector DEO2
;on_mouse .Mouse/vector DEO2
;on_stdin .Console/vector DEO2
;on_key .Controller/vector DEO2
BRK
@on_key ( -> )
.Controller/key DEI .Console/error DEO
BRK
@on_stdin ( -> )
@ -139,8 +149,8 @@ JMP2r
@on_mouse ( -> )
;mbox_select_handler .mboxes .refresh/mboxes #0000 mouse_event_list
;noop_list_click .list .refresh/list TOP_SECTION MID_SEPARATOR ADD2 mouse_event_list
;mbox_select_handler .mboxes .refresh/mboxes #0000 #00 mouse_event_list
;noop_list_click .list .refresh/list TOP_SECTION MID_SEPARATOR ADD2 #04 mouse_event_list
.resizing LDZ #00 EQU ,&resz_check JCN
( resizing )
@ -308,15 +318,18 @@ JMP2r
JMP2r
@get_entry_color ( list -- colorByte )
STHk LB_OFFSET LDZ2
STHkr LB_SELECT_IDX LDZ2
DUP LB_OFFSET LDZ2
ROT LB_SELECT_IDX LDZ2
NEQ2 ,&normal JCN
LTH2 ,&normal JCN
STHkr LB_OFFSET LDZ2
STHkr LB_SELECT_IDX LDZ2 STHkr LB_SELECT_LEN LDZ2 ADD2 #0001 SUB2
GTH2 ,&normal JCN
POPr
( selected )
#04 JMP2r
&normal
POPr
#03
JMP2r
@ -403,8 +416,9 @@ JMP2r
JMP2r
@mouse_event_list ( clickhandler* list refresh ypos* -- )
@mouse_event_list ( clickhandler* list refresh ypos* multiselect -- )
,&multi STR
,&y STR2
,&r STR
STH
@ -421,7 +435,7 @@ JMP2r
( scroll_up )
STHkr try_scroll_up_mouse
,&no_scroll JMP
&multi $1
&scroll_down
STHkr try_scroll_down_mouse
@ -431,7 +445,7 @@ JMP2r
( click handler here )
.Mouse/state DEI #01 AND #00 EQU ,&done JCN
.Mouse/y DEI2 ,&y LDR2 SUB2 #03 SFT2 STHkr LB_TOP LDZ2 ADD2 STHkr LB_SELECT_IDX STZ2
,&multi LDR ,&y LDR2 STHkr mouse_select_on_click
STHr ROT ROT JSR2
#01 ,&r LDR STZ
JMP2r
@ -443,6 +457,26 @@ JMP2r
POP2
JMP2r
@mouse_select_on_click ( multi ypos list -- )
STH
,&y STR2
.Controller/button DEI #04 AND AND ,&multiselect JCN
#0001 STHkr LB_SELECT_LEN STZ2
.Mouse/y DEI2 ,&y LDR2 SUB2 #03 SFT2 STHkr LB_TOP LDZ2 ADD2 STHkr LB_SELECT_IDX STZ2
POPr
JMP2r
&multiselect
( first_to_last )
.Mouse/y DEI2 ,&y LDR2 SUB2 #03 SFT2 STHkr LB_TOP LDZ2 ADD2
DUP2 STHkr LB_SELECT_IDX LDZ2 LTH2 ,&last_to_first JCN
STHkr LB_SELECT_IDX LDZ2 SUB2 INC2 STHkr LB_SELECT_LEN STZ2
POPr JMP2r
&last_to_first
DUP2 STHkr LB_SELECT_IDX LDZ2 SWP2 SUB2 INC2 STHkr LB_SELECT_LEN STZ2
STHr LB_SELECT_IDX STZ2
JMP2r
&y $2
@mbox_select_handler ( list -- )
#0000 ,&idx STR2