remove 'skipToFirstVisibleColumn' function in TextBuilder, as control flow is simpler if we have fewer mutually recursive functions and we can implement its functionality in the 'build' function instead. Also change the 'z' values for cursor and highlight; the cursor should appear above the highlight and now it does, but it previously didn't
This commit is contained in:
@@ -75,8 +75,8 @@ struct
|
||||
, cursorOnCharB = 0.83
|
||||
|
||||
, charZ = 0.01
|
||||
, cursorZ = 0.05
|
||||
, highlightZ = 0.03
|
||||
, cursorZ = 0.03
|
||||
, highlightZ = 0.05
|
||||
|
||||
, startX = 5
|
||||
, startY = 5
|
||||
@@ -126,8 +126,8 @@ struct
|
||||
, cursorOnCharB = 0.83
|
||||
|
||||
, charZ = 0.01
|
||||
, cursorZ = 0.05
|
||||
, highlightZ = 0.03
|
||||
, cursorZ = 0.03
|
||||
, highlightZ = 0.05
|
||||
|
||||
, startX = startX
|
||||
, startY = 5
|
||||
|
||||
@@ -15,12 +15,13 @@ struct
|
||||
val posY = posY + TC.ySpace
|
||||
val lineNumber = lineNumber + 1
|
||||
in
|
||||
skipToFirstVisibleColumn
|
||||
build
|
||||
( strPos
|
||||
, shd
|
||||
, stl
|
||||
, lhd
|
||||
, ltl
|
||||
, #startX env
|
||||
, posY
|
||||
, 0
|
||||
, lineNumber
|
||||
@@ -77,12 +78,13 @@ struct
|
||||
val posY = posY + TC.ySpace
|
||||
val lineNumber = lineNumber + 1
|
||||
in
|
||||
skipToFirstVisibleColumn
|
||||
build
|
||||
( newStrPos
|
||||
, str
|
||||
, stl
|
||||
, line
|
||||
, ltl
|
||||
, #startX env
|
||||
, posY
|
||||
, 0
|
||||
, lineNumber
|
||||
@@ -94,100 +96,6 @@ struct
|
||||
end
|
||||
end
|
||||
|
||||
and skipToFirstVisibleColumn
|
||||
( pos
|
||||
, str
|
||||
, stl
|
||||
, line
|
||||
, ltl
|
||||
, posY
|
||||
, column
|
||||
, lineNumber
|
||||
, absIdx
|
||||
, cursorIdx
|
||||
, env: Utils.env_data
|
||||
, acc
|
||||
) =
|
||||
if column = #scrollColumnStart env then
|
||||
(* return to build function *)
|
||||
build
|
||||
( pos
|
||||
, str
|
||||
, stl
|
||||
, line
|
||||
, ltl
|
||||
, #startX env
|
||||
, posY
|
||||
, column
|
||||
, lineNumber
|
||||
, absIdx
|
||||
, cursorIdx
|
||||
, env
|
||||
, acc
|
||||
)
|
||||
else if pos = String.size str then
|
||||
(* go to next node *)
|
||||
case (stl, ltl) of
|
||||
(shd :: stl, lhd :: ltl) =>
|
||||
skipToFirstVisibleColumn
|
||||
( 0
|
||||
, shd
|
||||
, stl
|
||||
, lhd
|
||||
, ltl
|
||||
, posY
|
||||
, column
|
||||
, lineNumber
|
||||
, absIdx
|
||||
, cursorIdx
|
||||
, env
|
||||
, acc
|
||||
)
|
||||
| (_, _) => acc
|
||||
else
|
||||
case String.sub (str, pos) of
|
||||
#"\n" =>
|
||||
let
|
||||
(* increment line lineNumber and posY,
|
||||
* and then call skipToFirstVisibleColumn recursively.
|
||||
* The recursive call check this condition:
|
||||
* Is the new column 0 the same as the column the scroll starts at?
|
||||
* If it is, then we call build, or else we continue skipping
|
||||
* until we reach the start column. *)
|
||||
val posY = posY + TC.ySpace
|
||||
val lineNumber = lineNumber + 1
|
||||
in
|
||||
skipToFirstVisibleColumn
|
||||
( pos + 1
|
||||
, str
|
||||
, stl
|
||||
, line
|
||||
, ltl
|
||||
, posY
|
||||
, 0
|
||||
, lineNumber
|
||||
, absIdx + 1
|
||||
, cursorIdx
|
||||
, env
|
||||
, acc
|
||||
)
|
||||
end
|
||||
| chr =>
|
||||
skipToFirstVisibleColumn
|
||||
( pos + 1
|
||||
, str
|
||||
, stl
|
||||
, line
|
||||
, ltl
|
||||
, posY
|
||||
, column + 1
|
||||
, lineNumber
|
||||
, absIdx + 1
|
||||
, cursorIdx
|
||||
, env
|
||||
, acc
|
||||
)
|
||||
|
||||
and build
|
||||
( pos
|
||||
, str
|
||||
@@ -222,62 +130,9 @@ struct
|
||||
, acc
|
||||
)
|
||||
| (_, _) => acc
|
||||
else if column < #scrollColumnStart env then
|
||||
skipToFirstVisibleColumn
|
||||
( pos
|
||||
, str
|
||||
, stl
|
||||
, line
|
||||
, ltl
|
||||
, posY
|
||||
, column
|
||||
, lineNumber
|
||||
, absIdx
|
||||
, cursorIdx
|
||||
, env
|
||||
, acc
|
||||
)
|
||||
else if column > #scrollColumnEnd env then
|
||||
skipToNextLine
|
||||
( pos
|
||||
, str
|
||||
, stl
|
||||
, line
|
||||
, ltl
|
||||
, posY
|
||||
, lineNumber
|
||||
, absIdx
|
||||
, cursorIdx
|
||||
, env
|
||||
, acc
|
||||
)
|
||||
else
|
||||
case String.sub (str, pos) of
|
||||
#" " =>
|
||||
let
|
||||
val acc =
|
||||
if absIdx = cursorIdx then
|
||||
Utils.makeCursor (posX, posY, env) :: acc
|
||||
else
|
||||
acc
|
||||
in
|
||||
build
|
||||
( pos + 1
|
||||
, str
|
||||
, stl
|
||||
, line
|
||||
, ltl
|
||||
, posX + TC.xSpace
|
||||
, posY
|
||||
, column + 1
|
||||
, lineNumber
|
||||
, absIdx + 1
|
||||
, cursorIdx
|
||||
, env
|
||||
, acc
|
||||
)
|
||||
end
|
||||
| #"\n" =>
|
||||
#"\n" =>
|
||||
let
|
||||
val acc =
|
||||
if absIdx = cursorIdx then
|
||||
@@ -306,15 +161,13 @@ struct
|
||||
, acc
|
||||
)
|
||||
end
|
||||
| chr =>
|
||||
| #" " =>
|
||||
let
|
||||
val acc =
|
||||
if absIdx = cursorIdx then
|
||||
let val acc = Utils.makeCursor (posX, posY, env) :: acc
|
||||
in Utils.makeCursorOnChr (chr, posX, posY, env) :: acc
|
||||
end
|
||||
Utils.makeCursor (posX, posY, env) :: acc
|
||||
else
|
||||
Utils.makeChr (chr, posX, posY, env) :: acc
|
||||
acc
|
||||
in
|
||||
build
|
||||
( pos + 1
|
||||
@@ -332,4 +185,61 @@ struct
|
||||
, acc
|
||||
)
|
||||
end
|
||||
| chr =>
|
||||
if column < #scrollColumnStart env then
|
||||
build
|
||||
( pos + 1
|
||||
, str
|
||||
, stl
|
||||
, line
|
||||
, ltl
|
||||
, #startX env
|
||||
, posY
|
||||
, column + 1
|
||||
, lineNumber
|
||||
, absIdx + 1
|
||||
, cursorIdx
|
||||
, env
|
||||
, acc
|
||||
)
|
||||
else if column > #scrollColumnEnd env then
|
||||
skipToNextLine
|
||||
( pos
|
||||
, str
|
||||
, stl
|
||||
, line
|
||||
, ltl
|
||||
, posY
|
||||
, lineNumber
|
||||
, absIdx
|
||||
, cursorIdx
|
||||
, env
|
||||
, acc
|
||||
)
|
||||
else
|
||||
let
|
||||
val acc =
|
||||
if absIdx = cursorIdx then
|
||||
let val acc = Utils.makeCursor (posX, posY, env) :: acc
|
||||
in Utils.makeCursorOnChr (chr, posX, posY, env) :: acc
|
||||
end
|
||||
else
|
||||
Utils.makeChr (chr, posX, posY, env) :: acc
|
||||
in
|
||||
build
|
||||
( pos + 1
|
||||
, str
|
||||
, stl
|
||||
, line
|
||||
, ltl
|
||||
, posX + TC.xSpace
|
||||
, posY
|
||||
, column + 1
|
||||
, lineNumber
|
||||
, absIdx + 1
|
||||
, cursorIdx
|
||||
, env
|
||||
, acc
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -15,12 +15,13 @@ struct
|
||||
val posY = posY + TC.ySpace
|
||||
val lineNumber = lineNumber + 1
|
||||
in
|
||||
skipToFirstVisibleColumn
|
||||
build
|
||||
( strPos
|
||||
, shd
|
||||
, stl
|
||||
, lhd
|
||||
, ltl
|
||||
, #startX env
|
||||
, posY
|
||||
, 0
|
||||
, lineNumber
|
||||
@@ -100,12 +101,13 @@ struct
|
||||
val posY = posY + TC.ySpace
|
||||
val lineNumber = lineNumber + 1
|
||||
in
|
||||
skipToFirstVisibleColumn
|
||||
build
|
||||
( newStrPos
|
||||
, str
|
||||
, stl
|
||||
, line
|
||||
, ltl
|
||||
, #startX env
|
||||
, posY
|
||||
, 0
|
||||
, lineNumber
|
||||
@@ -118,105 +120,6 @@ struct
|
||||
end
|
||||
end
|
||||
|
||||
and skipToFirstVisibleColumn
|
||||
( pos
|
||||
, str
|
||||
, stl
|
||||
, line
|
||||
, ltl
|
||||
, posY
|
||||
, column
|
||||
, lineNumber
|
||||
, absIdx
|
||||
, cursorIdx
|
||||
, env: Utils.env_data
|
||||
, acc
|
||||
, searchPos
|
||||
) =
|
||||
if column = #scrollColumnStart env then
|
||||
(* return to build function *)
|
||||
build
|
||||
( pos
|
||||
, str
|
||||
, stl
|
||||
, line
|
||||
, ltl
|
||||
, #startX env
|
||||
, posY
|
||||
, column
|
||||
, lineNumber
|
||||
, absIdx
|
||||
, cursorIdx
|
||||
, env
|
||||
, acc
|
||||
, searchPos
|
||||
)
|
||||
else if pos = String.size str then
|
||||
(* go to next node *)
|
||||
case (stl, ltl) of
|
||||
(shd :: stl, lhd :: ltl) =>
|
||||
skipToFirstVisibleColumn
|
||||
( 0
|
||||
, shd
|
||||
, stl
|
||||
, lhd
|
||||
, ltl
|
||||
, posY
|
||||
, column
|
||||
, lineNumber
|
||||
, absIdx
|
||||
, cursorIdx
|
||||
, env
|
||||
, acc
|
||||
, searchPos
|
||||
)
|
||||
| (_, _) => acc
|
||||
else
|
||||
case String.sub (str, pos) of
|
||||
#"\n" =>
|
||||
let
|
||||
(* increment line lineNumber and posY,
|
||||
* and then call skipToFirstVisibleColumn recursively.
|
||||
* The recursive call check this condition:
|
||||
* Is the new column 0 the same as the column the scroll starts at?
|
||||
* If it is, then we call build, or else we continue skipping
|
||||
* until we reach the start column. *)
|
||||
val posY = posY + TC.ySpace
|
||||
val lineNumber = lineNumber + 1
|
||||
in
|
||||
skipToFirstVisibleColumn
|
||||
( pos + 1
|
||||
, str
|
||||
, stl
|
||||
, line
|
||||
, ltl
|
||||
, posY
|
||||
, 0
|
||||
, lineNumber
|
||||
, absIdx + 1
|
||||
, cursorIdx
|
||||
, env
|
||||
, acc
|
||||
, searchPos
|
||||
)
|
||||
end
|
||||
| chr =>
|
||||
skipToFirstVisibleColumn
|
||||
( pos + 1
|
||||
, str
|
||||
, stl
|
||||
, line
|
||||
, ltl
|
||||
, posY
|
||||
, column + 1
|
||||
, lineNumber
|
||||
, absIdx + 1
|
||||
, cursorIdx
|
||||
, env
|
||||
, acc
|
||||
, searchPos
|
||||
)
|
||||
|
||||
and build
|
||||
( pos
|
||||
, str
|
||||
@@ -270,37 +173,6 @@ struct
|
||||
, searchPos
|
||||
)
|
||||
| (_, _) => acc
|
||||
else if column < #scrollColumnStart env then
|
||||
skipToFirstVisibleColumn
|
||||
( pos
|
||||
, str
|
||||
, stl
|
||||
, line
|
||||
, ltl
|
||||
, posY
|
||||
, column
|
||||
, lineNumber
|
||||
, absIdx
|
||||
, cursorIdx
|
||||
, env
|
||||
, acc
|
||||
, searchPos
|
||||
)
|
||||
else if column > #scrollColumnEnd env then
|
||||
skipToNextLine
|
||||
( pos
|
||||
, str
|
||||
, stl
|
||||
, line
|
||||
, ltl
|
||||
, posY
|
||||
, lineNumber
|
||||
, absIdx
|
||||
, cursorIdx
|
||||
, env
|
||||
, acc
|
||||
, searchPos
|
||||
)
|
||||
else
|
||||
let
|
||||
val searchPos = Utils.advanceSearchPos (absIdx, searchPos, env)
|
||||
@@ -380,24 +252,14 @@ struct
|
||||
)
|
||||
end
|
||||
| chr =>
|
||||
let
|
||||
val acc =
|
||||
if absIdx = cursorIdx then
|
||||
Utils.makeCursorOnChr (chr, posX, posY, env)
|
||||
:: Utils.makeCursor (posX, posY, env) :: acc
|
||||
else if Utils.isInSearchRange (absIdx, searchPos, env) then
|
||||
Utils.makeHighlightChr (chr, posX, posY, env)
|
||||
:: Utils.makeHighlight (posX, posY, env) :: acc
|
||||
else
|
||||
Utils.makeChr (chr, posX, posY, env) :: acc
|
||||
in
|
||||
if column < #scrollColumnStart env then
|
||||
build
|
||||
( pos + 1
|
||||
, str
|
||||
, stl
|
||||
, line
|
||||
, ltl
|
||||
, posX + TC.xSpace
|
||||
, #startX env
|
||||
, posY
|
||||
, column + 1
|
||||
, lineNumber
|
||||
@@ -407,6 +269,49 @@ struct
|
||||
, acc
|
||||
, searchPos
|
||||
)
|
||||
end
|
||||
else if column > #scrollColumnEnd env then
|
||||
skipToNextLine
|
||||
( pos
|
||||
, str
|
||||
, stl
|
||||
, line
|
||||
, ltl
|
||||
, posY
|
||||
, lineNumber
|
||||
, absIdx
|
||||
, cursorIdx
|
||||
, env
|
||||
, acc
|
||||
, searchPos
|
||||
)
|
||||
else
|
||||
let
|
||||
val acc =
|
||||
if absIdx = cursorIdx then
|
||||
Utils.makeCursorOnChr (chr, posX, posY, env)
|
||||
:: Utils.makeCursor (posX, posY, env) :: acc
|
||||
else if Utils.isInSearchRange (absIdx, searchPos, env) then
|
||||
Utils.makeHighlightChr (chr, posX, posY, env)
|
||||
:: Utils.makeHighlight (posX, posY, env) :: acc
|
||||
else
|
||||
Utils.makeChr (chr, posX, posY, env) :: acc
|
||||
in
|
||||
build
|
||||
( pos + 1
|
||||
, str
|
||||
, stl
|
||||
, line
|
||||
, ltl
|
||||
, posX + TC.xSpace
|
||||
, posY
|
||||
, column + 1
|
||||
, lineNumber
|
||||
, absIdx + 1
|
||||
, cursorIdx
|
||||
, env
|
||||
, acc
|
||||
, searchPos
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user