1
1
Fork 0
mirror of https://github.com/QB64Official/qb64.git synced 2024-06-29 04:40:38 +00:00

Add support to number formats in Watch Panel

Allows changing display format of numbers
between decimal, hex, octal and binary.
This commit is contained in:
Fellippe Heitor 2022-03-09 14:31:55 -03:00
parent 937df8823c
commit 627b85c4bd
2 changed files with 87 additions and 10 deletions

View file

@ -6485,9 +6485,8 @@ SUB DebugMode
TYPE vWatchPanelType
AS INTEGER x, y, w, h, firstVisible, hPos, vBarThumb, hBarThumb
AS INTEGER draggingVBar, draggingHBar, mX, mY
AS LONG contentWidth
AS _BYTE draggingPanel, resizingPanel, closingPanel
AS STRING visibleItems
AS LONG contentWidth, tempIndex
AS _BYTE draggingPanel, resizingPanel, closingPanel, clicked
END TYPE
STATIC vWatchPanel AS vWatchPanelType
@ -6833,6 +6832,7 @@ SUB DebugMode
(mX >= vWatchPanel.x AND mX <= vWatchPanel.x + vWatchPanel.w) AND _
(mY >= vWatchPanel.y AND mY <= vWatchPanel.y + vWatchPanel.h) THEN
vWatchPanel.draggingPanel = -1
vWatchPanel.clicked = 1
IF timeElapsedSince(lastPanelClick!) < .3 THEN
'Double-click on watch list
vWatchPanel.draggingPanel = 0
@ -6846,6 +6846,7 @@ SUB DebugMode
vWatchPanel.closingPanel = 0
vWatchPanel.draggingVBar = 0
vWatchPanel.draggingHBar = 0
vWatchPanel.clicked = 0
END IF
IF mX = idewx THEN
@ -6923,7 +6924,9 @@ SUB DebugMode
IF vWatchPanel.y < 3 THEN vWatchPanel.y = 3
IF vWatchPanel.y > vWatchPanelLimit - (vWatchPanel.h - 1) THEN vWatchPanel.y = vWatchPanelLimit - (vWatchPanel.h - 1)
IF mouseDownOnX <> mX THEN vWatchPanel.clicked = 0
mouseDownOnX = mX
IF mouseDownOnY <> mY THEN vWatchPanel.clicked = 0
mouseDownOnY = mY
GOSUB UpdateDisplay
ELSEIF vWatchPanel.resizingPanel THEN
@ -6959,6 +6962,11 @@ SUB DebugMode
END IF
END IF
ELSE 'mouse button released
IF vWatchPanel.clicked = 1 THEN
vWatchPanel.clicked = 2
'panel was clicked but not dragged, so register a click (= 2)
'which will be handled by showvWatchPanel()
END IF
IF vWatchPanel.draggingPanel THEN
vWatchPanel.draggingPanel = 0: mouseDown = 0
WriteSetting ".\internal\temp\debug.ini", "settings", "vWatchPanel.x", str2$(vWatchPanel.x)
@ -8053,12 +8061,12 @@ SUB showvWatchPanel (this AS vWatchPanelType, currentScope$, action as _BYTE)
shadowX = 0
shadowY = 0
shadowLength = 0
this.visibleItems = ""
this.contentWidth = 0
IF this.hPos = 0 THEN this.hPos = 1
temp$ = GetBytes$("", 0) 'reset buffer
temp$ = MID$(variableWatchList$, 9)
actualLongestVarName = 0
displayFormatButton = 0
DO
temp2$ = GetBytes$(temp$, 4)
IF temp2$ <> MKL$(-1) THEN EXIT DO 'no more variables in list
@ -8097,10 +8105,20 @@ SUB showvWatchPanel (this AS vWatchPanelType, currentScope$, action as _BYTE)
tempVarType$ = usedVariableList(tempIndex&).varType
END IF
thisIsAString = (INSTR(tempVarType$, "STRING *") > 0 OR tempVarType$ = "STRING")
tempValue$ = vWatchReceivedData$(tempStorage&)
tempValue$ = StrReplace$(vWatchReceivedData$(tempStorage&), CHR$(0), " ")
IF thisIsAString THEN
item$ = item$ + CHR$(34) + tempValue$ + CHR$(34)
IF displayFormatButton > 0 THEN displayFormatButton = 0
ELSE
IF displayFormatButton = 0 AND this.mY = this.y + y THEN displayFormatButton = LEN(item$) + 2
IF WatchListToConsole THEN displayFormatButton = 0
SELECT CASE usedVariableList(tempIndex&).displayFormat
'displayFormat: 0=DEC;1=HEX;2=BIN;3=OCT
CASE 1: tempValue$ = "&H" + HEX$(VAL(tempValue$))
CASE 2: tempValue$ = "&B" + _BIN$(VAL(tempValue$))
CASE 3: tempValue$ = "&O" + OCT$(VAL(tempValue$))
END SELECT
item$ = item$ + tempValue$
END IF
COLOR fg
@ -8112,6 +8130,25 @@ SUB showvWatchPanel (this AS vWatchPanelType, currentScope$, action as _BYTE)
IF WatchListToConsole = 0 THEN
_PRINTSTRING (this.x + 2, this.y + y), MID$(item$, this.hPos, this.w - 4)
'show/highlight .displayFormat button
IF displayFormatButton > 0 AND displayFormatButton >= this.hPos AND _
this.x + displayFormatButton - this.hPos < this.x + this.w - 4 AND _
this.x + displayFormatButton - this.hPos > this.x + 1 THEN
COLOR 15
IF this.mY = this.y + y AND this.mX = this.x + displayFormatButton - this.hPos THEN
COLOR , 3
IF this.clicked = 2 THEN
this.clicked = 0 'indicate we handled the click here
usedVariableList(tempIndex&).displayFormat = usedVariableList(tempIndex&).displayFormat + 1
IF usedVariableList(tempIndex&).displayFormat > 3 THEN usedVariableList(tempIndex&).displayFormat = 0
END IF
END IF
_PRINTSTRING (this.x + displayFormatButton - this.hPos, this.mY), CHR$(29)
COLOR fg, bg
displayFormatButton = -1 'mark done
END IF
'find existing watchpoint for this variable/index/element
temp2$ = MKL$(tempIndex&) + MKL$(tempTotalArrayIndexes& * 4) + tempArrayIndexes$ + MKL$(tempElementOffset&)
j = 0
@ -8181,6 +8218,7 @@ SUB showvWatchPanel (this AS vWatchPanelType, currentScope$, action as _BYTE)
this.hPos = 1
END IF
END IF
IF this.clicked = 2 THEN this.clicked = 0 'discard unhandled click
END SUB
FUNCTION multiSearch (__fullText$, __searchString$)
@ -8907,11 +8945,28 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
IF mCLICK AND focus = 2 THEN 'list click
IF timeElapsedSince(lastClick!) < .3 AND clickedItem = o(varListBox).sel THEN
IF doubleClickThreshold > 0 AND mX >= p.x + doubleClickThreshold AND IdeDebugMode > 0 THEN
y = ABS(o(varListBox).sel)
usedVariableList(varDlgList(y).index).displayFormat = usedVariableList(varDlgList(y).index).displayFormat - 1
IF usedVariableList(varDlgList(y).index).displayFormat < 0 THEN
usedVariableList(varDlgList(y).index).displayFormat = 3
END IF
focus = 5
GOTO sendValue
ELSE
GOTO toggleWatch
END IF
ELSEIF clickedItem = o(varListBox).sel THEN
IF doubleClickThreshold > 0 AND mX >= p.x + doubleClickThreshold AND IdeDebugMode > 0 THEN
y = ABS(o(varListBox).sel)
IF INSTR(usedVariableList(varDlgList(y).index).varType, "STRING *") = 0 AND usedVariableList(varDlgList(y).index).varType <> "STRING" THEN
usedVariableList(varDlgList(y).index).displayFormat = usedVariableList(varDlgList(y).index).displayFormat + 1
IF usedVariableList(varDlgList(y).index).displayFormat > 3 THEN
usedVariableList(varDlgList(y).index).displayFormat = 0
END IF
GOSUB buildList
idetxt(o(varListBox).txt) = l$
END IF
END IF
END IF
lastClick! = TIMER
IF o(varListBox).sel > 0 THEN clickedItem = o(varListBox).sel
@ -9338,8 +9393,18 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
DO WHILE LEN(temp$)
storageSlot& = CVL(LEFT$(temp$, 4))
temp$ = MID$(temp$, 5)
IF thisIsAString THEN l$ = l$ + CHR$(34)
l$ = l$ + StrReplace$(vWatchReceivedData$(storageSlot&), CHR$(0), " ")
tempValue$ = StrReplace$(vWatchReceivedData$(storageSlot&), CHR$(0), " ")
IF thisIsAString THEN
l$ = l$ + CHR$(34)
ELSE
SELECT CASE usedVariableList(x).displayFormat
'displayFormat: 0=DEC;1=HEX;2=BIN;3=OCT
CASE 1: tempValue$ = "&H" + HEX$(VAL(tempValue$))
CASE 2: tempValue$ = "&B" + _BIN$(VAL(tempValue$))
CASE 3: tempValue$ = "&O" + OCT$(VAL(tempValue$))
END SELECT
END IF
l$ = l$ + tempValue$
IF thisIsAString THEN l$ = l$ + CHR$(34)
IF LEN(temp$) THEN l$ = l$ + ","
LOOP
@ -9349,8 +9414,18 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar, returnAction)
IF LEN(usedVariableList(x).storage) = 4 THEN
storageSlot& = CVL(usedVariableList(x).storage)
l$ = l$ + " = " + CHR$(16) + CHR$(variableNameColor)
IF thisIsAString THEN l$ = l$ + CHR$(34)
l$ = l$ + StrReplace$(vWatchReceivedData$(storageSlot&), CHR$(0), " ")
tempValue$ = StrReplace$(vWatchReceivedData$(storageSlot&), CHR$(0), " ")
IF thisIsAString THEN
l$ = l$ + CHR$(34)
ELSE
SELECT CASE usedVariableList(x).displayFormat
'displayFormat: 0=DEC;1=HEX;2=BIN;3=OCT
CASE 1: tempValue$ = "&H" + HEX$(VAL(tempValue$))
CASE 2: tempValue$ = "&B" + _BIN$(VAL(tempValue$))
CASE 3: tempValue$ = "&O" + OCT$(VAL(tempValue$))
END SELECT
END IF
l$ = l$ + tempValue$
IF thisIsAString THEN l$ = l$ + CHR$(34)
END IF
ELSE

