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

@@ -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