create text builder function to call for normal mode
This commit is contained in:
115
fcore/text-builder/normal-mode-text-builder.sml
Normal file
115
fcore/text-builder/normal-mode-text-builder.sml
Normal file
@@ -0,0 +1,115 @@
|
||||
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
|
||||
, searchString
|
||||
, visualScrollColumn
|
||||
, acc
|
||||
) =
|
||||
let
|
||||
val {rightStrings, rightLines, line = curLine, idx = curIdx, ...} = buffer
|
||||
in
|
||||
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)
|
||||
+ 1
|
||||
(* get absolute idx of line *)
|
||||
val absIdx = curIdx + strPos
|
||||
val searchPos = BinSearch.equalOrMore (absIdx, searchList)
|
||||
|
||||
val env = Utils.initEnv
|
||||
( windowWidth
|
||||
, windowHeight
|
||||
, floatWindowWidth
|
||||
, floatWindowHeight
|
||||
, searchList
|
||||
, String.size searchString
|
||||
, visualScrollColumn
|
||||
, startLine
|
||||
)
|
||||
val {startX, startY, ...} = env
|
||||
in
|
||||
TextBuilderWithHighlight.build
|
||||
( strPos
|
||||
, shd
|
||||
, stl
|
||||
, lhd
|
||||
, ltl
|
||||
, startX
|
||||
, startY
|
||||
, 0
|
||||
, startLine
|
||||
, absIdx
|
||||
, cursorPos
|
||||
, env
|
||||
, acc
|
||||
, searchPos
|
||||
)
|
||||
end
|
||||
| (_, _) => acc
|
||||
end
|
||||
|
||||
fun buildWithExisting
|
||||
( startLine
|
||||
, cursorPos
|
||||
, buffer: LineGap.t
|
||||
, windowWidth
|
||||
, windowHeight
|
||||
, searchList: SearchList.t
|
||||
, searchString
|
||||
, visualScrollColumn
|
||||
, acc
|
||||
) =
|
||||
startBuild
|
||||
( startLine
|
||||
, cursorPos
|
||||
, buffer
|
||||
, windowWidth
|
||||
, windowHeight
|
||||
, Real32.fromInt windowWidth
|
||||
, Real32.fromInt windowHeight
|
||||
, searchList
|
||||
, searchString
|
||||
, visualScrollColumn
|
||||
, []
|
||||
)
|
||||
|
||||
fun build
|
||||
( startLine
|
||||
, cursorPos
|
||||
, buffer: LineGap.t
|
||||
, windowWidth
|
||||
, windowHeight
|
||||
, searchList: SearchList.t
|
||||
, searchString
|
||||
, visualScrollColumn
|
||||
) =
|
||||
startBuild
|
||||
( startLine
|
||||
, cursorPos
|
||||
, buffer
|
||||
, windowWidth
|
||||
, windowHeight
|
||||
, Real32.fromInt windowWidth
|
||||
, Real32.fromInt windowHeight
|
||||
, searchList
|
||||
, searchString
|
||||
, visualScrollColumn
|
||||
, []
|
||||
)
|
||||
end
|
||||
@@ -235,4 +235,40 @@ struct
|
||||
fun advanceSearchPos (absIdx, searchPos, env) =
|
||||
if isAfterSearchRange (absIdx, searchPos, env) then searchPos + 1
|
||||
else searchPos
|
||||
|
||||
(* gets line start idx, relative to right hd *)
|
||||
fun getRelativeLineStartFromRightHead (startLine, curLine, rLnHd) =
|
||||
if startLine > curLine then
|
||||
let val lnPos = startLine - curLine - 1
|
||||
in Vector.sub (rLnHd, lnPos) + 1
|
||||
end
|
||||
else
|
||||
0
|
||||
|
||||
(* gets line start idx, absolute *)
|
||||
fun getAbsoluteLineStartFromRightHead (curIdx, startLine, curLine, rLnHd) =
|
||||
let
|
||||
val startIdx =
|
||||
if startLine > curLine then
|
||||
let val lnPos = startLine - curLine - 1
|
||||
in Vector.sub (rLnHd, lnPos) + 1
|
||||
end
|
||||
else
|
||||
0
|
||||
in
|
||||
curIdx + startIdx
|
||||
end
|
||||
|
||||
fun getLineAbsIdxFromBuffer (startLine, buffer: LineGap.t) =
|
||||
let
|
||||
val {rightLines, line = curLine, idx = curIdx, ...} = buffer
|
||||
in
|
||||
case rightLines of
|
||||
rLnHd :: _ =>
|
||||
getAbsoluteLineStartFromRightHead (curIdx, startLine, curLine, rLnHd)
|
||||
| [] =>
|
||||
raise Fail
|
||||
"text-builder-utils.sml 268:\
|
||||
\should never call function when at end of buffer"
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user