View file

@ -114,7 +114,7 @@ DIM SHARED MonochromeLoggingMode AS _BYTE
TYPE usedVarList
AS LONG id, linenumber, includeLevel, includedLine, scope, localIndex
AS LONG arrayElementSize
AS _BYTE used, watch, isarray
AS _BYTE used, watch, isarray, displayFormat 'displayFormat: 0=DEC;1=HEX;2=BIN;3=OCT
AS STRING name, cname, varType, includedFile, subfunc
AS STRING watchRange, indexes, elements, elementTypes 'for Arrays and UDTs
AS STRING elementOffset, storage
@ -26106,6 +26106,7 @@ SUB manageVariableList (__name$, __cname$, localIndex AS LONG, action AS _BYTE)
usedVariableList(i).id = currentid
usedVariableList(i).used = 0
usedVariableList(i).watch = 0
usedVariableList(i).displayFormat = 0
usedVariableList(i).storage = ""
usedVariableList(i).linenumber = linenumber
usedVariableList(i).includeLevel = inclevel
@ -26165,6 +26166,7 @@ SUB manageVariableList (__name$, __cname$, localIndex AS LONG, action AS _BYTE)
usedVariableList(i).watch = backupUsedVariableList(j).watch
usedVariableList(i).watchRange = backupUsedVariableList(j).watchRange
usedVariableList(i).indexes = backupUsedVariableList(j).indexes
usedVariableList(i).displayFormat = backupUsedVariableList(j).displayFormat
usedVariableList(i).elements = backupUsedVariableList(j).elements
usedVariableList(i).elementTypes = backupUsedVariableList(j).elementTypes
usedVariableList(i).elementOffset = backupUsedVariableList(j).elementOffset