diff --git a/fcore/buffer.sml b/fcore/buffer.sml index 61cd986..117bbb5 100644 --- a/fcore/buffer.sml +++ b/fcore/buffer.sml @@ -4,14 +4,12 @@ struct * char-wrap is a similar concept to word-wrap, * but it breaks on character in the middle of a word. * Todo: - * - Let caller know which termination case was reached. - * Did we reach the end of the string or did we exhaust the screen space? * - Possibly add visual horizontal indentation when char-wrap occurs * on an indented line *) fun buildTextString ( pos, str, acc, posX, posY, startX , windowWidth, windowHeight, fWindowWidth, fWindowHeight - , r, g, b + , r, g, b, tl ) = if pos < String.size str then case String.sub (str, pos) of @@ -19,18 +17,18 @@ struct (* if space, then proceed forward one char * without adding to acc *) buildTextString - ( pos + 1, str, acc, posX + 25, posY, startX - , windowWidth, windowHeight, fWindowWidth, fWindowHeight - , r, g, b - ) + ( pos + 1, str, acc, posX + 25, posY, startX + , windowWidth, windowHeight, fWindowWidth, fWindowHeight + , r, g, b, tl + ) | #"\t" => (* if tab, proceed forward one char, * and jump visually forwards three chars *) buildTextString - ( pos + 1, str, acc, posX + 75, posY, startX - , windowWidth, windowHeight, fWindowWidth, fWindowHeight - , r, g, b - ) + ( pos + 1, str, acc, posX + 75, posY, startX + , windowWidth, windowHeight, fWindowWidth, fWindowHeight + , r, g, b, tl + ) | #"\n" => (* if \n, move down vertically, and move to start horizontally * assuming we have not exceeded the window's height. @@ -39,9 +37,10 @@ struct buildTextString ( pos + 1, str, acc, startX, posY + 25, startX , windowWidth, windowHeight, fWindowWidth, fWindowHeight - , r, g, b + , r, g, b, tl ) else + (* return if there is no more vertical space after line break *) acc | #"\r" => (* same as \n, except we also check if we are in a \r\n pair, @@ -50,19 +49,20 @@ struct if pos < String.size str - 1 andalso String.sub (str, pos + 1) = #"\n" - then + then buildTextString ( pos + 2, str, acc, startX, posY + 25, startX , windowWidth, windowHeight, fWindowWidth, fWindowHeight - , r, g, b + , r, g, b, tl ) - else + else buildTextString ( pos + 1, str, acc, startX, posY + 25, startX , windowWidth, windowHeight, fWindowWidth, fWindowHeight - , r, g, b + , r, g, b, tl ) else + (* return if there is no more vertical space after line break *) acc | chr => (* for any other character, add it to acc if there is space, @@ -80,7 +80,7 @@ struct buildTextString ( pos + 1, str, acc, posX + 25, posY, startX , windowWidth, windowHeight, fWindowWidth, fWindowHeight - , r, g, b + , r, g, b, tl ) end else if posY + 25 < windowHeight then @@ -96,13 +96,51 @@ struct buildTextString ( pos + 1, str, acc, startX + 25, posY + 25, startX , windowWidth, windowHeight, fWindowWidth, fWindowHeight - , r, g, b + , r, g, b, tl ) end else - (* if no space horizontally or vertically, just return *) + (* return if no space horizontally or vertically *) acc end else - acc + (* if we reached the end of the string, + * call function to build next string *) + continueBuildTextLineGap + ( tl, acc, posX, posY, startX + , windowWidth, windowHeight, fWindowWidth, fWindowWidth + , r, g, b + ) + + and continueBuildTextLineGap + ( strList, acc, posX, posY, startX + , windowWidth, windowHeight, fWindowWidth, fWindowHeight + , r, g, b + ) = + case strList of + hd :: tl => + buildTextString + ( 0, hd, acc, posX, posY, startX + , windowWidth, windowHeight, fWindowWidth, fWindowHeight + , r, g, b, tl + ) + | [] => acc + + (* todo: + * before calling continueBuildTextLineGap, + * find start position inside LineGap + * to start building from *) + fun startBuildTextLineGap (startLine, lineGap: LineGap.t, windowWidth, windowHeight) = + let + val acc = + continueBuildTextLineGap + ( #rightStrings lineGap, [], 10, 10, 10 + , windowWidth, windowHeight + , Real32.fromInt windowWidth + , Real32.fromInt windowHeight + , 0.0, 0.0, 0.0 + ) + in + Vector.concat acc + end end diff --git a/shf b/shf index e008281..1307237 100755 Binary files a/shf and b/shf differ