1
1
mirror of https://github.com/walles/moar.git synced 2024-11-30 12:42:26 +03:00

Modify input lines rendering API

Make the rendering function return both the lines and the clipped
first-line-number value.
This commit is contained in:
Johan Walles 2021-05-30 11:36:07 +02:00
parent c4e8562c7c
commit 002d4e40af
2 changed files with 12 additions and 15 deletions

View File

@ -164,14 +164,10 @@ func (p *Pager) _Redraw(spinner string) {
wrapLongLines: p.WrapLongLines, wrapLongLines: p.WrapLongLines,
} }
// If we're asking for past-the-end lines, the Reader will clip for us,
// and we should adapt to that. Otherwise if you scroll 100 lines past
// the end, you'll then have to scroll 100 lines up again before the
// display starts scrolling visibly.
p.firstLineOneBased = screenLines.firstLineOneBased()
var screenLineNumber int var screenLineNumber int
for lineNumber, row := range screenLines.getScreenLines(p.searchPattern) { var renderedScreenLines [][]twin.Cell
renderedScreenLines, p.firstLineOneBased = screenLines.renderScreenLines(p.searchPattern)
for lineNumber, row := range renderedScreenLines {
screenLineNumber = lineNumber screenLineNumber = lineNumber
for column, cell := range row { for column, cell := range row {
p.screen.SetCell(column, screenLineNumber, cell) p.screen.SetCell(column, screenLineNumber, cell)

View File

@ -19,7 +19,11 @@ type ScreenLines struct {
wrapLongLines bool wrapLongLines bool
} }
func (sl *ScreenLines) getScreenLines(searchPattern *regexp.Regexp) [][]twin.Cell { // Render screen lines into an array of lines consisting of Cells.
//
// The second return value is the same as firstInputLineOneBased, but clipped if
// needed so that the end of the input is visible.
func (sl *ScreenLines) renderScreenLines(searchPattern *regexp.Regexp) ([][]twin.Cell, int) {
// Count the length of the last line number // Count the length of the last line number
// //
// Offsets figured out through trial-and-error... // Offsets figured out through trial-and-error...
@ -39,7 +43,7 @@ func (sl *ScreenLines) getScreenLines(searchPattern *regexp.Regexp) [][]twin.Cel
returnLines := make([][]twin.Cell, 0, sl.height) returnLines := make([][]twin.Cell, 0, sl.height)
screenFull := false screenFull := false
for lineIndex, line := range sl.inputLines.lines { for lineIndex, line := range sl.inputLines.lines {
lineNumber := sl.firstLineOneBased() + lineIndex lineNumber := sl.inputLines.firstLineOneBased + lineIndex
highlighted := line.HighlightedTokens(searchPattern) highlighted := line.HighlightedTokens(searchPattern)
var wrapped [][]twin.Cell var wrapped [][]twin.Cell
@ -71,7 +75,9 @@ func (sl *ScreenLines) getScreenLines(searchPattern *regexp.Regexp) [][]twin.Cel
} }
} }
return returnLines // FIXME: We can't just use firstInputLineOneBased, in the presence of
// wrapped lines that number can be too low.
return returnLines, sl.firstInputLineOneBased
} }
func (sl *ScreenLines) createScreenLine(lineNumberToShow *int, numberPrefixLength int, contents []twin.Cell) []twin.Cell { func (sl *ScreenLines) createScreenLine(lineNumberToShow *int, numberPrefixLength int, contents []twin.Cell) []twin.Cell {
@ -145,8 +151,3 @@ func createLineNumberPrefix(fileLineNumber *int, numberPrefixLength int) []twin.
return lineNumberPrefix return lineNumberPrefix
} }
func (sl *ScreenLines) firstLineOneBased() int {
// FIXME: This is wrong when wrapping is enabled
return sl.inputLines.firstLineOneBased
}