diff --git a/fcore/app-update.sml b/fcore/app-update.sml index 9be7621..2f1a553 100644 --- a/fcore/app-update.sml +++ b/fcore/app-update.sml @@ -21,27 +21,18 @@ struct fun moveRight (app: app_type) = let - (* todo: proper implementation of moveRight - * currently, we also retrieve the newCursorIdx improperly. - * To do it properly, we have to look inside LineGap - * instead of just incrementing cursorIdx by 1. - * So: - * - Find newCursorIdx from LineGap - * *) - val {buffer, windowWidth, windowHeight, startLine, cursorIdx} = app (* move LineGap to cursorIdx, which is necessary for finding newCursorIdx *) - val newBuffer = LineGap.goToIdx (cursorIdx, buffer) - (* todo: call to retrieve newCursorIdx should be below *) - val newCursorIdx = cursorIdx + 1 + val buffer = LineGap.goToIdx (cursorIdx, buffer) + val cursorIdx = Cursor.viL (buffer, cursorIdx) (* move LineGap to first line displayed on screen, and build new text *) - val newBuffer = LineGap.goToLine (startLine, newBuffer) + val buffer = LineGap.goToLine (startLine, buffer) val drawMsg = TextBuilder.build - (startLine, cursorIdx, newBuffer, windowWidth, windowHeight) + (startLine, cursorIdx, buffer, windowWidth, windowHeight) - val newApp = AppWith.bufferAndCursorIdx (app, newBuffer, newCursorIdx) + val newApp = AppWith.bufferAndCursorIdx (app, buffer, cursorIdx) in (newApp, drawMsg) end diff --git a/fcore/cursor.sml b/fcore/cursor.sml new file mode 100644 index 0000000..708dd02 --- /dev/null +++ b/fcore/cursor.sml @@ -0,0 +1,30 @@ +structure Cursor = +struct + (* Prerequisite: lineGap is moved to requested idx first *) + fun viL (lineGap: LineGap.t, cursorIdx) = + let + val {rightStrings, idx = bufferIdx, ...} = lineGap + in + case rightStrings of + hd :: tl => + let + (* idx relative to this string *) + val strIdx = cursorIdx - bufferIdx + in + if strIdx < String.size hd - 2 then + (* increment if there is a character after where cursor is *) + cursorIdx + 1 + else + (case tl of + _ :: _ => + (* if there is another string after current head, we can increment cursorIdx *) + bufferIdx + String.size hd - 1 + | _ => + (* if there is no string after current head, return original cursorIdx *) + cursorIdx) + end + | [] => + (* return original cursorIdx if there is nothing to the right *) + cursorIdx + end +end diff --git a/shell/shell.sml b/shell/shell.sml index 5922a6d..80cc9ba 100644 --- a/shell/shell.sml +++ b/shell/shell.sml @@ -44,7 +44,7 @@ struct val _ = Gles3.loadGlad () (* load file intol gap buffer and create initial app *) - val io = TextIO.openIn "fcore/text-builder.sml" + val io = TextIO.openIn "temp.txt" val lineGap = ioToLineGap (io, LineGap.empty) val _ = TextIO.closeIn io val app = AppType.init (lineGap, 1920, 1080) diff --git a/shf b/shf index a8709fa..8bfd395 100755 Binary files a/shf and b/shf differ diff --git a/shf.mlb b/shf.mlb index 4131f39..4cc3913 100644 --- a/shf.mlb +++ b/shf.mlb @@ -16,6 +16,7 @@ ann in fcore/text-builder.sml end +fcore/cursor.sml fcore/app-update.sml (* IMPERATIVE SHELL *) diff --git a/temp.txt b/temp.txt new file mode 100644 index 0000000..31fbbaa --- /dev/null +++ b/temp.txt @@ -0,0 +1,6 @@ +signature TEXT_BUILDER = +sig + (* Prerequisite: LineGap is moved to requested line first. *) + val build: int * int * LineGap.t * int * int + -> MailboxType.t list +enda