diff options
Diffstat (limited to 'src/terminal.go')
-rw-r--r-- | src/terminal.go | 44 |
1 files changed, 30 insertions, 14 deletions
diff --git a/src/terminal.go b/src/terminal.go index 3fab90fd..9fa11212 100644 --- a/src/terminal.go +++ b/src/terminal.go @@ -1295,18 +1295,37 @@ func (t *Terminal) renderPreviewSpinner() { } } -func (t *Terminal) renderPreviewText(unchanged bool) { - maxWidth := t.pwindow.Width() - lineNo := -t.previewer.offset - height := t.pwindow.Height() +func (t *Terminal) renderPreviewArea(unchanged bool) { if unchanged { - t.pwindow.MoveAndClear(0, 0) + t.pwindow.MoveAndClear(0, 0) // Clear scroll offset display } else { t.previewed.filled = false t.pwindow.Erase() } + + height := t.pwindow.Height() + header := []string{} + body := t.previewer.lines + headerLines := t.previewOpts.headerLines + // Do not enable preview header lines if it's value is too large + if headerLines > 0 && headerLines < util.Min(len(body), height) { + header = t.previewer.lines[0:headerLines] + body = t.previewer.lines[headerLines:] + // Always redraw header + t.renderPreviewText(height, header, 0, false) + t.pwindow.MoveAndClear(t.pwindow.Y(), 0) + } + t.renderPreviewText(height, body, -t.previewer.offset+headerLines, unchanged) + + if !unchanged { + t.pwindow.FinishFill() + } +} + +func (t *Terminal) renderPreviewText(height int, lines []string, lineNo int, unchanged bool) { + maxWidth := t.pwindow.Width() var ansi *ansiState - for _, line := range t.previewer.lines { + for _, line := range lines { var lbg tui.Color = -1 if ansi != nil { ansi.lbg = -1 @@ -1354,9 +1373,6 @@ func (t *Terminal) renderPreviewText(unchanged bool) { } lineNo++ } - if !unchanged { - t.pwindow.FinishFill() - } } func (t *Terminal) printPreview() { @@ -1369,7 +1385,7 @@ func (t *Terminal) printPreview() { t.previewer.version == t.previewed.version && t.previewer.offset == t.previewed.offset t.previewer.scrollable = t.previewer.offset > 0 || numLines > height - t.renderPreviewText(unchanged) + t.renderPreviewArea(unchanged) t.renderPreviewSpinner() t.previewed.numLines = numLines t.previewed.version = t.previewer.version @@ -1382,7 +1398,7 @@ func (t *Terminal) printPreviewDelayed() { } t.previewer.scrollable = false - t.renderPreviewText(true) + t.renderPreviewArea(true) message := t.trimMessage("Loading ..", t.pwindow.Width()) pos := t.pwindow.Width() - len(message) @@ -1929,7 +1945,7 @@ func (t *Terminal) Loop() { cmd := util.ExecCommand(command, true) if pwindow != nil { height := pwindow.Height() - initialOffset = util.Max(0, t.evaluateScrollOffset(items, height)) + initialOffset = util.Max(0, t.evaluateScrollOffset(items, util.Max(0, height-t.previewOpts.headerLines))) env := os.Environ() lines := fmt.Sprintf("LINES=%d", height) columns := fmt.Sprintf("COLUMNS=%d", pwindow.Width()) @@ -2132,7 +2148,7 @@ func (t *Terminal) Loop() { if t.previewer.following { t.previewer.offset = len(t.previewer.lines) - t.pwindow.Height() } else if result.offset >= 0 { - t.previewer.offset = util.Constrain(result.offset, 0, len(t.previewer.lines)-1) + t.previewer.offset = util.Constrain(result.offset, t.previewOpts.headerLines, len(t.previewer.lines)-1) } t.printPreview() case reqPreviewRefresh: @@ -2205,7 +2221,7 @@ func (t *Terminal) Loop() { if t.previewOpts.cycle { newOffset = (newOffset + numLines) % numLines } - newOffset = util.Constrain(newOffset, 0, numLines-1) + newOffset = util.Constrain(newOffset, t.previewOpts.headerLines, numLines-1) if t.previewer.offset != newOffset { t.previewer.offset = newOffset req(reqPreviewRefresh) |