when text is wide enough to be centered, also centre the search bar

This commit is contained in:
2025-09-14 09:14:22 +01:00
parent 4bc6c54951
commit 428208f9bf
5 changed files with 137 additions and 120 deletions

View File

@@ -27,37 +27,16 @@ struct
val searchStringPosY = windowHeight - TextConstants.ySpace - 5
val initialTextAcc = TextBuilder.buildLineToList
val initialTextAcc = SearchBar.build
( searchString
, 5
, searchStringPosY
, windowWidth
, floatWindowWidth
, floatWindowHeight
, searchCursorIdx
)
val cursor =
let
val xpos = TextConstants.xSpace * (searchCursorIdx + 1) + 5
val x = Real32.fromInt xpos
val y = Real32.fromInt searchStringPosY
val r: Real32.real = 0.67
val g: Real32.real = 0.51
val b: Real32.real = 0.83
in
PipeCursor.lerp
( x
, y
, 0.01
, TextConstants.scale
, floatWindowWidth
, floatWindowHeight
, r
, g
, b
)
end
val buffer = LineGap.goToIdx (cursorIdx, buffer)
val cursorLine = LineGap.getLineNumberOfIdx (cursorIdx, buffer)
val startLine =
@@ -77,7 +56,7 @@ struct
, tempSearchList
, searchString
, visualScrollColumn
, cursor :: initialTextAcc
, initialTextAcc
)
val drawMsg = Vector.concat drawMsg
val drawMsg = DrawMsg.DRAW_TEXT drawMsg
@@ -109,13 +88,14 @@ struct
val searchStringPosY = newWindowHeight - TextConstants.ySpace - 5
val initialTextAcc = TextBuilder.buildLineToList
val initialTextAcc = SearchBar.build
( searchString
, 5
, searchStringPosY
, newWindowWidth
, floatWindowWidth
, floatWindowHeight
, searchCursorIdx
)
val cursor =

View File

@@ -1,91 +0,0 @@
structure TextBuilder =
struct
structure TC = TextConstants
structure Utils = TextBuilderUtils
local
fun loop
(pos, str, posX, posY, endX, acc, floatWindowWidth, floatWindowHeight) =
if pos = String.size str then
acc
else if posX + TC.xSpace >= endX then
acc
else
let
val chr = String.sub (str, pos)
val r: Real32.real = 0.67
val g: Real32.real = 0.51
val b: Real32.real = 0.83
val fPosX = Real32.fromInt posX
val fPosY = Real32.fromInt posY
val z: Real32.real = 0.1
val chr = CozetteAscii.make
( chr
, fPosX
, fPosY
, z
, TC.scale
, floatWindowWidth
, floatWindowHeight
, r
, g
, b
)
val acc = chr :: acc
val nextPosX = posX + TC.xSpace
in
loop
( pos + 1
, str
, nextPosX
, posY
, endX
, acc
, floatWindowWidth
, floatWindowHeight
)
end
in
(* builds a single text line from a string.
* Used for getting Real32.real vector representing search input.
* Todo: Add | cursor to show position of search-string-cursor. *)
fun buildLineToList
(str, startX, startY, endX, floatWindowWidth, floatWindowHeight) =
let
val r: Real32.real = 0.67
val g: Real32.real = 0.51
val b: Real32.real = 0.83
val fPosX = Real32.fromInt startX
val fPosY = Real32.fromInt startY
val z: Real32.real = 0.1
val chr = CozetteAscii.make
( #"/"
, fPosX
, fPosY
, z
, TC.scale
, floatWindowWidth
, floatWindowHeight
, r
, g
, b
)
val posX = startX + TC.xSpace
in
loop
( 0
, str
, posX
, startY
, endX
, [chr]
, floatWindowWidth
, floatWindowHeight
)
end
end
end

View File

@@ -0,0 +1,128 @@
structure SearchBar =
struct
structure TC = TextConstants
structure Utils = TextBuilderUtils
fun loop
(pos, str, posX, posY, endX, acc, floatWindowWidth, floatWindowHeight) =
if pos = String.size str then
acc
else if posX >= endX then
acc
else
let
val chr = String.sub (str, pos)
val r: Real32.real = 0.67
val g: Real32.real = 0.51
val b: Real32.real = 0.83
val fPosX = Real32.fromInt posX
val fPosY = Real32.fromInt posY
val z: Real32.real = 0.1
val chr = CozetteAscii.make
( chr
, fPosX
, fPosY
, z
, TC.scale
, floatWindowWidth
, floatWindowHeight
, r
, g
, b
)
val acc = chr :: acc
val nextPosX = posX + TC.xSpace
in
loop
( pos + 1
, str
, nextPosX
, posY
, endX
, acc
, floatWindowWidth
, floatWindowHeight
)
end
(* builds a single text line from a string.
* Used for getting Real32.real vector representing search input.
* Todo: add scrolling, so that text scrolls horizontally when greater than width. *)
fun build
( str
, startX
, startY
, endX
, floatWindowWidth
, floatWindowHeight
, searchCursorIdx
) =
let
val r: Real32.real = 0.67
val g: Real32.real = 0.51
val b: Real32.real = 0.83
val z: Real32.real = 0.1
val width = endX - startX
val (startX, endX) =
if TC.textLineWidth > width then
(startX, endX)
else
let
val startX = (width - TC.textLineWidth) div 2
val endX = startX + TC.textLineWidth
in
(startX, endX)
end
val fPosX = Real32.fromInt startX
val fPosY = Real32.fromInt startY
val slash = CozetteAscii.make
( #"/"
, fPosX
, fPosY
, z
, TC.scale
, floatWindowWidth
, floatWindowHeight
, r
, g
, b
)
val cursor =
let
val xpos = TextConstants.xSpace * (searchCursorIdx + 1) + startX
val xpos = Int.min (endX, xpos)
val x = Real32.fromInt xpos
in
PipeCursor.lerp
( x
, fPosY
, 0.01
, TextConstants.scale
, floatWindowWidth
, floatWindowHeight
, r
, g
, b
)
end
val posX = startX + TC.xSpace
in
loop
( 0
, str
, posX
, startY
, endX
, [cursor, slash]
, floatWindowWidth
, floatWindowHeight
)
end
end

View File

@@ -90,8 +90,8 @@ struct
, cursorZ = 0.03
, highlightZ = 0.05
, startX = 5
, startY = 5
, startX = startX
, startY = startX
, scrollColumnStart = visualScrollColumn
, scrollColumnEnd = width div TC.xSpace + visualScrollColumn
@@ -105,7 +105,7 @@ struct
}
else
let
val startX = (endX - TC.textLineWidth) div 2
val startX = (width - TC.textLineWidth) div 2
in
{ charR = 0.67
, charG = 0.51

View File

@@ -41,7 +41,7 @@ fcore/text-builder/text-builder-utils.sml
fcore/text-builder/text-builder-with-cursor.sml
fcore/text-builder/text-builder-with-highlight.sml
fcore/text-builder/normal-mode-text-builder.sml
fcore/text-builder.sml
fcore/text-builder/search-bar.sml
fcore/cursor.sml
fcore/text-scroll.sml