fix visual bug resulting from 'TextBuilder.buildTextStringSearch' function. When we have a search string 'abc' and a file 'abcabc', there are two matches and it should also look like there are two matches, but it did not look like there were two matches prior to this commit. This commit fixes that by advancing the search position before adding to the text accumulator.

This commit is contained in:
2025-08-31 00:05:48 +01:00
parent 659a1d2585
commit 83e062eb60
3 changed files with 274 additions and 787 deletions

View File

@@ -324,6 +324,16 @@ struct
in absIdx >= searchIdx + searchLen
end
fun advanceSearchPos (absIdx, searchPos, searchHd, searchLen) =
let
val searchIdx = Vector.sub (searchHd, searchPos)
in
if absIdx >= searchIdx andalso absIdx < searchIdx + searchLen then
searchPos
else
searchPos + 1
end
fun buildTextStringSearch
( pos
, str
@@ -357,158 +367,43 @@ struct
, bgAcc
, env
)
else if pos < String.size str then
case String.sub (str, pos) of
#" " =>
(* if inside cursor, then create cursorAcc;
* else, just skip as usual *)
if absIdx <> cursorPos then
(* not in cursur *)
if isInSearchRange (absIdx, searchPos, searchHd, searchLen) then
(* draw *)
let
(* todo: temp colours *)
val r: Real32.real = 0.3
val g: Real32.real = 0.1
val b: Real32.real = 0.1
val {fw, fh, ...} = env
else
let
val searchPos =
advanceSearchPos (absIdx, searchPos, searchHd, searchLen)
in
if searchPos = Vector.length searchHd then
(* exhausted search list so call normal build function *)
buildTextString
( pos
, str
, acc
, posX
, posY
, startX
, tl
, absIdx
, cursorPos
, cursorAcc
, bgAcc
, env
)
val space = makeRect (posX, posY, fw, fh, r, g, b)
val bgAcc = space :: bgAcc
in
buildTextStringSearch
( pos + 1
, str
, acc
, posX + xSpace
, posY
, startX
, tl
, absIdx + 1
, cursorPos
, cursorAcc
, bgAcc
, env
, searchHd
, searchPos
, searchLen
)
end
else
buildTextStringSearch
( pos + 1
, str
, acc
, posX + xSpace
, posY
, startX
, tl
, absIdx + 1
, cursorPos
, cursorAcc
, bgAcc
, env
, searchHd
, searchPos
, searchLen
)
else
(* in cursor *)
let
val {fw, fh, r, g, b, ...} = env
val cursorAcc = makeRect (posX, posY, fw, fh, r, g, b)
in
buildTextStringSearch
( pos + 1
, str
, acc
, posX + xSpace
, posY
, startX
, tl
, absIdx + 1
, cursorPos
, cursorAcc
, bgAcc
, env
, searchHd
, searchPos
, searchLen
)
end
| #"\n" =>
if posY + ySpace < #h env then
if absIdx <> cursorPos then
(* not in cursor position, so iterate like normal *)
buildTextStringSearch
( pos + 1
, str
, acc
, startX
, posY + ySpace
, startX
, tl
, absIdx + 1
, cursorPos
, cursorAcc
, bgAcc
, env
, searchHd
, searchPos
, searchLen
)
else
(* in cursor position, so build cursorAcc *)
let
val {fw, fh, r, g, b, ...} = env
val cursorAcc = makeRect (posX, posY, fw, fh, r, g, b)
in
buildTextStringSearch
( pos + 1
, str
, acc
, startX
, posY + ySpace
, startX
, tl
, absIdx + 1
, cursorPos
, cursorAcc
, bgAcc
, env
, searchHd
, searchPos
, searchLen
)
end
else
accToDrawMsg (acc, cursorAcc, bgAcc, env)
| chr =>
let
val chrFun = Vector.sub (CozetteAscii.asciiTable, Char.ord chr)
in
if absIdx <> cursorPos then
(* not equal to cursor *)
if posX + xSpace < #w env then
else if pos < String.size str then
case String.sub (str, pos) of
#" " =>
(* if inside cursor, then create cursorAcc;
* else, just skip as usual *)
if absIdx <> cursorPos then
(* not in cursur *)
if isInSearchRange (absIdx, searchPos, searchHd, searchLen) then
(* draw *)
let
val {fw, fh, ...} = env
(* todo: temp colours *)
val r: Real32.real = 0.7
val g: Real32.real = 0.7
val b: Real32.real = 0.7
(* build char vec *)
val chrVec = makeChr (chr, posX, posY, fw, fh, r, g, b)
val acc = chrVec :: acc
(* build cursor (behind text) vec *)
val r: Real32.real = 0.3
val g: Real32.real = 0.1
val b: Real32.real = 0.1
val {fw, fh, ...} = env
val space = makeRect (posX, posY, fw, fh, r, g, b)
val bgAcc = space :: bgAcc
@@ -532,50 +427,36 @@ struct
)
end
else
let
val {fw, fh, r, g, b, ...} = env
val chrVec = makeChr (chr, posX, posY, fw, fh, r, g, b)
val acc = chrVec :: acc
val searchPos =
if
isAfterSearchRange
(absIdx, searchPos, searchHd, searchLen)
then searchPos + 1
else searchPos
in
buildTextStringSearch
( pos + 1
, str
, acc
, posX + xSpace
, posY
, startX
, tl
, absIdx + 1
, cursorPos
, cursorAcc
, bgAcc
, env
, searchHd
, searchPos
, searchLen
)
end
else if posY + ySpace < #h env then
buildTextStringSearch
( pos + 1
, str
, acc
, posX + xSpace
, posY
, startX
, tl
, absIdx + 1
, cursorPos
, cursorAcc
, bgAcc
, env
, searchHd
, searchPos
, searchLen
)
else
(* in cursor *)
let
val {fw, fh, r, g, b, ...} = env
val chrVec = makeChr
(chr, startX, posY + ySpace, fw, fh, r, g, b)
val acc = chrVec :: acc
val cursorAcc = makeRect (posX, posY, fw, fh, r, g, b)
in
buildTextStringSearch
( pos + 1
, str
, acc
, startX + xSpace
, posY + ySpace
, posX + xSpace
, posY
, startX
, tl
, absIdx + 1
@@ -588,52 +469,39 @@ struct
, searchLen
)
end
else
accToDrawMsg (acc, cursorAcc, bgAcc, env)
else
(* equal to cursor *)
let
val {fw, fh, r, g, b, hr, hg, hb, ...} = env
val cursorAcc = makeRect (posX, posY, fw, fh, r, g, b)
in
if posX + xSpace < #w env then
| #"\n" =>
if posY + ySpace < #h env then
if absIdx <> cursorPos then
(* not in cursor position, so iterate like normal *)
buildTextStringSearch
( pos + 1
, str
, acc
, startX
, posY + ySpace
, startX
, tl
, absIdx + 1
, cursorPos
, cursorAcc
, bgAcc
, env
, searchHd
, searchPos
, searchLen
)
else
(* in cursor position, so build cursorAcc *)
let
val chrVec = makeChr (chr, posX, posY, fw, fh, hr, hg, hb)
val acc = chrVec :: acc
val {fw, fh, r, g, b, ...} = env
val cursorAcc = makeRect (posX, posY, fw, fh, r, g, b)
in
(* can start building after cursor now,
* since cursor was built *)
buildTextStringSearch
( pos + 1
, str
, acc
, posX + xSpace
, posY
, startX
, tl
, absIdx + 1
, cursorPos
, cursorAcc
, bgAcc
, env
, searchHd
, searchPos
, searchLen
)
end
else if posY + ySpace < #h env then
let
val chrVec = makeChr
(chr, startX, posY + ySpace, fw, fh, hr, hg, hb)
val acc = chrVec :: acc
in
(* can start building after cursor now,
* since cursor was built *)
buildTextStringSearch
( pos + 1
, str
, acc
, startX + xSpace
, posY + ySpace
, startX
, tl
@@ -647,32 +515,192 @@ struct
, searchLen
)
end
else
accToDrawMsg (acc, cursorAcc, bgAcc, env)
| chr =>
let
val chrFun = Vector.sub (CozetteAscii.asciiTable, Char.ord chr)
in
if absIdx <> cursorPos then
(* not equal to cursor *)
if posX + xSpace < #w env then
if isInSearchRange (absIdx, searchPos, searchHd, searchLen) then
let
val {fw, fh, ...} = env
(* todo: temp colours *)
val r: Real32.real = 0.7
val g: Real32.real = 0.7
val b: Real32.real = 0.7
(* build char vec *)
val chrVec = makeChr (chr, posX, posY, fw, fh, r, g, b)
val acc = chrVec :: acc
(* build cursor (behind text) vec *)
val r: Real32.real = 0.3
val g: Real32.real = 0.1
val b: Real32.real = 0.1
val space = makeRect (posX, posY, fw, fh, r, g, b)
val bgAcc = space :: bgAcc
in
buildTextStringSearch
( pos + 1
, str
, acc
, posX + xSpace
, posY
, startX
, tl
, absIdx + 1
, cursorPos
, cursorAcc
, bgAcc
, env
, searchHd
, searchPos
, searchLen
)
end
else
let
val {fw, fh, r, g, b, ...} = env
val chrVec = makeChr (chr, posX, posY, fw, fh, r, g, b)
val acc = chrVec :: acc
in
buildTextStringSearch
( pos + 1
, str
, acc
, posX + xSpace
, posY
, startX
, tl
, absIdx + 1
, cursorPos
, cursorAcc
, bgAcc
, env
, searchHd
, searchPos
, searchLen
)
end
else if posY + ySpace < #h env then
let
val {fw, fh, r, g, b, ...} = env
val chrVec = makeChr
(chr, startX, posY + ySpace, fw, fh, r, g, b)
val acc = chrVec :: acc
in
buildTextStringSearch
( pos + 1
, str
, acc
, startX + xSpace
, posY + ySpace
, startX
, tl
, absIdx + 1
, cursorPos
, cursorAcc
, bgAcc
, env
, searchHd
, searchPos
, searchLen
)
end
else
accToDrawMsg (acc, cursorAcc, bgAcc, env)
else
accToDrawMsg (acc, cursorAcc, bgAcc, env)
(* equal to cursor *)
let
val {fw, fh, r, g, b, hr, hg, hb, ...} = env
val cursorAcc = makeRect (posX, posY, fw, fh, r, g, b)
in
if posX + xSpace < #w env then
let
val chrVec = makeChr
(chr, posX, posY, fw, fh, hr, hg, hb)
val acc = chrVec :: acc
in
(* can start building after cursor now,
* since cursor was built *)
buildTextStringSearch
( pos + 1
, str
, acc
, posX + xSpace
, posY
, startX
, tl
, absIdx + 1
, cursorPos
, cursorAcc
, bgAcc
, env
, searchHd
, searchPos
, searchLen
)
end
else if posY + ySpace < #h env then
let
val chrVec = makeChr
(chr, startX, posY + ySpace, fw, fh, hr, hg, hb)
val acc = chrVec :: acc
in
(* can start building after cursor now,
* since cursor was built *)
buildTextStringSearch
( pos + 1
, str
, acc
, startX + xSpace
, posY + ySpace
, startX
, tl
, absIdx + 1
, cursorPos
, cursorAcc
, bgAcc
, env
, searchHd
, searchPos
, searchLen
)
end
else
accToDrawMsg (acc, cursorAcc, bgAcc, env)
end
end
end
else
(* change to searching in string's tl *)
case tl of
hd :: tl =>
buildTextStringSearch
( 0
, hd
, acc
, posX
, posY
, startX
, tl
, absIdx
, cursorPos
, cursorAcc
, bgAcc
, env
, searchHd
, searchPos
, searchLen
)
| [] => accToDrawMsg (acc, cursorAcc, bgAcc, env)
else
(* change to searching in string's tl *)
case tl of
hd :: tl =>
buildTextStringSearch
( 0
, hd
, acc
, posX
, posY
, startX
, tl
, absIdx
, cursorPos
, cursorAcc
, bgAcc
, env
, searchHd
, searchPos
, searchLen
)
| [] => accToDrawMsg (acc, cursorAcc, bgAcc, env)
end
(* gets line start idx, relative to right hd *)
fun helpGetLineStartIdx (startLine, curLine, rLnHd) =