1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
package cointop
import (
"sort"
"sync"
"github.com/miguelmota/gocui"
)
var sortlock sync.Mutex
// Sort sorts the list of coins
func (ct *Cointop) Sort(sortBy string, desc bool, list []*Coin, renderHeaders bool) {
ct.debuglog("sort()")
sortlock.Lock()
defer sortlock.Unlock()
ct.State.sortBy = sortBy
ct.State.sortDesc = desc
if list == nil {
return
}
if len(list) < 2 {
return
}
sort.Slice(list[:], func(i, j int) bool {
if ct.State.sortDesc {
i, j = j, i
}
a := list[i]
b := list[j]
if a == nil {
return true
}
if b == nil {
return false
}
switch sortBy {
case "rank":
return a.Rank < b.Rank
case "name":
return a.Name < b.Name
case "symbol":
return a.Symbol < b.Symbol
case "price":
return a.Price < b.Price
case "holdings":
return a.Holdings < b.Holdings
case "balance":
return a.Balance < b.Balance
case "market_cap":
return a.MarketCap < b.MarketCap
case "24h_volume":
return a.Volume24H < b.Volume24H
case "1h_change":
return a.PercentChange1H < b.PercentChange1H
case "24h_change":
return a.PercentChange24H < b.PercentChange24H
case "7d_change":
return a.PercentChange7D < b.PercentChange7D
case "30d_change":
return a.PercentChange30D < b.PercentChange30D
case "total_supply":
return a.TotalSupply < b.TotalSupply
case "available_supply":
return a.AvailableSupply < b.AvailableSupply
case "last_updated":
return a.LastUpdated < b.LastUpdated
default:
return a.Rank < b.Rank
}
})
if renderHeaders {
ct.UpdateTableHeader()
}
}
// SortAsc sorts list of coins in ascending order
func (ct *Cointop) SortAsc() error {
ct.debuglog("sortAsc()")
ct.State.sortDesc = false
ct.UpdateTable()
return nil
}
// SortDesc sorts list of coins in descending order
func (ct *Cointop) SortDesc() error {
ct.debuglog("sortDesc()")
ct.State.sortDesc = true
ct.UpdateTable()
return nil
}
// SortPrevCol sorts the previous column
func (ct *Cointop) SortPrevCol() error {
ct.debuglog("sortPrevCol()")
i := ct.GetSortColIndex()
k := i - 1
if k < 0 {
k = 0
}
nextsortBy := ct.TableColumnOrder[k]
ct.Sort(nextsortBy, ct.State.sortDesc, ct.State.coins, true)
ct.UpdateTable()
return nil
}
// SortNextCol sorts the next column
func (ct *Cointop) SortNextCol() error {
ct.debuglog("sortNextCol()")
l := len(ct.TableColumnOrder)
i := ct.GetSortColIndex()
k := i + 1
if k > l-1 {
k = l - 1
}
nextsortBy := ct.TableColumnOrder[k]
ct.Sort(nextsortBy, ct.State.sortDesc, ct.State.coins, true)
ct.UpdateTable()
return nil
}
// SortToggle toggles the sort order
func (ct *Cointop) SortToggle(sortBy string, desc bool) error {
ct.debuglog("sortToggle()")
if ct.State.sortBy == sortBy {
desc = !ct.State.sortDesc
}
ct.Sort(sortBy, desc, ct.State.coins, true)
ct.UpdateTable()
return nil
}
// Sortfn returns the sort function as a wrapped gocui keybinding function
func (ct *Cointop) Sortfn(sortBy string, desc bool) func(g *gocui.Gui, v *gocui.View) error {
ct.debuglog("sortfn()")
return func(g *gocui.Gui, v *gocui.View) error {
return ct.SortToggle(sortBy, desc)
}
}
// GetSortColIndex gets the sort column index
func (ct *Cointop) GetSortColIndex() int {
ct.debuglog("getSortColIndex()")
for i, col := range ct.TableColumnOrder {
if ct.State.sortBy == col {
return i
}
}
return 0
}
|