diff --git a/internal/config/default_config.yaml b/internal/config/default_config.yaml index 1b001ca..6c3ae93 100644 --- a/internal/config/default_config.yaml +++ b/internal/config/default_config.yaml @@ -60,6 +60,10 @@ keybindings: scroll_up: "pgup" scroll_down: "pgdown" send_to_diff: "ctrl+d" + goto_top: "home" + goto_bottom: "G,end" + prev_page: "[" + next_page: "]" intercept: forward: "f" diff --git a/internal/config/keybindings.go b/internal/config/keybindings.go index 9cc7466..f22a9d5 100644 --- a/internal/config/keybindings.go +++ b/internal/config/keybindings.go @@ -16,6 +16,10 @@ type GlobalKeys struct { ScrollUp string `mapstructure:"scroll_up"` ScrollDown string `mapstructure:"scroll_down"` SendToDiff string `mapstructure:"send_to_diff"` + GotoTop string `mapstructure:"goto_top"` + GotoBottom string `mapstructure:"goto_bottom"` + PrevPage string `mapstructure:"prev_page"` + NextPage string `mapstructure:"next_page"` } type InterceptKeys struct { diff --git a/internal/keys/global.go b/internal/keys/global.go index 2d704c5..07775c2 100644 --- a/internal/keys/global.go +++ b/internal/keys/global.go @@ -22,6 +22,10 @@ type GlobalKeyMap struct { ScrollUp key.Binding ScrollDown key.Binding SendToDiff key.Binding + GotoTop key.Binding + GotoBottom key.Binding + PrevPage key.Binding + NextPage key.Binding } func newGlobalKeyMap(cfg config.GlobalKeys) GlobalKeyMap { @@ -42,6 +46,10 @@ func newGlobalKeyMap(cfg config.GlobalKeys) GlobalKeyMap { ScrollUp: binding(cfg.ScrollUp, "scroll up"), ScrollDown: binding(cfg.ScrollDown, "scroll down"), SendToDiff: binding(cfg.SendToDiff, "send to diff"), + GotoTop: binding(cfg.GotoTop, "go to top"), + GotoBottom: binding(cfg.GotoBottom, "go to bottom"), + PrevPage: binding(cfg.PrevPage, "prev page"), + NextPage: binding(cfg.NextPage, "next page"), } } @@ -52,6 +60,7 @@ func (g GlobalKeyMap) Bindings() []key.Binding { g.OpenLogs, g.ToggleSidebar, g.CopyAs, g.Copy, g.SendToReplay, g.SendToDiff, g.ScrollUp, g.ScrollDown, + g.GotoTop, g.GotoBottom, g.PrevPage, g.NextPage, } } diff --git a/internal/ui/findings/update.go b/internal/ui/findings/update.go index a48da9c..74471b2 100644 --- a/internal/ui/findings/update.go +++ b/internal/ui/findings/update.go @@ -81,6 +81,49 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { step = 1 } m.bodyViewport.SetYOffset(m.bodyViewport.YOffset() + step) + case key.Matches(msg, g.GotoTop): + m.cursor = 0 + m.pager.Page = 0 + m.refreshListViewport() + m.refreshBody() + + case key.Matches(msg, g.GotoBottom): + if len(m.findings) > 0 { + m.cursor = len(m.findings) - 1 + m.pager.Page = m.pager.TotalPages - 1 + m.refreshListViewport() + m.refreshBody() + } + + case key.Matches(msg, g.PrevPage): + step := m.pager.PerPage + if step < 1 { + step = 1 + } + m.cursor -= step + if m.cursor < 0 { + m.cursor = 0 + } + m.pager.Page = m.cursor / m.pager.PerPage + m.refreshListViewport() + m.refreshBody() + + case key.Matches(msg, g.NextPage): + step := m.pager.PerPage + if step < 1 { + step = 1 + } + m.cursor += step + if m.cursor >= len(m.findings) { + m.cursor = len(m.findings) - 1 + if m.cursor < 0 { + m.cursor = 0 + } + } + m.pager.Page = m.cursor / m.pager.PerPage + m.refreshListViewport() + m.refreshBody() + case key.Matches(msg, g.Help): m.help.ShowAll = !m.help.ShowAll m.recalcSizes() diff --git a/internal/ui/history/update.go b/internal/ui/history/update.go index 91608fe..dfeee03 100644 --- a/internal/ui/history/update.go +++ b/internal/ui/history/update.go @@ -271,6 +271,55 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case key.Matches(msg, g.Right): m.bodyViewport.ScrollRight(6) + case key.Matches(msg, g.GotoTop): + m.cursor = 0 + m.pager.Page = 0 + m.refreshListViewport() + m.refreshBody() + m.bodyViewport.SetYOffset(0) + m.bodyViewport.SetXOffset(0) + + case key.Matches(msg, g.GotoBottom): + if len(m.entries) > 0 { + m.cursor = len(m.entries) - 1 + m.pager.Page = m.pager.TotalPages - 1 + m.refreshListViewport() + m.refreshBody() + m.bodyViewport.SetYOffset(0) + m.bodyViewport.SetXOffset(0) + } + + case key.Matches(msg, g.PrevPage): + step := m.pager.PerPage + if step < 1 { + step = 1 + } + m.cursor -= step + if m.cursor < 0 { + m.cursor = 0 + } + m.refreshListViewport() + m.refreshBody() + m.bodyViewport.SetYOffset(0) + m.bodyViewport.SetXOffset(0) + + case key.Matches(msg, g.NextPage): + step := m.pager.PerPage + if step < 1 { + step = 1 + } + m.cursor += step + if m.cursor >= len(m.entries) { + m.cursor = len(m.entries) - 1 + if m.cursor < 0 { + m.cursor = 0 + } + } + m.refreshListViewport() + m.refreshBody() + m.bodyViewport.SetYOffset(0) + m.bodyViewport.SetXOffset(0) + case key.Matches(msg, keys.Keys.Global.Help): m.help.ShowAll = !m.help.ShowAll m.recalcSizes() diff --git a/internal/ui/intercept/update.go b/internal/ui/intercept/update.go index b26a710..b40c89f 100644 --- a/internal/ui/intercept/update.go +++ b/internal/ui/intercept/update.go @@ -146,9 +146,6 @@ func (m Model) updateNormalMode(msg tea.KeyPressMsg, cmds *[]tea.Cmd) (tea.Model case key.Matches(msg, keys.Keys.Global.Right): m.bodyViewport.ScrollRight(6) - case key.Matches(msg, keys.Keys.Global.Quit): - return m, tea.Quit - case key.Matches(msg, keys.Keys.Intercept.UndoEdits): if onResponses { if len(m.responseQueue) > 0 { @@ -268,6 +265,30 @@ func (m Model) updateNormalMode(msg tea.KeyPressMsg, cmds *[]tea.Cmd) (tea.Model return diffUI.SendToDiffMsg{Label: label, Raw: raw} } } + + case key.Matches(msg, keys.Keys.Global.GotoTop): + if onResponses { + m.responseCursor = 0 + } else { + m.cursor = 0 + } + m.refreshListViewport() + m.refreshResponseListViewport() + m.refreshBody() + + case key.Matches(msg, keys.Keys.Global.GotoBottom): + if onResponses { + if len(m.responseQueue) > 0 { + m.responseCursor = len(m.responseQueue) - 1 + } + } else { + if len(m.queue) > 0 { + m.cursor = len(m.queue) - 1 + } + } + m.refreshListViewport() + m.refreshResponseListViewport() + m.refreshBody() } return m, tea.Batch(*cmds...)