Files
sml-projects/shf/fcore/text-builder/normal-mode-text-builder.sml

143 lines
3.4 KiB
Standard ML
Raw Normal View History

structure NormalModeTextBuilder =
struct
structure Utils = TextBuilderUtils
(* Prerequisite to all functions in this structure:
* - Move buffer to startLine before calling any function. *)
fun startBuild
( startLine
, cursorPos
, buffer: LineGap.t
, windowWidth
, windowHeight
, floatWindowWidth
, floatWindowHeight
, searchList
, visualScrollColumn
, acc
) =
let
2025-09-16 04:35:49 +01:00
val
{ rightStrings
, rightLines
, line = curLine
, idx = curIdx
, textLength
, ...
} = buffer
2025-09-16 04:35:49 +01:00
val env = Utils.initEnv
( 0
, 0
2025-09-16 04:35:49 +01:00
, windowWidth
, windowHeight
, floatWindowWidth
, floatWindowHeight
, searchList
, visualScrollColumn
, startLine
)
val {startX, startY, ...} = env
in
if textLength = 1 then
(* empty string, so there is nothing we can draw
* except a cursor at the line start.
* An empty string is usually thought of to have a length of 0
* and this is true, but we always have a \n at the end of the buffer
* to respect Unix-style file endings, which we always uphold.
* So, for us, an empty string has a length of 1. *)
[Utils.makeCursor (startX, startY, env)]
else
case (rightStrings, rightLines) of
(shd :: stl, lhd :: ltl) =>
let
(* get relative index of line to start building from *)
val strPos =
Utils.getRelativeLineStartFromRightHead
(startLine, curLine, lhd)
(* get absolute idx of line *)
val absIdx = curIdx + strPos
in
if PersistentVector.isEmpty searchList then
TextBuilderWithCursor.build
( strPos
, shd
, stl
, lhd
, ltl
, startX
, startY
, 0
, startLine
, absIdx
, cursorPos
, env
, acc
)
else
TextBuilderWithHighlight.build
( strPos
, shd
, stl
, lhd
, ltl
, startX
, startY
, 0
, startLine
, absIdx
, cursorPos
, env
, acc
)
2025-09-16 04:35:49 +01:00
end
| (_, _) => acc
end
fun buildWithExisting
( startLine
, cursorPos
, buffer: LineGap.t
, windowWidth
, windowHeight
, searchList
, visualScrollColumn
, acc
) =
startBuild
( startLine
, cursorPos
, buffer
, windowWidth
, windowHeight
, Real32.fromInt windowWidth
, Real32.fromInt windowHeight
, searchList
, visualScrollColumn
, []
)
fun build
( startLine
, cursorPos
, buffer: LineGap.t
, windowWidth
, windowHeight
, searchList
, visualScrollColumn
) =
startBuild
( startLine
, cursorPos
, buffer
, windowWidth
, windowHeight
, Real32.fromInt windowWidth
, Real32.fromInt windowHeight
, searchList
, visualScrollColumn
, []
)
end