1
1
Fork 0
mirror of https://github.com/QB64Official/qb64.git synced 2024-07-07 18:00:24 +00:00

Adds interface to select which array indexes to watch.

This commit is contained in:
FellippeHeitor 2021-08-05 01:27:57 -03:00
parent 85c1e79997
commit 4df2ada743
2 changed files with 223 additions and 34 deletions

View file

@ -739,18 +739,23 @@ FUNCTION ide2 (ignore)
usedVariableList(x).mostRecentValue = "" usedVariableList(x).mostRecentValue = ""
NEXT NEXT
variableWatchList$ = "" 'variableWatchList$ = ""
longestVarName = 0 'longestVarName = 0
FOR y = 1 TO totalVariablesCreated 'FOR y = 1 TO totalVariablesCreated
IF usedVariableList(y).watch THEN ' IF usedVariableList(y).watch THEN
IF LEN(usedVariableList(y).name) > longestVarName THEN ' thisLen = LEN(usedVariableList(y).name)
longestVarName = LEN(usedVariableList(y).name) ' IF usedVariableList(y).isarray THEN
IF variableWatchList$ = "" THEN variableWatchList$ = SPACE$(4) ' thisLen = thisLen + LEN(STR$(CVL(RIGHT$(usedVariableList(y).indexes, 4)))) - 1
MID$(variableWatchList$, 1, 4) = MKL$(longestVarName) ' END IF
END IF
variableWatchList$ = variableWatchList$ + MKL$(y) ' IF thisLen > longestVarName THEN
END IF ' longestVarName = thisLen
NEXT ' IF variableWatchList$ = "" THEN variableWatchList$ = SPACE$(4)
' MID$(variableWatchList$, 1, 4) = MKL$(longestVarName)
' END IF
' variableWatchList$ = variableWatchList$ + MKL$(y)
' END IF
'NEXT
EnterDebugMode: EnterDebugMode:
IF idehelp THEN IF idehelp THEN
@ -6582,8 +6587,8 @@ SUB DebugMode
(mY >= vWatchPanel.y AND mY <= vWatchPanel.y + vWatchPanel.h) THEN (mY >= vWatchPanel.y AND mY <= vWatchPanel.y + vWatchPanel.h) THEN
vWatchPanel.firstVisible = vWatchPanel.firstVisible + _MOUSEWHEEL * 3 vWatchPanel.firstVisible = vWatchPanel.firstVisible + _MOUSEWHEEL * 3
IF vWatchPanel.firstVisible < 1 THEN vWatchPanel.firstVisible = 1 IF vWatchPanel.firstVisible < 1 THEN vWatchPanel.firstVisible = 1
IF vWatchPanel.firstVisible > ((LEN(variableWatchList$) - 4) \ 4) THEN IF vWatchPanel.firstVisible > totalVisibleVariables - (vWatchPanel.h - 2) + 1 THEN
vWatchPanel.firstVisible = ((LEN(variableWatchList$) - 4) \ 4) vWatchPanel.firstVisible = totalVisibleVariables - (vWatchPanel.h - 2) + 1
END IF END IF
ELSE ELSE
idecy = idecy + _MOUSEWHEEL * 3 idecy = idecy + _MOUSEWHEEL * 3
@ -7602,24 +7607,37 @@ SUB showvWatchPanel (this AS vWatchPanelType, currentScope$)
IF LEN(variableWatchList$) THEN IF LEN(variableWatchList$) THEN
longestVarName = CVL(LEFT$(variableWatchList$, 4)) longestVarName = CVL(LEFT$(variableWatchList$, 4))
temp$ = MID$(variableWatchList$, 5) temp$ = MID$(variableWatchList$, 5)
previousTempIndex& = 0
DO WHILE LEN(temp$) DO WHILE LEN(temp$)
tempIndex& = CVL(LEFT$(temp$, 4)) tempIndex& = CVL(LEFT$(temp$, 4))
temp$ = MID$(temp$, 5) temp$ = MID$(temp$, 5)
i = i + 1 i = i + 1
item$ = usedVariableList(tempIndex&).name + SPACE$(longestVarName - LEN(usedVariableList(tempIndex&).name)) + " = "
IF usedVariableList(tempIndex&).watch THEN
IF usedVariableList(tempIndex&).subfunc = currentScope$ OR usedVariableList(tempIndex&).subfunc = "" THEN
item$ = item$ + usedVariableList(tempIndex&).mostRecentValue
COLOR fg
ELSE
item$ = item$ + "<out of scope>"
COLOR 2
END IF
END IF
IF LEN(item$) > this.contentWidth THEN this.contentWidth = LEN(item$)
IF this.firstVisible > i THEN _CONTINUE IF this.firstVisible > i THEN _CONTINUE
y = y + 1 y = y + 1
IF y > this.h - 2 THEN _CONTINUE IF y > this.h - 2 THEN EXIT DO
IF usedVariableList(tempIndex&).isarray THEN
IF tempIndex& <> previousTempIndex& THEN
previousTempIndex& = tempIndex&
thisArrayElement = 0
tempElements$ = usedVariableList(tempIndex&).indexes
END IF
thisArrayElement = thisArrayElement + 1
END IF
thisName$ = usedVariableList(tempIndex&).name
IF usedVariableList(tempIndex&).isarray THEN
thisName$ = LEFT$(thisName$, LEN(thisName$) - 1) + _
LTRIM$(STR$(CVL(MID$(tempElements$, thisArrayElement * 4 - 3, 4)))) + ")"
END IF
item$ = thisName$ + SPACE$(longestVarName - LEN(thisName$)) + " = "
IF usedVariableList(tempIndex&).subfunc = currentScope$ OR usedVariableList(tempIndex&).subfunc = "" THEN
item$ = item$ + usedVariableList(tempIndex&).mostRecentValue
COLOR fg
ELSE
item$ = item$ + "<out of scope>"
COLOR 2
END IF
IF LEN(item$) > this.contentWidth THEN this.contentWidth = LEN(item$)
_PRINTSTRING (this.x + 2, this.y + y), MID$(item$, this.hPos, this.w - 4) _PRINTSTRING (this.x + 2, this.y + y), MID$(item$, this.hPos, this.w - 4)
LOOP LOOP
END IF END IF
@ -7669,12 +7687,13 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar)
selectedBG = 2 selectedBG = 2
TYPE varDlgList TYPE varDlgList
AS LONG index, bgColorFlag, colorFlag, colorFlag2, indicator AS LONG index, bgColorFlag, colorFlag, colorFlag2, indicator, arrayElement
END TYPE END TYPE
DIM varDlgList(1 TO totalVariablesCreated) AS varDlgList REDIM varDlgList(1 TO totalVariablesCreated) AS varDlgList
'calculate longest module name, longest var name, longest type name 'calculate longest module name, longest var name, longest type name
totalArrayElements = 0
FOR x = 1 TO totalVariablesCreated FOR x = 1 TO totalVariablesCreated
IF LEN(usedVariableList(x).subfunc) > maxModuleNameLen THEN IF LEN(usedVariableList(x).subfunc) > maxModuleNameLen THEN
maxModuleNameLen = LEN(usedVariableList(x).subfunc) maxModuleNameLen = LEN(usedVariableList(x).subfunc)
@ -7682,13 +7701,16 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar)
IF LEN(usedVariableList(x).name) > maxVarLen THEN maxVarLen = LEN(usedVariableList(x).name) IF LEN(usedVariableList(x).name) > maxVarLen THEN maxVarLen = LEN(usedVariableList(x).name)
IF LEN(usedVariableList(x).varType) > maxTypeLen THEN maxTypeLen = LEN(usedVariableList(x).varType) IF LEN(usedVariableList(x).varType) > maxTypeLen THEN maxTypeLen = LEN(usedVariableList(x).varType)
IF LEN(usedVariableList(x).indexes) > 0 AND usedVariableList(x).watch <> 0 THEN
totalArrayElements = totalArrayElements + ((LEN(usedVariableList(x).indexes) \ 4) - 1)
END IF
NEXT NEXT
searchTerm$ = filter$ searchTerm$ = filter$
GOSUB buildList GOSUB buildList
i = 0 i = 0
dialogHeight = (totalVariablesCreated) + 7 dialogHeight = (totalVariablesCreated + totalArrayElements) + 7
IF dialogHeight > idewy + idesubwindow - 6 THEN IF dialogHeight > idewy + idesubwindow - 6 THEN
dialogHeight = idewy + idesubwindow - 6 dialogHeight = idewy + idesubwindow - 6
END IF END IF
@ -7822,6 +7844,7 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar)
IF (focus = 3 AND info <> 0) THEN 'add all IF (focus = 3 AND info <> 0) THEN 'add all
FOR y = 1 TO totalVisibleVariables FOR y = 1 TO totalVisibleVariables
IF usedVariableList(varDlgList(y).index).isarray THEN _CONTINUE
usedVariableList(varDlgList(y).index).watch = -1 usedVariableList(varDlgList(y).index).watch = -1
ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag) = variableNameColor ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag) = variableNameColor
ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag2) = typeColumnColor ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag2) = typeColumnColor
@ -7840,6 +7863,11 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar)
ASC(idetxt(o(varListBox).txt), varDlgList(y).bgColorFlag) = 17 ASC(idetxt(o(varListBox).txt), varDlgList(y).bgColorFlag) = 17
ASC(idetxt(o(varListBox).txt), varDlgList(y).indicator) = 32 'space ASC(idetxt(o(varListBox).txt), varDlgList(y).indicator) = 32 'space
NEXT NEXT
IF usedVariableList(varDlgList(y).index).isarray THEN
itemToSelect = varDlgList(y).index
GOSUB buildList
idetxt(o(varListBox).txt) = l$
END IF
focus = filterBox focus = filterBox
_CONTINUE _CONTINUE
END IF END IF
@ -7855,7 +7883,7 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar)
IF INSTR(usedVariableList(varDlgList(i).index).varType, "STRING") THEN IF INSTR(usedVariableList(varDlgList(i).index).varType, "STRING") THEN
thisWidth = idewx - 20 thisWidth = idewx - 20
ELSE ELSE
thisWidth = 40 thisWidth = 45
END IF END IF
v$ = ideinputbox$("Change Value", "#New value", a2$, "", thisWidth, 0, ok) v$ = ideinputbox$("Change Value", "#New value", a2$, "", thisWidth, 0, ok)
IF ok THEN IF ok THEN
@ -7881,8 +7909,13 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar)
longestVarName = 0 longestVarName = 0
FOR y = 1 TO totalVisibleVariables FOR y = 1 TO totalVisibleVariables
IF usedVariableList(varDlgList(y).index).watch THEN IF usedVariableList(varDlgList(y).index).watch THEN
IF LEN(usedVariableList(varDlgList(y).index).name) > longestVarName THEN thisLen = LEN(usedVariableList(varDlgList(y).index).name)
longestVarName = LEN(usedVariableList(varDlgList(y).index).name) IF usedVariableList(varDlgList(y).index).isarray THEN
thisLen = thisLen + LEN(STR$(CVL(RIGHT$(usedVariableList(varDlgList(y).index).indexes, 4)))) - 1
END IF
IF thisLen > longestVarName THEN
longestVarName = thisLen
IF variableWatchList$ = "" THEN variableWatchList$ = SPACE$(4) IF variableWatchList$ = "" THEN variableWatchList$ = SPACE$(4)
MID$(variableWatchList$, 1, 4) = MKL$(longestVarName) MID$(variableWatchList$, 1, 4) = MKL$(longestVarName)
END IF END IF
@ -7912,16 +7945,39 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar)
IF y >= 1 AND y <= totalVisibleVariables THEN IF y >= 1 AND y <= totalVisibleVariables THEN
usedVariableList(varDlgList(y).index).watch = NOT usedVariableList(varDlgList(y).index).watch usedVariableList(varDlgList(y).index).watch = NOT usedVariableList(varDlgList(y).index).watch
IF usedVariableList(varDlgList(y).index).watch THEN IF usedVariableList(varDlgList(y).index).watch THEN
IF usedVariableList(varDlgList(y).index).isarray THEN
temp$ = ""
IF LEN(usedVariableList(varDlgList(y).index).indexes) THEN
temp$ = formatRange$(usedVariableList(varDlgList(y).index).indexes)
END IF
v$ = ideinputbox$("Watch Array", "#Indexes to watch", temp$, "01234567890,-", 45, 0, ok)
IF ok THEN
temp$ = parseRange$(v$)
usedVariableList(varDlgList(y).index).indexes = temp$
GOSUB buildList
idetxt(o(varListBox).txt) = l$
ELSE
usedVariableList(varDlgList(y).index).watch = 0
_CONTINUE
END IF
END IF
ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag) = variableNameColor ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag) = variableNameColor
ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag2) = typeColumnColor ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag2) = typeColumnColor
ASC(idetxt(o(varListBox).txt), varDlgList(y).bgColorFlag) = selectedBG ASC(idetxt(o(varListBox).txt), varDlgList(y).bgColorFlag) = selectedBG
ASC(idetxt(o(varListBox).txt), varDlgList(y).indicator) = 43 '+ ASC(idetxt(o(varListBox).txt), varDlgList(y).indicator) = 43 '+
ELSE ELSE
rebuild = 0
IF usedVariableList(varDlgList(y).index).isarray THEN rebuild = -1
ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag) = 16 ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag) = 16
ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag2) = 2 ASC(idetxt(o(varListBox).txt), varDlgList(y).colorFlag2) = 2
ASC(idetxt(o(varListBox).txt), varDlgList(y).bgColorFlag) = 17 ASC(idetxt(o(varListBox).txt), varDlgList(y).bgColorFlag) = 17
ASC(idetxt(o(varListBox).txt), varDlgList(y).indicator) = 32 'space ASC(idetxt(o(varListBox).txt), varDlgList(y).indicator) = 32 'space
END IF END IF
IF rebuild then
GOSUB buildList
idetxt(o(varListBox).txt) = l$
END IF
END IF END IF
'focus = filterBox 'focus = filterBox
_CONTINUE _CONTINUE
@ -8027,7 +8083,19 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar)
_CONTINUE 'skip variable if no field matches the search _CONTINUE 'skip variable if no field matches the search
END IF END IF
END IF END IF
IF usedVariableList(x).isarray AND usedVariableList(x).watch THEN
totalArrayElements = LEN(usedVariableList(x).indexes) \ 4
thisArrayElement = 0
temp$ = usedVariableList(x).indexes
nextArrayElement:
thisArrayElement = thisArrayElement + 1
END IF
totalVisibleVariables = totalVisibleVariables + 1 totalVisibleVariables = totalVisibleVariables + 1
IF totalVisibleVariables > UBOUND(varDlgList) THEN
REDIM _PRESERVE varDlgList(1 TO totalVariablesCreated + 100) AS varDlgList
END IF
l$ = l$ + CHR$(17) l$ = l$ + CHR$(17)
varDlgList(totalVisibleVariables).bgColorFlag = LEN(l$) + 1 varDlgList(totalVisibleVariables).bgColorFlag = LEN(l$) + 1
@ -8039,6 +8107,7 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar)
l$ = l$ + CHR$(16) l$ = l$ + CHR$(16)
varDlgList(totalVisibleVariables).index = x varDlgList(totalVisibleVariables).index = x
IF itemToSelect > 0 AND x = itemToSelect THEN itemToSelect = 0: o(varListBox).sel = totalVisibleVariables
varDlgList(totalVisibleVariables).colorFlag = LEN(l$) + 1 varDlgList(totalVisibleVariables).colorFlag = LEN(l$) + 1
varDlgList(totalVisibleVariables).indicator = LEN(l$) + 2 varDlgList(totalVisibleVariables).indicator = LEN(l$) + 2
IF usedVariableList(x).watch THEN IF usedVariableList(x).watch THEN
@ -8047,7 +8116,12 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar)
l$ = l$ + CHR$(16) + " " l$ = l$ + CHR$(16) + " "
END IF END IF
text$ = usedVariableList(x).name + CHR$(16) IF usedVariableList(x).isarray AND usedVariableList(x).watch THEN
text$ = LEFT$(usedVariableList(x).name, LEN(usedVariableList(x).name) - 1)
text$ = text$ + LTRIM$(STR$(CVL(MID$(temp$, thisArrayElement * 4 - 3, 4)))) + ")" + CHR$(16)
ELSE
text$ = usedVariableList(x).name + CHR$(16)
END IF
varDlgList(totalVisibleVariables).colorFlag2 = LEN(l$) + LEN(text$) + 1 varDlgList(totalVisibleVariables).colorFlag2 = LEN(l$) + LEN(text$) + 1
IF usedVariableList(x).watch THEN IF usedVariableList(x).watch THEN
text$ = text$ + CHR$(typeColumnColor) + " " text$ = text$ + CHR$(typeColumnColor) + " "
@ -8077,7 +8151,117 @@ FUNCTION idevariablewatchbox$(currentScope$, filter$, selectVar)
END IF END IF
END IF END IF
IF x < totalVariablesCreated THEN l$ = l$ + sep IF x < totalVariablesCreated THEN l$ = l$ + sep
IF usedVariableList(x).isarray AND usedVariableList(x).watch AND thisArrayElement < totalArrayElements THEN
GOTO nextArrayElement
END IF
NEXT NEXT
itemToSelect = 0
RETURN
END FUNCTION
FUNCTION formatRange$(__text$)
'__text$ is a series of MKL$(values) concatenated
temp$ = __text$
v1 = -1
v2 = -1
FOR i = 1 TO LEN(temp$) \ 4
v = CVL(MID$(temp$, i * 4 - 3, 4))
IF v1 = -1 THEN
v1 = v
ELSE
IF v = v1 + 1 OR v = v2 + 1 THEN
v2 = v
ELSE
IF v2 = -1 THEN
a2$ = a2$ + LTRIM$(STR$(v1)) + ","
v1 = v
ELSE
a2$ = a2$ + LTRIM$(STR$(v1)) + "-" + LTRIM$(STR$(v2)) + ","
v1 = v
v2 = -1
END IF
END IF
END IF
NEXT
IF v1 <> -1 AND v2 = -1 THEN a2$ = a2$ + LTRIM$(STR$(v1))
IF v1 <> -1 AND v2 <> -1 THEN a2$ = a2$ + LTRIM$(STR$(v1)) + "-" + LTRIM$(STR$(v2))
formatRange$ = a2$
END FUNCTION
FUNCTION parseRange$(__text$)
'__text$ must contain a valid numeric string (####),
'a valid interval (####-####) or comma-separated values.
'Only positive values >= 0 considered.
'Returns MKL$(value1) + MKL$(value2)... in order
IF LEN(_TRIM$(__text$)) = 0 THEN EXIT FUNCTION
DIM zeroIncluded AS _BYTE
Filter$ = _TRIM$(__text$)
j = INSTR(Filter$, "-") + INSTR(Filter$, ",")
temp$ = SPACE$(1000)
IF j = 0 THEN 'Single number passed
parseRange$ = MKL$(VAL(Filter$))
EXIT FUNCTION
END IF
Reading = 1
FOR j = 1 TO LEN(Filter$)
v = ASC(Filter$, j)
SELECT CASE v
CASE 44 'comma
Reading = 1
GOSUB parseIt
CASE 45 'hyphen
IF PrevChar <> 45 THEN
Reading = Reading + 1
IF Reading = 2 THEN
IF j = LEN(Filter$) THEN GOSUB parseIt
END IF
END IF
CASE 48 TO 57 '0 to 9
IF Reading = 1 THEN
v1$ = v1$ + CHR$(v)
ELSEIF Reading = 2 THEN
v2$ = v2$ + CHR$(v)
END IF
IF j = LEN(Filter$) THEN GOSUB parseIt
END SELECT
PrevChar = v
NEXT j
returnValue$ = ""
IF zeroIncluded THEN returnValue$ = MKL$(0)
FOR i = 1 TO LEN(temp$)
IF ASC(temp$, i) = 1 THEN returnValue$ = returnValue$ + MKL$(i)
NEXT
parseRange$ = returnValue$
EXIT FUNCTION
parseIt:
v1 = VAL(v1$)
v2 = VAL(v2$)
IF LEN(v2$) > 0 THEN
IF LEN(v1$) > 0 THEN
IF v1 > v2 THEN SWAP v1, v2
IF v2 > LEN(temp$) THEN temp$ = temp$ + SPACE$(v2 - LEN(temp$))
IF v1 = 0 THEN zeroIncluded = -1: v1 = 1
FOR i = v1 TO v2
ASC(temp$, i) = 1
NEXT
END IF
ELSE
IF v1 > LEN(temp$) THEN temp$ = temp$ + SPACE$(v1 - LEN(temp$))
IF v1 = 0 THEN
zeroIncluded = -1
ELSE
ASC(temp$, v1) = 1
END IF
END IF
v1$ = ""
v2$ = ""
RETURN RETURN
END FUNCTION END FUNCTION

