diff --git a/README.md b/README.md
index 2388503..b6f6405 100644
--- a/README.md
+++ b/README.md
@@ -309,6 +309,7 @@ Key|Action
Enter|Toggle chart for highlighted coin
Esc|Quit view
Space|Toggle coin as favorite
+Tab|Move down or next page
Ctrl+c|Quit application
Ctrl+d|Jump page down (vim inspired)
Ctrl+f|Search
@@ -488,6 +489,7 @@ refresh_rate = 60
r = "sort_column_rank"
s = "sort_column_symbol"
space = "toggle_favorite"
+ tab = "move_down_or_next_page"
t = "sort_column_total_supply"
u = "sort_column_last_updated"
v = "sort_column_24h_volume"
@@ -526,6 +528,8 @@ Action|Description
`move_to_page_visible_middle_row`|Move to middle visible row on page
`move_up`|Move one row up
`move_down`|Move one row down
+`move_down_or_next_page`|Move one row down or to next page if at last row
+`move_up_or_previous_page`|Move one row up or to previous page if at first row
`next_chart_range`|Select next chart date range (e.g. 3D → 7D)
`next_page`|Go to next page
`open_link`|Open row link
diff --git a/cointop/keybindings.go b/cointop/keybindings.go
index 31c1c03..c0bf5ec 100644
--- a/cointop/keybindings.go
+++ b/cointop/keybindings.go
@@ -337,6 +337,10 @@ func (ct *Cointop) keybindings(g *gocui.Gui) error {
fn = ct.keyfn(ct.EnlargeChart)
case "shorten_chart":
fn = ct.keyfn(ct.ShortenChart)
+ case "move_down_or_next_page":
+ fn = ct.keyfn(ct.CursorDownOrNextPage)
+ case "move_up_or_previous_page":
+ fn = ct.keyfn(ct.CursorUpOrPreviousPage)
default:
fn = ct.keyfn(ct.noop)
}
diff --git a/cointop/navigation.go b/cointop/navigation.go
index 9e6f7f5..3e66359 100644
--- a/cointop/navigation.go
+++ b/cointop/navigation.go
@@ -169,6 +169,7 @@ func (ct *Cointop) navigateFirstLine() error {
if err := ct.Views.Table.Backing().SetCursor(cx, 0); err != nil {
return err
}
+
ct.RowChanged()
return nil
}
@@ -195,6 +196,7 @@ func (ct *Cointop) navigateLastLine() error {
if err := ct.Views.Table.Backing().SetCursor(cx, sy-1); err != nil {
return err
}
+
ct.RowChanged()
return nil
}
@@ -286,6 +288,24 @@ func (ct *Cointop) nextPage() error {
return nil
}
+func (ct *Cointop) nextPageTop() error {
+ ct.debuglog("nextPageTop()")
+
+ ct.nextPage()
+ ct.navigateFirstLine()
+
+ return nil
+}
+
+func (ct *Cointop) prevPageTop() error {
+ ct.debuglog("prevtPageTop()")
+
+ ct.prevPage()
+ ct.navigateLastLine()
+
+ return nil
+}
+
func (ct *Cointop) firstPage() error {
ct.debuglog("firstPage()")
@@ -326,7 +346,7 @@ func (ct *Cointop) isFirstPage() bool {
func (ct *Cointop) isLastPage() bool {
ct.debuglog("isLastPage()")
- return ct.State.page == ct.totalPages()
+ return ct.State.page == ct.totalPages()-1
}
func (ct *Cointop) isPageFirstLine() bool {
@@ -408,3 +428,47 @@ func (ct *Cointop) highlightRow(idx int) error {
return nil
}
+
+// CursorDownOrNextPage ...
+func (ct *Cointop) CursorDownOrNextPage() error {
+ ct.debuglog("CursorDownOrNextPage()")
+ if ct.isLastRow() {
+ if ct.isLastPage() {
+ return nil
+ }
+
+ if err := ct.nextPageTop(); err != nil {
+ return err
+ }
+
+ return nil
+ }
+
+ if err := ct.cursorDown(); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+// CursorUpOrPreviousPage ...
+func (ct *Cointop) CursorUpOrPreviousPage() error {
+ ct.debuglog("CursorUpOrPreviousPage()")
+ if ct.isFirstRow() {
+ if ct.isFirstPage() {
+ return nil
+ }
+
+ if err := ct.prevPageTop(); err != nil {
+ return err
+ }
+
+ return nil
+ }
+
+ if err := ct.cursorUp(); err != nil {
+ return err
+ }
+
+ return nil
+}
diff --git a/cointop/shortcuts.go b/cointop/shortcuts.go
index d1d0b53..2499275 100644
--- a/cointop/shortcuts.go
+++ b/cointop/shortcuts.go
@@ -13,6 +13,7 @@ func DefaultShortcuts() map[string]string {
"enter": "toggle_row_chart",
"esc": "quit_view",
"space": "toggle_favorite",
+ "tab": "move_down_or_next_page",
"ctrl+c": "quit",
"ctrl+C": "quit",
"ctrl+d": "page_down",