' DEMO -----------------------------------------------------------------
DO:
PRINT "Input screen width: 60 - 140, blank for default or -1 for debug mode: ";:
INPUT screen_width%
IF screen_width%
= -1 THEN debug%
= -1: margin.t
= 1: margin.b
= 1: margin.l
= 127: margin.r
= 5: screen_width%
= 150: noe
= 99:
GOTO make_fake_text
' Debug mode. IF screen_width%
= 0 THEN margin.t
= 1: margin.b
= 1: margin.l
= 10: margin.r
= 12: screen_width%
= 80: noe
= 40:
GOTO make_fake_text
' Use defaults for demo. DO:
PRINT "Input number of text entries 10 - 99: ";:
INPUT noe
DO:
PRINT "Input scrollbar indicator type 1 single 0 Expands per elements: ";:
INPUT scrb.opt
make_fake_text:
FOR j%
= 1 TO screen_width%
- (margin.l
+ margin.r
) - 3 x$(i%) = x$(i%) + a$
' End Demo ------------------------------------------------------------------
getvar_setscrn:
scrb.x = 0 ' Relative position of the scrollbar cursor from top of scrb.h. 0 Off / 1 to
page.w = scrn.w - (margin.l + margin.r)
page.h = scrn.h - (margin.t + margin.b)
scrb.t = margin.t + 1
scrb.b = margin.t + page.h
scrb.l = margin.l + page.w + 2
page.w = scrn.w - (margin.l + margin.r)
page.h = scrn.h - (margin.t + margin.b)
scrb.d = scrb.b - scrb.t + 1
scrb.h = scrb.b - scrb.t - 1 ' Max. vertical scroll. Bar minus the top and bottom arrow symbols.
scrb.s
= (scrb.h
+ 1) * 2 - noe:
IF scrb.s
<= 0 THEN scrb.s
= 1 scrb.s = 1
IF page.c
= 0 THEN page.c
= 7 ' Cursor apearance as underline. LOCATE margin.t
+ row
, margin.l
+ 1, 1, 7, page.c
GOSUB getcurrow: cursor.find
= -1
displayscrn:
j% = 0
DO ' page.h determines how mnay rows of text are displayed. j% = j% + 1
LOCATE margin.t
+ j%
, margin.l
+ 1 cursor.find = 0
IF cursor.scbrrow
> scr
AND cursor.scbrrow
<= scr
+ page.h
THEN LOCATE margin.t
+ cursor.scbrrow
- scr
, cursor.scbrcol
, 1 ' Cursor show.
makescrb:
LOCATE scrb.t
+ scrb.x
+ i%
, scrb.l
getkey:
scr = scr - 1
row = row - 1
LOCATE row
+ margin.t
, margin.l
+ 1 scr = scr + 1
row = row + 1
LOCATE row
+ margin.t
, margin.l
+ 1
' Reverse algorithm. Not needed for this routine. scrb.x = scrb.i / ((noe - scrb.d) / (scrb.h - scrb.s))
IF row
+ scr
>= INT((scrb.x
+ 1) * ((noe
- scrb.d
) / (scrb.h
- scrb.s
))) + page.h
THEN scrb.x = scrb.x + 1
scrb.i
= INT(scrb.x
* ((noe
- scrb.d
) / (scrb.h
- scrb.s
))) scrb.x = scrb.x - 1
scrb.i
= INT(scrb.x
* ((noe
- scrb.d
) / (scrb.h
- scrb.s
)))
delay.
on!
= 0 ' Toggle off.
mb.m = 0
IF mx%
= scrb.l
AND scrb.s
AND my%
>= scrb.t
AND my%
<= scrb.b
OR scrbardrag%
AND my%
> scrb.t
AND my%
< scrb.b
OR mb.m
> 0 AND scrb.x
+ scrb.s
< scrb.h
OR mb.m
< 0 AND scrb.x
<> 0 THEN ' Mouse on scrollbar or doing a bar cursor drag or using the scroll wheel. IF my%
= scrb.t
AND scrb.x
> 0 OR my%
= scrb.b
AND scrb.x
+ scrb.s
< scrb.h
OR mb.m
THEN ' Mouse on a scrollbar arrow. IF my%
= scrb.t
OR mb.m
< 0 THEN scrb.x
= scrb.x
- 1 ELSE scrb.x
= scrb.x
+ 1 ' Top or bottom arrow. scrb.i
= INT(scrb.x
* ((noe
- scrb.d
) / (scrb.h
- scrb.s
))) scr = scrb.i
cursor.find = -1
ELSEIF my%
- (scrb.t
+ 1) >= scrb.x
AND my%
- (scrb.t
+ 1) <= scrb.x
+ scrb.s
- 1 AND scrbardrag%
= 0 THEN ' Mouse on scrollbar cursor. scrbardrag% = -1: scrb.adjust = (my% - (scrb.t + 1)) - scrb.x
ELSEIF my%
> scrb.t
AND my%
< scrb.b
THEN ' Mouse on scrollbar between scrollbar arrow and cursor. IF my%
- (scrb.t
+ 1) - scrb.adjust
>= 0 AND my%
- (scrb.t
+ 1) + scrb.s
- scrb.adjust
<= scrb.h
OR scrbardrag%
= 0 THEN IF scrbardrag%
= 0 THEN ' NO drag, so adjust for cursor length for a click inside the scrollbar above or below the current scrollbar cursor position. IF my%
- (scrb.t
+ 1) > scrb.x
THEN scrb.adjust = (my% - (scrb.t + 1)) - scrb.x - 1
scrb.adjust = (my% - (scrb.t + 1)) - scrb.x + 1
scrb.x = my% - (scrb.t + 1) - scrb.adjust
scrb.i
= INT(scrb.x
* ((noe
- scrb.d
) / (scrb.h
- scrb.s
))) scr = scrb.i
cursor.find = -1
ELSE ' Scrollbar is at top or bottom and mouse cursor is moving vertically along the scrollbar cursor. This allows the variable to readjust. IF mx%
= scrb.l
THEN scrbardrag%
= 0: scrb.adjust
= 0 IF mx%
>= margin.l
+ 1 AND mx%
<= scrn.w
- margin.r
THEN LOCATE my%
, mx%
, 1 ' Locate by left mouse click and show cursor. scrbardrag% = 0: scrb.adjust = 0
getcurrow:
cursor.scbrrow = row + scr
cursor.holdscr = scr
cursor.holdrow = row
cursor.holdscrbx = scrb.x
backtocursor:
IF cursor.scbrrow
> scr
AND cursor.scbrrow
<= scr
+ page.h
THEN ' Display region does not contain cursor. Do nothing.
ELSE ' Display region contains the cursor. scr = cursor.holdscr
row = cursor.holdrow
scrb.x = cursor.holdscrbx
scrb.i = scr
debugger:
PRINT " initiate_scrb% ="; initiate_scrb%
PRINT " scrn.w ="; scrn.w;
" scrn.h ="; scrn.h; scrb.s;
" " PRINT " margin.t ="; margin.t;
" margin.b ="; margin.b;
" margin.l ="; margin.l;
" margin.r ="; margin.r; scrb.s;
" " PRINT " scrb.t ="; scrb.t;
" scrb.b ="; scrb.b;
" scrb.l ="; scrb.l;
" scrb.d ="; scrb.d;
" scrb.x = "; scrb.x;
" scrb.i ="; scrb.i;
" scrb.h ="; scrb.h;
" scrb.s ="; scrb.s;
" " PRINT " cursor.find ="; cursor.find;
" cursor.scbrrow ="; cursor.scbrrow;
" cursor.scbrcol = "; cursor.scbrcol; scrb.s;
" " PRINT " cursor.holdscr ="; cursor.holdscr;
" cursor.holdrow ="; cursor.holdrow;
" cursor.holdscrbx ="; cursor.holdscrbx
PRINT " page.h% ="; page.h%;
" noe% = "; noe%;
" delay_on! ="; delay_on!;
" row% = "; row%;
" scr% ="; scr%;
" mx% ="; mx%;
" my% ="; my%;
" mb.l ="; mb.l;
" mb.dragon ="; mb.dragon;
" mb.drag ="; mb.drag;
" "