From d56fc26d8dec61575cdeb7df08359c67a89c6e1d Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Thu, 13 Apr 2023 15:45:58 -0400 Subject: [PATCH] feat(ui): navigate to top/botton of readme and files --- ui/components/code/code.go | 11 ++++++++- ui/keymap/keymap.go | 48 ++++++++++++++++++++++++++++---------- ui/pages/repo/files.go | 5 ++-- ui/pages/repo/readme.go | 2 ++ 4 files changed, 51 insertions(+), 15 deletions(-) diff --git a/ui/components/code/code.go b/ui/components/code/code.go index 8b442db8209023b34cc2167f43477ef0a16a2286..44aec42f84d3a681de75fff5150f5205f3ef7a75 100644 --- a/ui/components/code/code.go +++ b/ui/components/code/code.go @@ -6,6 +6,7 @@ import ( "sync" "github.com/alecthomas/chroma/lexers" + "github.com/charmbracelet/bubbles/key" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/glamour" gansi "github.com/charmbracelet/glamour/ansi" @@ -98,10 +99,18 @@ func (r *Code) Init() tea.Cmd { // Update implements tea.Model. func (r *Code) Update(msg tea.Msg) (tea.Model, tea.Cmd) { cmds := make([]tea.Cmd, 0) - switch msg.(type) { + switch msg := msg.(type) { case tea.WindowSizeMsg: // Recalculate content width and line wrap. cmds = append(cmds, r.Init()) + case tea.KeyMsg: + // Viewport doesn't handle these keys, so we do it here. + switch { + case key.Matches(msg, r.common.KeyMap.GotoTop): + r.GotoTop() + case key.Matches(msg, r.common.KeyMap.GotoBottom): + r.GotoBottom() + } } v, cmd := r.Viewport.Update(msg) r.Viewport = v.(*vp.Viewport) diff --git a/ui/keymap/keymap.go b/ui/keymap/keymap.go index cf2cc2f74c166b0c628360b379c845613f79d3e9..ae09eaad7344c615d91fd92c92c1b36d634341a1 100644 --- a/ui/keymap/keymap.go +++ b/ui/keymap/keymap.go @@ -4,18 +4,20 @@ import "github.com/charmbracelet/bubbles/key" // KeyMap is a map of key bindings for the UI. type KeyMap struct { - Quit key.Binding - Up key.Binding - Down key.Binding - UpDown key.Binding - LeftRight key.Binding - Arrows key.Binding - Select key.Binding - Section key.Binding - Back key.Binding - PrevPage key.Binding - NextPage key.Binding - Help key.Binding + Quit key.Binding + Up key.Binding + Down key.Binding + UpDown key.Binding + LeftRight key.Binding + Arrows key.Binding + GotoTop key.Binding + GotoBottom key.Binding + Select key.Binding + Section key.Binding + Back key.Binding + PrevPage key.Binding + NextPage key.Binding + Help key.Binding SelectItem key.Binding BackItem key.Binding @@ -103,6 +105,28 @@ func DefaultKeyMap() *KeyMap { ), ) + km.GotoTop = key.NewBinding( + key.WithKeys( + "home", + "g", + ), + key.WithHelp( + "g/home", + "goto top", + ), + ) + + km.GotoBottom = key.NewBinding( + key.WithKeys( + "end", + "G", + ), + key.WithHelp( + "G/end", + "goto bottom", + ), + ) + km.Select = key.NewBinding( key.WithKeys( "enter", diff --git a/ui/pages/repo/files.go b/ui/pages/repo/files.go index a281c1e879c932daacae7c8491d9e3966687b4bb..f519c558602aaf3169063e50df739b03557b13b4 100644 --- a/ui/pages/repo/files.go +++ b/ui/pages/repo/files.go @@ -131,9 +131,9 @@ func (f *Files) ShortHelp() []key.Binding { // FullHelp implements help.KeyMap. func (f *Files) FullHelp() [][]key.Binding { b := make([][]key.Binding, 0) + copyKey := f.common.KeyMap.Copy switch f.activeView { case filesViewFiles: - copyKey := f.common.KeyMap.Copy copyKey.SetHelp("c", "copy name") k := f.selector.KeyMap b = append(b, []key.Binding{ @@ -154,7 +154,6 @@ func (f *Files) FullHelp() [][]key.Binding { }, }...) case filesViewContent: - copyKey := f.common.KeyMap.Copy copyKey.SetHelp("c", "copy content") k := f.code.KeyMap b = append(b, []key.Binding{ @@ -171,6 +170,8 @@ func (f *Files) FullHelp() [][]key.Binding { lc := []key.Binding{ k.Down, k.Up, + f.common.KeyMap.GotoTop, + f.common.KeyMap.GotoBottom, copyKey, } lexer := lexers.Match(f.currentContent.ext) diff --git a/ui/pages/repo/readme.go b/ui/pages/repo/readme.go index 2743a9f831927f0714b39eb7f1caa9abe1fbfbec..48cf849f24e017e0be445e844afebae780de8c62 100644 --- a/ui/pages/repo/readme.go +++ b/ui/pages/repo/readme.go @@ -62,6 +62,8 @@ func (r *Readme) FullHelp() [][]key.Binding { { k.Down, k.Up, + r.common.KeyMap.GotoTop, + r.common.KeyMap.GotoBottom, }, } return b