View file

@ -110,8 +110,9 @@ DIM SHARED MonochromeLoggingMode AS _BYTE
TYPE usedVarList TYPE usedVarList
AS LONG linenumber, includeLevel, includedLine, scope, localIndex, strLength AS LONG linenumber, includeLevel, includedLine, scope, localIndex, strLength
AS _BYTE used, watch AS _BYTE used, watch, isarray
AS STRING name, cname, varType, includedFile, subfunc, mostRecentValue AS STRING name, cname, varType, includedFile, subfunc, mostRecentValue
AS STRING indexes, elements 'for Arrays and UDTs
AS _OFFSET baseAddress, address AS _OFFSET baseAddress, address
END TYPE END TYPE
@ -25959,6 +25960,10 @@ SUB manageVariableList (__name$, __cname$, localIndex AS LONG, action AS _BYTE)
ELSE ELSE
usedVariableList(i).name = name$ usedVariableList(i).name = name$
END IF END IF
IF (id.arrayelements > 0) THEN
usedVariableList(i).isarray = -1
usedVariableList(i).name = usedVariableList(i).name + "()"
END IF
totalVariablesCreated = totalVariablesCreated + 1 totalVariablesCreated = totalVariablesCreated + 1
END IF END IF
CASE ELSE 'find and mark as used CASE ELSE 'find and mark as used