diff --git a/fcore/normal-mode/normal-search-finish.sml b/fcore/normal-mode/normal-search-finish.sml index 4845889..8bab34f 100644 --- a/fcore/normal-mode/normal-search-finish.sml +++ b/fcore/normal-mode/normal-search-finish.sml @@ -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 = diff --git a/fcore/text-builder.sml b/fcore/text-builder.sml deleted file mode 100644 index 592caac..0000000 --- a/fcore/text-builder.sml +++ /dev/null @@ -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 diff --git a/fcore/text-builder/search-bar.sml b/fcore/text-builder/search-bar.sml new file mode 100644 index 0000000..b4ef5ea --- /dev/null +++ b/fcore/text-builder/search-bar.sml @@ -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 diff --git a/fcore/text-builder/text-builder-utils.sml b/fcore/text-builder/text-builder-utils.sml index 08a140c..f2d5bd0 100644 --- a/fcore/text-builder/text-builder-utils.sml +++ b/fcore/text-builder/text-builder-utils.sml @@ -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 diff --git a/shf.mlb b/shf.mlb index 7fd3f4f..759c80d 100644 --- a/shf.mlb +++ b/shf.mlb @@ -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