diff --git a/fcore/normal-mode/normal-finish.sml b/fcore/normal-mode/normal-finish.sml index 23bce07..95dd165 100644 --- a/fcore/normal-mode/normal-finish.sml +++ b/fcore/normal-mode/normal-finish.sml @@ -14,6 +14,10 @@ struct let val {windowWidth, windowHeight, startLine, searchString, ...} = app + (* calculate scroll column *) + val buffer = LineGap.goToIdx (cursorIdx, buffer) + val visualScrollColumn = TextScroll.getScrollColumn (buffer, cursorIdx, windowWidth) + (* move LineGap to first line displayed on screen *) val buffer = LineGap.goToLine (startLine, buffer) diff --git a/fcore/text-constants.sml b/fcore/text-constants.sml index 372b0c3..63d333c 100644 --- a/fcore/text-constants.sml +++ b/fcore/text-constants.sml @@ -4,5 +4,7 @@ struct val xSpace3 = xSpace * 3 val ySpace = 25 val scale: Real32.real = 2.0 - val textLineWidth = xSpace * 80 + + val textLineCount = 80 + val textLineWidth = xSpace * textLineCount end diff --git a/fcore/text-scroll.sml b/fcore/text-scroll.sml new file mode 100644 index 0000000..be2842c --- /dev/null +++ b/fcore/text-scroll.sml @@ -0,0 +1,22 @@ +structure TextScroll = +struct + structure TC = TextConstants + + (* Preqreuisite: move buffer to cursorIdx *) + fun getScrollColumn (buffer, cursorIdx, windowWidth) = + let + val startOfLine = Cursor.vi0 (buffer, cursorIdx) + val columnDifference = cursorIdx - startOfLine + in + if columnDifference = 0 then + 0 + else + let + val howManyColumnsCanWeFit = + if windowWidth >= TC.textLineWidth then TC.textLineCount + else windowWidth div TC.xSpace + in + columnDifference mod howManyColumnsCanWeFit + end + end +end diff --git a/shf.mlb b/shf.mlb index 8932029..de980ec 100644 --- a/shf.mlb +++ b/shf.mlb @@ -40,6 +40,7 @@ in end fcore/cursor.sml fcore/text-window.sml +fcore/text-scroll.sml fcore/normal-mode/normal-finish.sml fcore/normal-mode/normal-search-finish.sml