1
1
Fork 0
mirror of https://github.com/QB64-Phoenix-Edition/QB64pe.git synced 2024-06-26 17:10:38 +00:00

Improves ASCII Box controls.

This commit is contained in:
FellippeHeitor 2021-01-15 13:38:44 -03:00
parent 3b07e0a262
commit ee18d8ba9d

View file

@ -13863,8 +13863,16 @@ FUNCTION ideASCIIbox$
'-------- end of generic dialog box header --------
'-------- init --------
i = 0
idepar p, 56, 21, "ASCII Chart"
i = i + 1
o(i).typ = 1 'hidden text box to give focus to the chart
o(i).y = 3
o(i).x = 5
o(i).w = 5
TYPE position
x AS INTEGER
y AS INTEGER
@ -13890,13 +13898,12 @@ FUNCTION ideASCIIbox$
NEXT
i = i + 1
ButtonsID = i
o(i).typ = 3
o(i).y = 21
o(i).txt = idenewtxt("#Cancel")
o(i).txt = idenewtxt("#Insert character" + sep + "Insert C#HR$" + sep + "#Cancel")
o(i).dft = 1
Selected = 0
Selected = 1
'-------- end of init --------
@ -13905,12 +13912,6 @@ FUNCTION ideASCIIbox$
'-------- end of generic init --------
DO 'main loop
IF Selected THEN
idetxt(o(ButtonsID).txt) = "#Insert character" + sep + "Insert C#HR$" + sep + "#Cancel"
ELSE
idetxt(o(ButtonsID).txt) = "#Cancel"
END IF
'-------- generic display dialog box & objects --------
idedrawpar p
f = 1: cx = 0: cy = 0
@ -13927,12 +13928,17 @@ FUNCTION ideASCIIbox$
'-------- end of generic display dialog box & objects --------
'-------- custom display changes --------
IF focus = 1 THEN
idebox p.x + 4, p.y + 1, 50, 18
END IF
Hover = 0
FOR i = 1 TO 255
IF mX >= asciiTable(i).x AND mX <= asciiTable(i).x + 2 AND mY = asciiTable(i).y THEN
Hover = i
IF mouseMoved THEN Hover = i: COLOR 7, 0
IF mCLICK THEN
Selected = i
focus = 1
IF timeElapsedSince(lastClick!) <= .3 and lastClickOn = i THEN
'double click on chart
GOTO insertChar
@ -13940,7 +13946,6 @@ FUNCTION ideASCIIbox$
lastClick! = TIMER
lastClickOn = i
END IF
COLOR 7, 0
ELSE
COLOR 2, 7
END IF
@ -13949,20 +13954,34 @@ FUNCTION ideASCIIbox$
NEXT
COLOR 0, 7
IF Selected = 0 AND Hover > 0 THEN
_PRINTSTRING (p.x + 5, p.y + 19), "Hovered (click to select):" + STR$(Hover)
ELSEIF Selected > 0 THEN
_PRINTSTRING (p.x + 5, p.y + 19), "Selected (ESC to clear): " + STR$(Selected)
IF Selected > 0 THEN
_PRINTSTRING (p.x + 5, p.y + 19), "Selected:" + STR$(Selected)
END IF
COLOR 2, 7
IF Hover > 0 AND Hover <> Selected THEN
_PRINTSTRING (p.x + 5, p.y + 20), "Hovered: " + STR$(Hover)
END IF
'-------- end of custom display changes --------
'update visual page and cursor position
PCOPY 1, 0
IF cx THEN SCREEN , , 0, 0: LOCATE cy, cx, 1: SCREEN , , 1, 0
IF cx THEN
SCREEN , , 0, 0
IF focus = 1 THEN
IF Selected THEN
LOCATE asciiTable(Selected).y, asciiTable(Selected).x + 1, 1
END IF
ELSE
LOCATE cy, cx, 1
END IF
SCREEN , , 1, 0
END IF
'-------- read input --------
change = 0
mouseMoved = 0
DO
GetInput
IF mWHEEL THEN change = 1
@ -13970,7 +13989,7 @@ FUNCTION ideASCIIbox$
IF mCLICK THEN mousedown = 1: change = 1
IF mRELEASE THEN mouseup = 1: change = 1
IF mB THEN change = 1
IF mX <> prev.mX OR mY <> prev.mY THEN change = 1: prev.mX = mX: prev.mY = mY
IF mX <> prev.mX OR mY <> prev.mY THEN change = 1: prev.mX = mX: prev.mY = mY: mouseMoved = -1
alt = KALT: IF alt <> oldalt THEN change = 1
oldalt = alt
_LIMIT 100
@ -14005,91 +14024,91 @@ FUNCTION ideASCIIbox$
'-------- end of generic input response --------
IF mY > p.y AND mY < p.y + p.h AND mX > p.x AND mX < p.x + p.w THEN
IF Hover = 0 AND mCLICK THEN Selected = 0
IF Hover = 0 AND mCLICK THEN Selected = 0: focus = 1
END IF
IF K$ = CHR$(13) OR (Selected > 0 AND focus = 1 AND info <> 0) THEN
IF Selected = 0 AND Hover > 0 THEN
Selected = Hover
ELSEIF Selected THEN
insertChar:
ideASCIIbox$ = CHR$(Selected)
EXIT FUNCTION
END IF
IF (K$ = CHR$(13) AND focus = 1) THEN
ideASCIIbox$ = CHR$(Selected)
EXIT FUNCTION
END IF
IF (Selected > 0 AND focus = 2 AND info <> 0) THEN
IF focus = 2 AND (K$ = CHR$(13) OR info <> 0) THEN
insertChar:
ideASCIIbox$ = CHR$(Selected)
EXIT FUNCTION
END IF
IF (focus = 3 AND (info <> 0 OR K$ = CHR$(13))) THEN
ideASCIIbox$ = "CHR$(" + str2$(Selected) + ")"
EXIT FUNCTION
END IF
IF K$ = CHR$(27) THEN
IF Selected THEN Selected = 0 ELSE EXIT FUNCTION
END IF
'Cancel:
IF (info <> 0 OR K$ = CHR$(13)) AND focus = 4 THEN EXIT FUNCTION
IF (Selected = 0 AND focus = 1 AND info <> 0) OR _
(Selected > 0 AND focus = 3 AND info <> 0) THEN EXIT FUNCTION
IF K$ = CHR$(27) THEN EXIT FUNCTION
SELECT EVERYCASE KB
CASE 19712, 19200, 20480, 18432
IF Selected = 0 AND Hover > 0 THEN Selected = Hover
CASE 18176: Selected = 1
CASE 20224: Selected = 255
CASE 19712
IF KCTRL AND Selected > 0 THEN
DO UNTIL Selected MOD 16 = 0 OR Selected = 255
Selected = Selected + 1
LOOP
ELSE
Selected = Selected + 1
END IF
IF Selected > 255 THEN Selected = 1
CASE 19200
IF KCTRL AND Selected > 0 THEN
DO UNTIL Selected MOD 16 = 1
Selected = Selected - 1
LOOP
ELSE
Selected = Selected - 1
END IF
IF Selected < 1 THEN Selected = 255
CASE 20480
IF KCTRL AND Selected > 0 THEN
IF Selected = 240 THEN
Selected = 255
ELSE
DO UNTIL Selected >= 240
Selected = Selected + 16
IF focus = 1 THEN 'chart control (keyboard)
KCTRL = _KEYDOWN(100305) OR _KEYDOWN(100306)
SELECT CASE KB
CASE 18176: Selected = 1 'Home
CASE 20224: Selected = 255 'End
CASE 19712 'Right
IF KCTRL AND Selected > 0 THEN
DO UNTIL Selected MOD 16 = 0 OR Selected = 255
Selected = Selected + 1
LOOP
END IF
IF Selected > 255 THEN Selected = 255
ELSE
IF Selected = 240 THEN
'corner case
Selected = 255
ELSEIF Selected + 16 <= 255 THEN
Selected = Selected + 16
ELSE
Selected = Selected + 16 - 256
Selected = Selected + 1
END IF
END IF
CASE 18432
IF KCTRL AND Selected > 0 THEN
DO UNTIL Selected <= 16
Selected = Selected - 16
LOOP
IF Selected < 1 THEN Selected = 0
ELSE
IF Selected = 16 THEN
'corner case
Selected = 240
ELSEIF Selected - 16 >= 1 THEN
Selected = Selected - 16
IF Selected > 255 THEN Selected = 1
CASE 19200 'Left
IF KCTRL AND Selected > 0 THEN
DO UNTIL Selected MOD 16 = 1
Selected = Selected - 1
LOOP
ELSE
Selected = Selected - 16 + 256
Selected = Selected - 1
END IF
END IF
END SELECT
IF Selected < 1 THEN Selected = 255
CASE 20480 'Up
IF KCTRL AND Selected > 0 THEN
IF Selected = 240 THEN
Selected = 255
ELSE
DO UNTIL Selected >= 240
Selected = Selected + 16
LOOP
END IF
IF Selected > 255 THEN Selected = 255
ELSE
IF Selected = 240 THEN
'corner case
Selected = 255
ELSEIF Selected + 16 <= 255 THEN
Selected = Selected + 16
ELSE
Selected = Selected + 16 - 256
END IF
END IF
CASE 18432 'Down
IF KCTRL AND Selected > 0 THEN
DO UNTIL Selected <= 16
Selected = Selected - 16
LOOP
IF Selected < 1 THEN Selected = 0
ELSE
IF Selected = 16 THEN
'corner case
Selected = 240
ELSEIF Selected - 16 >= 1 THEN
Selected = Selected - 16
ELSE
Selected = Selected - 16 + 256
END IF
END IF
END SELECT
END IF
'end of custom controls
mousedown = 0