refactor text builder a bit (I should probably functorise buffer/lineGap iteration code out at some point)
This commit is contained in:
@@ -41,26 +41,37 @@ struct
|
|||||||
* on an indented line *)
|
* on an indented line *)
|
||||||
(* same as buildTextStringAfterCursor, except this keeps track of absolute
|
(* same as buildTextStringAfterCursor, except this keeps track of absolute
|
||||||
* index and cursor pos too *)
|
* index and cursor pos too *)
|
||||||
type colour_data =
|
type env_data =
|
||||||
{ r: Real32.real
|
{ r: Real32.real
|
||||||
, g: Real32.real
|
, g: Real32.real
|
||||||
, b: Real32.real
|
, b: Real32.real
|
||||||
|
|
||||||
|
(* hr/hg/hb = highlight red/green/blue *)
|
||||||
, hr: Real32.real
|
, hr: Real32.real
|
||||||
, hg: Real32.real
|
, hg: Real32.real
|
||||||
, hb: Real32.real
|
, hb: Real32.real
|
||||||
}
|
|
||||||
|
|
||||||
type window_data =
|
, w: int
|
||||||
{ w: int
|
|
||||||
, h: int
|
, h: int
|
||||||
|
|
||||||
|
(* fw/fh = float window width and float window height *)
|
||||||
, fw: Real32.real
|
, fw: Real32.real
|
||||||
, fh: Real32.real
|
, fh: Real32.real
|
||||||
}
|
}
|
||||||
|
|
||||||
fun buildTextString
|
fun buildTextString
|
||||||
( pos, str, acc, posX, posY, startX
|
( pos
|
||||||
, tl, absIdx, cursorPos, cursorAcc, bgAcc
|
, str
|
||||||
, windowData: window_data, colourData: colour_data
|
, acc
|
||||||
|
, posX
|
||||||
|
, posY
|
||||||
|
, startX
|
||||||
|
, tl
|
||||||
|
, absIdx
|
||||||
|
, cursorPos
|
||||||
|
, cursorAcc
|
||||||
|
, bgAcc
|
||||||
|
, env: env_data
|
||||||
) =
|
) =
|
||||||
if pos < String.size str then
|
if pos < String.size str then
|
||||||
case String.sub (str, pos) of
|
case String.sub (str, pos) of
|
||||||
@@ -70,47 +81,81 @@ struct
|
|||||||
if absIdx <> cursorPos then
|
if absIdx <> cursorPos then
|
||||||
(* not in cursur *)
|
(* not in cursur *)
|
||||||
buildTextString
|
buildTextString
|
||||||
( pos + 1, str, acc, posX + xSpace, posY, startX
|
( pos + 1
|
||||||
, tl, absIdx + 1, cursorPos, cursorAcc, bgAcc
|
, str
|
||||||
, windowData, colourData
|
, acc
|
||||||
|
, posX + xSpace
|
||||||
|
, posY
|
||||||
|
, startX
|
||||||
|
, tl
|
||||||
|
, absIdx + 1
|
||||||
|
, cursorPos
|
||||||
|
, cursorAcc
|
||||||
|
, bgAcc
|
||||||
|
, env
|
||||||
)
|
)
|
||||||
else
|
else
|
||||||
(* in cursor *)
|
(* in cursor *)
|
||||||
let
|
let
|
||||||
val {fw, fh, ...} = windowData
|
val {r, g, b, fw, fh, ...} = env
|
||||||
val {r, g, b, ...} = colourData
|
|
||||||
|
|
||||||
val cursorAcc =
|
val cursorAcc = Rect.lerp
|
||||||
Rect.lerp (posX, posY, fontSize, fontSize, fw, fh, r, g ,b)
|
(posX, posY, fontSize, fontSize, fw, fh, r, g, b)
|
||||||
in
|
in
|
||||||
buildTextString
|
buildTextString
|
||||||
( pos + 1, str, acc, posX + xSpace, posY, startX
|
( pos + 1
|
||||||
, tl, absIdx + 1, cursorPos, cursorAcc, bgAcc
|
, str
|
||||||
, windowData, colourData
|
, acc
|
||||||
|
, posX + xSpace
|
||||||
|
, posY
|
||||||
|
, startX
|
||||||
|
, tl
|
||||||
|
, absIdx + 1
|
||||||
|
, cursorPos
|
||||||
|
, cursorAcc
|
||||||
|
, bgAcc
|
||||||
|
, env
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
| #"\n" =>
|
| #"\n" =>
|
||||||
if posY + ySpace < #h windowData then
|
if posY + ySpace < #h env then
|
||||||
if absIdx <> cursorPos then
|
if absIdx <> cursorPos then
|
||||||
(* not in cursor position, so iterate like normal *)
|
(* not in cursor position, so iterate like normal *)
|
||||||
buildTextString
|
buildTextString
|
||||||
( pos + 1, str, acc, startX, posY + ySpace, startX
|
( pos + 1
|
||||||
, tl, absIdx + 1, cursorPos, cursorAcc, bgAcc
|
, str
|
||||||
, windowData, colourData
|
, acc
|
||||||
|
, startX
|
||||||
|
, posY + ySpace
|
||||||
|
, startX
|
||||||
|
, tl
|
||||||
|
, absIdx + 1
|
||||||
|
, cursorPos
|
||||||
|
, cursorAcc
|
||||||
|
, bgAcc
|
||||||
|
, env
|
||||||
)
|
)
|
||||||
else
|
else
|
||||||
(* in cursor position, so build cursorAcc *)
|
(* in cursor position, so build cursorAcc *)
|
||||||
let
|
let
|
||||||
val {fw, fh, ...} = windowData
|
val {r, g, b, fw, fh, ...} = env
|
||||||
val {r, g, b, ...} = colourData
|
|
||||||
|
|
||||||
val cursorAcc =
|
val cursorAcc = Rect.lerp
|
||||||
Rect.lerp (posX, posY, fontSize, fontSize, fw, fh, r, g ,b)
|
(posX, posY, fontSize, fontSize, fw, fh, r, g, b)
|
||||||
in
|
in
|
||||||
buildTextString
|
buildTextString
|
||||||
( pos + 1, str, acc, startX, posY + ySpace, startX
|
( pos + 1
|
||||||
, tl, absIdx + 1, cursorPos, cursorAcc, bgAcc
|
, str
|
||||||
, windowData, colourData
|
, acc
|
||||||
|
, startX
|
||||||
|
, posY + ySpace
|
||||||
|
, startX
|
||||||
|
, tl
|
||||||
|
, absIdx + 1
|
||||||
|
, cursorPos
|
||||||
|
, cursorAcc
|
||||||
|
, bgAcc
|
||||||
|
, env
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@@ -121,36 +166,50 @@ struct
|
|||||||
in
|
in
|
||||||
if absIdx <> cursorPos then
|
if absIdx <> cursorPos then
|
||||||
(* not equal to cursor *)
|
(* not equal to cursor *)
|
||||||
if posX + xSpace < #w windowData then
|
if posX + xSpace < #w env then
|
||||||
let
|
let
|
||||||
val {fw, fh, ...} = windowData
|
val {r, g, b, fw, fh, ...} = env
|
||||||
val {r, g, b, ...} = colourData
|
|
||||||
|
|
||||||
val chrVec = chrFun
|
val chrVec = chrFun
|
||||||
(posX, posY, fontSize, fontSize, fw, fh, r, g, b)
|
(posX, posY, fontSize, fontSize, fw, fh, r, g, b)
|
||||||
val acc = chrVec :: acc
|
val acc = chrVec :: acc
|
||||||
in
|
in
|
||||||
buildTextString
|
buildTextString
|
||||||
( pos + 1, str, acc, posX + xSpace, posY, startX
|
( pos + 1
|
||||||
, tl, absIdx + 1, cursorPos, cursorAcc, bgAcc
|
, str
|
||||||
, windowData, colourData
|
, acc
|
||||||
|
, posX + xSpace
|
||||||
|
, posY
|
||||||
|
, startX
|
||||||
|
, tl
|
||||||
|
, absIdx + 1
|
||||||
|
, cursorPos
|
||||||
|
, cursorAcc
|
||||||
|
, bgAcc
|
||||||
|
, env
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
else if posY + ySpace < #h windowData then
|
else if posY + ySpace < #h env then
|
||||||
let
|
let
|
||||||
val {fw, fh, ...} = windowData
|
val {r, g, b, fw, fh, ...} = env
|
||||||
val {r, g, b, ...} = colourData
|
|
||||||
|
|
||||||
val chrVec = chrFun
|
val chrVec = chrFun
|
||||||
( startX, posY + ySpace, fontSize, fontSize
|
(startX, posY + ySpace, fontSize, fontSize, fw, fh, r, g, b)
|
||||||
, fw, fh, r, g, b
|
|
||||||
)
|
|
||||||
val acc = chrVec :: acc
|
val acc = chrVec :: acc
|
||||||
in
|
in
|
||||||
buildTextString
|
buildTextString
|
||||||
( pos + 1, str, acc, startX + xSpace, posY + ySpace, startX
|
( pos + 1
|
||||||
, tl, absIdx + 1, cursorPos, cursorAcc, bgAcc
|
, str
|
||||||
, windowData, colourData
|
, acc
|
||||||
|
, startX + xSpace
|
||||||
|
, posY + ySpace
|
||||||
|
, startX
|
||||||
|
, tl
|
||||||
|
, absIdx + 1
|
||||||
|
, cursorPos
|
||||||
|
, cursorAcc
|
||||||
|
, bgAcc
|
||||||
|
, env
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@@ -158,41 +217,64 @@ struct
|
|||||||
else
|
else
|
||||||
(* equal to cursor *)
|
(* equal to cursor *)
|
||||||
let
|
let
|
||||||
val {fw, fh, ...} = windowData
|
val {fw, fh, r, g, b, hr, hg, hb, ...} = env
|
||||||
val {r, g, b, hr, hg, hb} = colourData
|
|
||||||
val cursorAcc =
|
val cursorAcc = Rect.lerp
|
||||||
Rect.lerp (posX, posY, fontSize, fontSize, fw, fh, r, g ,b)
|
(posX, posY, fontSize, fontSize, fw, fh, r, g, b)
|
||||||
in
|
in
|
||||||
if posX + xSpace < #w windowData then
|
if posX + xSpace < #w env then
|
||||||
let
|
let
|
||||||
val chrVec = chrFun
|
val chrVec = chrFun
|
||||||
( posX, posY, fontSize, fontSize
|
(posX, posY, fontSize, fontSize, fw, fh, hr, hg, hb)
|
||||||
, fw, fh , hr, hg, hb
|
|
||||||
)
|
|
||||||
val acc = chrVec :: acc
|
val acc = chrVec :: acc
|
||||||
in
|
in
|
||||||
(* can start building after cursor now,
|
(* can start building after cursor now,
|
||||||
* since cursor was built *)
|
* since cursor was built *)
|
||||||
buildTextString
|
buildTextString
|
||||||
( pos + 1, str, acc, posX + xSpace, posY, startX
|
( pos + 1
|
||||||
, tl, absIdx + 1, cursorPos, cursorAcc, bgAcc
|
, str
|
||||||
, windowData, colourData
|
, acc
|
||||||
|
, posX + xSpace
|
||||||
|
, posY
|
||||||
|
, startX
|
||||||
|
, tl
|
||||||
|
, absIdx + 1
|
||||||
|
, cursorPos
|
||||||
|
, cursorAcc
|
||||||
|
, bgAcc
|
||||||
|
, env
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
else if posY + ySpace < #h windowData then
|
else if posY + ySpace < #h env then
|
||||||
let
|
let
|
||||||
val chrVec = chrFun
|
val chrVec = chrFun
|
||||||
( startX, posY + ySpace, fontSize, fontSize
|
( startX
|
||||||
, fw, fh, hr, hg, hb
|
, posY + ySpace
|
||||||
|
, fontSize
|
||||||
|
, fontSize
|
||||||
|
, fw
|
||||||
|
, fh
|
||||||
|
, hr
|
||||||
|
, hg
|
||||||
|
, hb
|
||||||
)
|
)
|
||||||
val acc = chrVec :: acc
|
val acc = chrVec :: acc
|
||||||
in
|
in
|
||||||
(* can start building after cursor now,
|
(* can start building after cursor now,
|
||||||
* since cursor was built *)
|
* since cursor was built *)
|
||||||
buildTextString
|
buildTextString
|
||||||
( pos + 1, str, acc, startX + xSpace, posY + ySpace, startX
|
( pos + 1
|
||||||
, tl, absIdx + 1, cursorPos, cursorAcc, bgAcc
|
, str
|
||||||
, windowData, colourData
|
, acc
|
||||||
|
, startX + xSpace
|
||||||
|
, posY + ySpace
|
||||||
|
, startX
|
||||||
|
, tl
|
||||||
|
, absIdx + 1
|
||||||
|
, cursorPos
|
||||||
|
, cursorAcc
|
||||||
|
, bgAcc
|
||||||
|
, env
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@@ -204,49 +286,86 @@ struct
|
|||||||
case tl of
|
case tl of
|
||||||
hd :: tl =>
|
hd :: tl =>
|
||||||
buildTextString
|
buildTextString
|
||||||
( 0, hd, acc, posX, posY, startX
|
( 0
|
||||||
, tl, absIdx, cursorPos, cursorAcc, bgAcc
|
, hd
|
||||||
, windowData, colourData
|
, acc
|
||||||
|
, posX
|
||||||
|
, posY
|
||||||
|
, startX
|
||||||
|
, tl
|
||||||
|
, absIdx
|
||||||
|
, cursorPos
|
||||||
|
, cursorAcc
|
||||||
|
, bgAcc
|
||||||
|
, env
|
||||||
)
|
)
|
||||||
| [] =>
|
| [] => accToDrawMsg (acc, cursorAcc, bgAcc)
|
||||||
accToDrawMsg (acc, cursorAcc, bgAcc)
|
|
||||||
|
|
||||||
fun isInSearchRange (absIdx, searchPos, searchHd, searchLen) =
|
fun isInSearchRange (absIdx, searchPos, searchHd, searchLen) =
|
||||||
let
|
let val searchIdx = Vector.sub (searchHd, searchPos)
|
||||||
val searchIdx = Vector.sub (searchHd, searchPos)
|
in absIdx >= searchIdx andalso absIdx < searchIdx + searchLen
|
||||||
in
|
|
||||||
absIdx >= searchIdx andalso absIdx < searchIdx + searchLen
|
|
||||||
end
|
end
|
||||||
|
|
||||||
fun isAfterSearchRange (absIdx, searchPos, searchHd, searchLen) =
|
fun isAfterSearchRange (absIdx, searchPos, searchHd, searchLen) =
|
||||||
let
|
let val searchIdx = Vector.sub (searchHd, searchPos)
|
||||||
val searchIdx = Vector.sub (searchHd, searchPos)
|
in absIdx >= searchIdx + searchLen
|
||||||
in
|
|
||||||
absIdx >= searchIdx + searchLen
|
|
||||||
end
|
end
|
||||||
|
|
||||||
fun buildTextStringSearch
|
fun buildTextStringSearch
|
||||||
( pos, str, acc, posX, posY, startX
|
( pos
|
||||||
, tl, absIdx, cursorPos, cursorAcc, bgAcc
|
, str
|
||||||
, windowData: window_data, colourData: colour_data
|
, acc
|
||||||
, searchHd, searchTl, searchPos, searchLen
|
, posX
|
||||||
|
, posY
|
||||||
|
, startX
|
||||||
|
, tl
|
||||||
|
, absIdx
|
||||||
|
, cursorPos
|
||||||
|
, cursorAcc
|
||||||
|
, bgAcc
|
||||||
|
, env: env_data
|
||||||
|
, searchHd
|
||||||
|
, searchTl
|
||||||
|
, searchPos
|
||||||
|
, searchLen
|
||||||
) =
|
) =
|
||||||
if searchPos = Vector.length searchHd then
|
if searchPos = Vector.length searchHd then
|
||||||
case searchTl of
|
case searchTl of
|
||||||
searchHd :: searchTl =>
|
searchHd :: searchTl =>
|
||||||
(* go to next search hd/tl *)
|
(* go to next search hd/tl *)
|
||||||
buildTextStringSearch
|
buildTextStringSearch
|
||||||
( pos, str, acc, posX, posY, startX
|
( pos
|
||||||
, tl, absIdx, cursorPos, cursorAcc, bgAcc
|
, str
|
||||||
, windowData, colourData
|
, acc
|
||||||
, searchHd, searchTl, 0, searchLen
|
, posX
|
||||||
|
, posY
|
||||||
|
, startX
|
||||||
|
, tl
|
||||||
|
, absIdx
|
||||||
|
, cursorPos
|
||||||
|
, cursorAcc
|
||||||
|
, bgAcc
|
||||||
|
, env
|
||||||
|
, searchHd
|
||||||
|
, searchTl
|
||||||
|
, 0
|
||||||
|
, searchLen
|
||||||
)
|
)
|
||||||
| [] =>
|
| [] =>
|
||||||
(* exhausted search hd/tl so calll normal build function *)
|
(* exhausted search hd/tl so call normal build function *)
|
||||||
buildTextString
|
buildTextString
|
||||||
( pos, str, acc, posX, posY, startX
|
( pos
|
||||||
, tl, absIdx, cursorPos, cursorAcc, bgAcc
|
, str
|
||||||
, windowData, colourData
|
, acc
|
||||||
|
, posX
|
||||||
|
, posY
|
||||||
|
, startX
|
||||||
|
, tl
|
||||||
|
, absIdx
|
||||||
|
, cursorPos
|
||||||
|
, cursorAcc
|
||||||
|
, bgAcc
|
||||||
|
, env
|
||||||
)
|
)
|
||||||
else if pos < String.size str then
|
else if pos < String.size str then
|
||||||
case String.sub (str, pos) of
|
case String.sub (str, pos) of
|
||||||
@@ -262,66 +381,124 @@ struct
|
|||||||
val r: Real32.real = 0.3
|
val r: Real32.real = 0.3
|
||||||
val g: Real32.real = 0.1
|
val g: Real32.real = 0.1
|
||||||
val b: Real32.real = 0.1
|
val b: Real32.real = 0.1
|
||||||
val {fw, fh, ...} = windowData
|
val {fw, fh, ...} = env
|
||||||
|
|
||||||
val space =
|
val space = Rect.lerp
|
||||||
Rect.lerp (posX, posY, fontSize, fontSize, fw, fh, r, g, b)
|
(posX, posY, fontSize, fontSize, fw, fh, r, g, b)
|
||||||
val bgAcc = space :: bgAcc
|
val bgAcc = space :: bgAcc
|
||||||
in
|
in
|
||||||
buildTextStringSearch
|
buildTextStringSearch
|
||||||
( pos + 1, str, acc, posX + xSpace, posY, startX
|
( pos + 1
|
||||||
, tl, absIdx + 1, cursorPos, cursorAcc, bgAcc
|
, str
|
||||||
, windowData, colourData
|
, acc
|
||||||
, searchHd, searchTl, searchPos, searchLen
|
, posX + xSpace
|
||||||
|
, posY
|
||||||
|
, startX
|
||||||
|
, tl
|
||||||
|
, absIdx + 1
|
||||||
|
, cursorPos
|
||||||
|
, cursorAcc
|
||||||
|
, bgAcc
|
||||||
|
, env
|
||||||
|
, searchHd
|
||||||
|
, searchTl
|
||||||
|
, searchPos
|
||||||
|
, searchLen
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
buildTextStringSearch
|
buildTextStringSearch
|
||||||
( pos + 1, str, acc, posX + xSpace, posY, startX
|
( pos + 1
|
||||||
, tl, absIdx + 1, cursorPos, cursorAcc, bgAcc
|
, str
|
||||||
, windowData, colourData
|
, acc
|
||||||
, searchHd, searchTl, searchPos, searchLen
|
, posX + xSpace
|
||||||
|
, posY
|
||||||
|
, startX
|
||||||
|
, tl
|
||||||
|
, absIdx + 1
|
||||||
|
, cursorPos
|
||||||
|
, cursorAcc
|
||||||
|
, bgAcc
|
||||||
|
, env
|
||||||
|
, searchHd
|
||||||
|
, searchTl
|
||||||
|
, searchPos
|
||||||
|
, searchLen
|
||||||
)
|
)
|
||||||
else
|
else
|
||||||
(* in cursor *)
|
(* in cursor *)
|
||||||
let
|
let
|
||||||
val {fw, fh, ...} = windowData
|
val {fw, fh, r, g, b, ...} = env
|
||||||
val {r, g, b, ...} = colourData
|
|
||||||
|
|
||||||
val cursorAcc =
|
val cursorAcc = Rect.lerp
|
||||||
Rect.lerp (posX, posY, fontSize, fontSize, fw, fh, r, g ,b)
|
(posX, posY, fontSize, fontSize, fw, fh, r, g, b)
|
||||||
in
|
in
|
||||||
buildTextStringSearch
|
buildTextStringSearch
|
||||||
( pos + 1, str, acc, posX + xSpace, posY, startX
|
( pos + 1
|
||||||
, tl, absIdx + 1, cursorPos, cursorAcc, bgAcc
|
, str
|
||||||
, windowData, colourData
|
, acc
|
||||||
, searchHd, searchTl, searchPos, searchLen
|
, posX + xSpace
|
||||||
|
, posY
|
||||||
|
, startX
|
||||||
|
, tl
|
||||||
|
, absIdx + 1
|
||||||
|
, cursorPos
|
||||||
|
, cursorAcc
|
||||||
|
, bgAcc
|
||||||
|
, env
|
||||||
|
, searchHd
|
||||||
|
, searchTl
|
||||||
|
, searchPos
|
||||||
|
, searchLen
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
| #"\n" =>
|
| #"\n" =>
|
||||||
if posY + ySpace < #h windowData then
|
if posY + ySpace < #h env then
|
||||||
if absIdx <> cursorPos then
|
if absIdx <> cursorPos then
|
||||||
(* not in cursor position, so iterate like normal *)
|
(* not in cursor position, so iterate like normal *)
|
||||||
buildTextStringSearch
|
buildTextStringSearch
|
||||||
( pos + 1, str, acc, startX, posY + ySpace, startX
|
( pos + 1
|
||||||
, tl, absIdx + 1, cursorPos, cursorAcc, bgAcc
|
, str
|
||||||
, windowData, colourData
|
, acc
|
||||||
, searchHd, searchTl, searchPos, searchLen
|
, startX
|
||||||
|
, posY + ySpace
|
||||||
|
, startX
|
||||||
|
, tl
|
||||||
|
, absIdx + 1
|
||||||
|
, cursorPos
|
||||||
|
, cursorAcc
|
||||||
|
, bgAcc
|
||||||
|
, env
|
||||||
|
, searchHd
|
||||||
|
, searchTl
|
||||||
|
, searchPos
|
||||||
|
, searchLen
|
||||||
)
|
)
|
||||||
else
|
else
|
||||||
(* in cursor position, so build cursorAcc *)
|
(* in cursor position, so build cursorAcc *)
|
||||||
let
|
let
|
||||||
val {fw, fh, ...} = windowData
|
val {fw, fh, r, g, b, ...} = env
|
||||||
val {r, g, b, ...} = colourData
|
|
||||||
|
|
||||||
val cursorAcc =
|
val cursorAcc = Rect.lerp
|
||||||
Rect.lerp (posX, posY, fontSize, fontSize, fw, fh, r, g ,b)
|
(posX, posY, fontSize, fontSize, fw, fh, r, g, b)
|
||||||
in
|
in
|
||||||
buildTextStringSearch
|
buildTextStringSearch
|
||||||
( pos + 1, str, acc, startX, posY + ySpace, startX
|
( pos + 1
|
||||||
, tl, absIdx + 1, cursorPos, cursorAcc, bgAcc
|
, str
|
||||||
, windowData, colourData
|
, acc
|
||||||
, searchHd, searchTl, searchPos, searchLen
|
, startX
|
||||||
|
, posY + ySpace
|
||||||
|
, startX
|
||||||
|
, tl
|
||||||
|
, absIdx + 1
|
||||||
|
, cursorPos
|
||||||
|
, cursorAcc
|
||||||
|
, bgAcc
|
||||||
|
, env
|
||||||
|
, searchHd
|
||||||
|
, searchTl
|
||||||
|
, searchPos
|
||||||
|
, searchLen
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@@ -332,10 +509,10 @@ struct
|
|||||||
in
|
in
|
||||||
if absIdx <> cursorPos then
|
if absIdx <> cursorPos then
|
||||||
(* not equal to cursor *)
|
(* not equal to cursor *)
|
||||||
if posX + xSpace < #w windowData then
|
if posX + xSpace < #w env then
|
||||||
if isInSearchRange (absIdx, searchPos, searchHd, searchLen) then
|
if isInSearchRange (absIdx, searchPos, searchHd, searchLen) then
|
||||||
let
|
let
|
||||||
val {fw, fh, ...} = windowData
|
val {fw, fh, ...} = env
|
||||||
|
|
||||||
(* todo: temp colours *)
|
(* todo: temp colours *)
|
||||||
val r: Real32.real = 0.7
|
val r: Real32.real = 0.7
|
||||||
@@ -343,8 +520,8 @@ struct
|
|||||||
val b: Real32.real = 0.7
|
val b: Real32.real = 0.7
|
||||||
|
|
||||||
(* build char vec *)
|
(* build char vec *)
|
||||||
val chrVec =
|
val chrVec = chrFun
|
||||||
chrFun (posX, posY, fontSize, fontSize, fw, fh, r, g, b)
|
(posX, posY, fontSize, fontSize, fw, fh, r, g, b)
|
||||||
val acc = chrVec :: acc
|
val acc = chrVec :: acc
|
||||||
|
|
||||||
(* build cursor (behind text) vec *)
|
(* build cursor (behind text) vec *)
|
||||||
@@ -352,53 +529,87 @@ struct
|
|||||||
val g: Real32.real = 0.1
|
val g: Real32.real = 0.1
|
||||||
val b: Real32.real = 0.1
|
val b: Real32.real = 0.1
|
||||||
|
|
||||||
val space =
|
val space = Rect.lerp
|
||||||
Rect.lerp (posX, posY, fontSize, fontSize, fw, fh, r, g, b)
|
(posX, posY, fontSize, fontSize, fw, fh, r, g, b)
|
||||||
val bgAcc = space :: bgAcc
|
val bgAcc = space :: bgAcc
|
||||||
in
|
in
|
||||||
buildTextStringSearch
|
buildTextStringSearch
|
||||||
( pos + 1, str, acc, posX + xSpace, posY, startX
|
( pos + 1
|
||||||
, tl, absIdx + 1, cursorPos, cursorAcc, bgAcc
|
, str
|
||||||
, windowData, colourData
|
, acc
|
||||||
, searchHd, searchTl, searchPos, searchLen
|
, posX + xSpace
|
||||||
|
, posY
|
||||||
|
, startX
|
||||||
|
, tl
|
||||||
|
, absIdx + 1
|
||||||
|
, cursorPos
|
||||||
|
, cursorAcc
|
||||||
|
, bgAcc
|
||||||
|
, env
|
||||||
|
, searchHd
|
||||||
|
, searchTl
|
||||||
|
, searchPos
|
||||||
|
, searchLen
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
let
|
let
|
||||||
val {fw, fh, ...} = windowData
|
val {fw, fh, r, g, b, ...} = env
|
||||||
val {r, g, b, ...} = colourData
|
|
||||||
|
|
||||||
val chrVec =
|
val chrVec = chrFun
|
||||||
chrFun (posX, posY, fontSize, fontSize, fw, fh, r, g, b)
|
(posX, posY, fontSize, fontSize, fw, fh, r, g, b)
|
||||||
val acc = chrVec :: acc
|
val acc = chrVec :: acc
|
||||||
val searchPos =
|
val searchPos =
|
||||||
if isAfterSearchRange (absIdx, searchPos, searchHd, searchLen)
|
if
|
||||||
|
isAfterSearchRange
|
||||||
|
(absIdx, searchPos, searchHd, searchLen)
|
||||||
then searchPos + 1
|
then searchPos + 1
|
||||||
else searchPos
|
else searchPos
|
||||||
in
|
in
|
||||||
buildTextStringSearch
|
buildTextStringSearch
|
||||||
( pos + 1, str, acc, posX + xSpace, posY, startX
|
( pos + 1
|
||||||
, tl, absIdx + 1, cursorPos, cursorAcc, bgAcc
|
, str
|
||||||
, windowData, colourData
|
, acc
|
||||||
, searchHd, searchTl, searchPos, searchLen
|
, posX + xSpace
|
||||||
|
, posY
|
||||||
|
, startX
|
||||||
|
, tl
|
||||||
|
, absIdx + 1
|
||||||
|
, cursorPos
|
||||||
|
, cursorAcc
|
||||||
|
, bgAcc
|
||||||
|
, env
|
||||||
|
, searchHd
|
||||||
|
, searchTl
|
||||||
|
, searchPos
|
||||||
|
, searchLen
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
else if posY + ySpace < #h windowData then
|
else if posY + ySpace < #h env then
|
||||||
let
|
let
|
||||||
val {fw, fh, ...} = windowData
|
val {fw, fh, r, g, b, ...} = env
|
||||||
val {r, g, b, ...} = colourData
|
|
||||||
|
|
||||||
val chrVec = chrFun
|
val chrVec = chrFun
|
||||||
( startX, posY + ySpace, fontSize, fontSize
|
(startX, posY + ySpace, fontSize, fontSize, fw, fh, r, g, b)
|
||||||
, fw, fh, r, g, b
|
|
||||||
)
|
|
||||||
val acc = chrVec :: acc
|
val acc = chrVec :: acc
|
||||||
in
|
in
|
||||||
buildTextStringSearch
|
buildTextStringSearch
|
||||||
( pos + 1, str, acc, startX + xSpace, posY + ySpace, startX
|
( pos + 1
|
||||||
, tl, absIdx + 1, cursorPos, cursorAcc, bgAcc
|
, str
|
||||||
, windowData, colourData
|
, acc
|
||||||
, searchHd, searchTl, searchPos, searchLen
|
, startX + xSpace
|
||||||
|
, posY + ySpace
|
||||||
|
, startX
|
||||||
|
, tl
|
||||||
|
, absIdx + 1
|
||||||
|
, cursorPos
|
||||||
|
, cursorAcc
|
||||||
|
, bgAcc
|
||||||
|
, env
|
||||||
|
, searchHd
|
||||||
|
, searchTl
|
||||||
|
, searchPos
|
||||||
|
, searchLen
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@@ -406,43 +617,71 @@ struct
|
|||||||
else
|
else
|
||||||
(* equal to cursor *)
|
(* equal to cursor *)
|
||||||
let
|
let
|
||||||
val {fw, fh, ...} = windowData
|
val {fw, fh, r, g, b, hr, hg, hb, ...} = env
|
||||||
val {r, g, b, hr, hg, hb} = colourData
|
val cursorAcc = Rect.lerp
|
||||||
val cursorAcc =
|
(posX, posY, fontSize, fontSize, fw, fh, r, g, b)
|
||||||
Rect.lerp (posX, posY, fontSize, fontSize, fw, fh, r, g ,b)
|
|
||||||
in
|
in
|
||||||
if posX + xSpace < #w windowData then
|
if posX + xSpace < #w env then
|
||||||
let
|
let
|
||||||
val chrVec = chrFun
|
val chrVec = chrFun
|
||||||
( posX, posY, fontSize, fontSize
|
(posX, posY, fontSize, fontSize, fw, fh, hr, hg, hb)
|
||||||
, fw, fh , hr, hg, hb
|
|
||||||
)
|
|
||||||
val acc = chrVec :: acc
|
val acc = chrVec :: acc
|
||||||
in
|
in
|
||||||
(* can start building after cursor now,
|
(* can start building after cursor now,
|
||||||
* since cursor was built *)
|
* since cursor was built *)
|
||||||
buildTextStringSearch
|
buildTextStringSearch
|
||||||
( pos + 1, str, acc, posX + xSpace, posY, startX
|
( pos + 1
|
||||||
, tl, absIdx + 1, cursorPos, cursorAcc, bgAcc
|
, str
|
||||||
, windowData, colourData
|
, acc
|
||||||
, searchHd, searchTl, searchPos, searchLen
|
, posX + xSpace
|
||||||
|
, posY
|
||||||
|
, startX
|
||||||
|
, tl
|
||||||
|
, absIdx + 1
|
||||||
|
, cursorPos
|
||||||
|
, cursorAcc
|
||||||
|
, bgAcc
|
||||||
|
, env
|
||||||
|
, searchHd
|
||||||
|
, searchTl
|
||||||
|
, searchPos
|
||||||
|
, searchLen
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
else if posY + ySpace < #h windowData then
|
else if posY + ySpace < #h env then
|
||||||
let
|
let
|
||||||
val chrVec = chrFun
|
val chrVec = chrFun
|
||||||
( startX, posY + ySpace, fontSize, fontSize
|
( startX
|
||||||
, fw, fh, hr, hg, hb
|
, posY + ySpace
|
||||||
|
, fontSize
|
||||||
|
, fontSize
|
||||||
|
, fw
|
||||||
|
, fh
|
||||||
|
, hr
|
||||||
|
, hg
|
||||||
|
, hb
|
||||||
)
|
)
|
||||||
val acc = chrVec :: acc
|
val acc = chrVec :: acc
|
||||||
in
|
in
|
||||||
(* can start building after cursor now,
|
(* can start building after cursor now,
|
||||||
* since cursor was built *)
|
* since cursor was built *)
|
||||||
buildTextStringSearch
|
buildTextStringSearch
|
||||||
( pos + 1, str, acc, startX + xSpace, posY + ySpace, startX
|
( pos + 1
|
||||||
, tl, absIdx + 1, cursorPos, cursorAcc, bgAcc
|
, str
|
||||||
, windowData, colourData
|
, acc
|
||||||
, searchHd, searchTl, searchPos, searchLen
|
, startX + xSpace
|
||||||
|
, posY + ySpace
|
||||||
|
, startX
|
||||||
|
, tl
|
||||||
|
, absIdx + 1
|
||||||
|
, cursorPos
|
||||||
|
, cursorAcc
|
||||||
|
, bgAcc
|
||||||
|
, env
|
||||||
|
, searchHd
|
||||||
|
, searchTl
|
||||||
|
, searchPos
|
||||||
|
, searchLen
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@@ -454,21 +693,30 @@ struct
|
|||||||
case tl of
|
case tl of
|
||||||
hd :: tl =>
|
hd :: tl =>
|
||||||
buildTextStringSearch
|
buildTextStringSearch
|
||||||
( 0, hd, acc, posX, posY, startX
|
( 0
|
||||||
, tl, absIdx, cursorPos, cursorAcc, bgAcc
|
, hd
|
||||||
, windowData, colourData
|
, acc
|
||||||
, searchHd, searchTl, searchPos, searchLen
|
, posX
|
||||||
|
, posY
|
||||||
|
, startX
|
||||||
|
, tl
|
||||||
|
, absIdx
|
||||||
|
, cursorPos
|
||||||
|
, cursorAcc
|
||||||
|
, bgAcc
|
||||||
|
, env
|
||||||
|
, searchHd
|
||||||
|
, searchTl
|
||||||
|
, searchPos
|
||||||
|
, searchLen
|
||||||
)
|
)
|
||||||
| [] =>
|
| [] => accToDrawMsg (acc, cursorAcc, bgAcc)
|
||||||
accToDrawMsg (acc, cursorAcc, bgAcc)
|
|
||||||
|
|
||||||
(* gets line start idx, relative to right hd *)
|
(* gets line start idx, relative to right hd *)
|
||||||
fun helpGetLineStartIdx (startLine, curLine, rLnHd) =
|
fun helpGetLineStartIdx (startLine, curLine, rLnHd) =
|
||||||
if startLine > curLine then
|
if startLine > curLine then
|
||||||
let
|
let val lnPos = startLine - curLine - 1
|
||||||
val lnPos = startLine - curLine - 1
|
in Vector.sub (rLnHd, lnPos) + 1
|
||||||
in
|
|
||||||
Vector.sub (rLnHd, lnPos) + 1
|
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
0
|
0
|
||||||
@@ -478,10 +726,8 @@ struct
|
|||||||
let
|
let
|
||||||
val startIdx =
|
val startIdx =
|
||||||
if startLine > curLine then
|
if startLine > curLine then
|
||||||
let
|
let val lnPos = startLine - curLine - 1
|
||||||
val lnPos = startLine - curLine - 1
|
in Vector.sub (rLnHd, lnPos) + 1
|
||||||
in
|
|
||||||
Vector.sub (rLnHd, lnPos) + 1
|
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
0
|
0
|
||||||
@@ -494,20 +740,22 @@ struct
|
|||||||
val {rightLines, line = curLine, idx = curIdx, ...} = lineGap
|
val {rightLines, line = curLine, idx = curIdx, ...} = lineGap
|
||||||
in
|
in
|
||||||
case rightLines of
|
case rightLines of
|
||||||
rLnHd :: _ =>
|
rLnHd :: _ => helpGetLineAbsIdx (curIdx, startLine, curLine, rLnHd)
|
||||||
helpGetLineAbsIdx (curIdx, startLine, curLine, rLnHd)
|
| [] => (* should never happen *) 0
|
||||||
| [] =>
|
|
||||||
(* should never happen *)
|
|
||||||
0
|
|
||||||
end
|
end
|
||||||
|
|
||||||
fun build
|
fun build
|
||||||
( startLine, cursorPos, lineGap: LineGap.t
|
( startLine
|
||||||
, windowWidth, windowHeight
|
, cursorPos
|
||||||
, searchList: SearchList.t, searchString
|
, lineGap: LineGap.t
|
||||||
|
, windowWidth
|
||||||
|
, windowHeight
|
||||||
|
, searchList: SearchList.t
|
||||||
|
, searchString
|
||||||
) =
|
) =
|
||||||
let
|
let
|
||||||
val {rightStrings, rightLines, line = curLine, idx = curIdx, ...} = lineGap
|
val {rightStrings, rightLines, line = curLine, idx = curIdx, ...} =
|
||||||
|
lineGap
|
||||||
in
|
in
|
||||||
case (rightStrings, rightLines) of
|
case (rightStrings, rightLines) of
|
||||||
(rStrHd :: rStrTl, rLnHd :: _) =>
|
(rStrHd :: rStrTl, rLnHd :: _) =>
|
||||||
@@ -517,21 +765,19 @@ struct
|
|||||||
(* get absolute idx of line *)
|
(* get absolute idx of line *)
|
||||||
val absIdx = curIdx + startIdx
|
val absIdx = curIdx + startIdx
|
||||||
|
|
||||||
val windowData =
|
val env =
|
||||||
{ w = windowWidth
|
{ w = windowWidth
|
||||||
, h = windowHeight
|
, h = windowHeight
|
||||||
, fw = Real32.fromInt windowWidth
|
, fw = Real32.fromInt windowWidth
|
||||||
, fh = Real32.fromInt windowHeight
|
, fh = Real32.fromInt windowHeight
|
||||||
}
|
, r = 0.67
|
||||||
|
|
||||||
val colourData =
|
|
||||||
{ r = 0.67
|
|
||||||
, g = 0.51
|
, g = 0.51
|
||||||
, b = 0.83
|
, b = 0.83
|
||||||
, hr = 0.211
|
, hr = 0.211
|
||||||
, hg = 0.219
|
, hg = 0.219
|
||||||
, hb = 0.25
|
, hb = 0.25
|
||||||
}
|
}
|
||||||
|
|
||||||
val cursorAcc = Vector.fromList []
|
val cursorAcc = Vector.fromList []
|
||||||
in
|
in
|
||||||
(case #right searchList of
|
(case #right searchList of
|
||||||
@@ -540,17 +786,38 @@ struct
|
|||||||
val searchPos = BinSearch.equalOrMore (absIdx, searchHd)
|
val searchPos = BinSearch.equalOrMore (absIdx, searchHd)
|
||||||
in
|
in
|
||||||
buildTextStringSearch
|
buildTextStringSearch
|
||||||
( startIdx, rStrHd, [], 5, 5, 5
|
( startIdx
|
||||||
, rStrTl, absIdx, cursorPos, cursorAcc, []
|
, rStrHd
|
||||||
, windowData, colourData
|
, []
|
||||||
, searchHd, searchTl, searchPos, String.size searchString
|
, 5
|
||||||
|
, 5
|
||||||
|
, 5
|
||||||
|
, rStrTl
|
||||||
|
, absIdx
|
||||||
|
, cursorPos
|
||||||
|
, cursorAcc
|
||||||
|
, []
|
||||||
|
, env
|
||||||
|
, searchHd
|
||||||
|
, searchTl
|
||||||
|
, searchPos
|
||||||
|
, String.size searchString
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
| [] =>
|
| [] =>
|
||||||
buildTextString
|
buildTextString
|
||||||
( startIdx, rStrHd, [], 5, 5, 5
|
( startIdx
|
||||||
, rStrTl, absIdx, cursorPos, cursorAcc, []
|
, rStrHd
|
||||||
, windowData, colourData
|
, []
|
||||||
|
, 5
|
||||||
|
, 5
|
||||||
|
, 5
|
||||||
|
, rStrTl
|
||||||
|
, absIdx
|
||||||
|
, cursorPos
|
||||||
|
, cursorAcc
|
||||||
|
, []
|
||||||
|
, env
|
||||||
))
|
))
|
||||||
end
|
end
|
||||||
| (_, _) =>
|
| (_, _) =>
|
||||||
|
|||||||
Reference in New Issue
Block a user