diff --git a/ui/pager.go b/ui/pager.go index 177ce08..a9a0224 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -28,6 +28,9 @@ const ( ) var ( + // Whether or not to use fast scroll-based rendering for the viewport + highPerformanceRendering = true + pagerHelpHeight = strings.Count(pagerHelpView(0), "\n") noteHeading = te.String(noteHeadingText). @@ -101,10 +104,15 @@ func newPagerModel(glamourStyle string) pagerModel { ti.CharLimit = noteCharacterLimit ti.Focus() + vp := viewport.Model{} + vp.YPosition = 0 + vp.HighPerformanceRendering = highPerformanceRendering + return pagerModel{ state: pagerStateBrowse, glamourStyle: glamourStyle, textInput: ti, + viewport: vp, } } @@ -113,6 +121,8 @@ func (m *pagerModel) setSize(w, h int) { m.height = h m.viewport.Width = w m.viewport.Height = h - statusBarHeight + m.viewport.YPosition = 0 + m.viewport.Height = h - statusBarHeight m.textInput.Width = w - len(noteHeadingText) - len(notePromptText) - 1 if m.showHelp { @@ -135,7 +145,6 @@ func (m *pagerModel) unload() { } m.state = pagerStateBrowse m.viewport.SetContent("") - m.viewport.Y = 0 m.textInput.Reset() } @@ -190,13 +199,14 @@ func pagerUpdate(msg tea.Msg, m pagerModel) (pagerModel, tea.Cmd) { return m, textinput.Blink(m.textInput) case "?": m.toggleHeight() + cmds = append(cmds, viewport.Sync(m.viewport)) } } // Glow has rendered the content case contentRenderedMsg: m.setContent(string(msg)) - return m, nil + cmds = append(cmds, viewport.Sync(m.viewport)) // We've reveived terminal dimensions, either for the first time or // after a resize diff --git a/ui/ui.go b/ui/ui.go index 62c1fa8..aa417e7 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -149,6 +149,9 @@ func update(msg tea.Msg, mdl tea.Model) (tea.Model, tea.Cmd) { case stateShowDocument: if m.pager.state == pagerStateBrowse { m.unloadDocument() // exits pager + if m.pager.viewport.HighPerformanceRendering { + cmd = tea.ClearScrollArea + } } else { m.pager, cmd = pagerUpdate(msg, m.pager) }