diff --git a/README.md b/README.md index 231a60e..fdfbf6b 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,6 @@ - Advanced search - "Favorites" list -- Coin charts - Currency conversion (i.e. Euro, Yen) - Markets/Exchanges - CryptoCompare API @@ -88,6 +87,7 @@ Key|Action 2|Sort table by *[2]4 hour change* 7|Sort table by *[7] day change* a|Sort table by *[a]vailable supply* +c|Toggle [c]hart for highlighted coin g|Go to first line of page (vim style) G|Go to last line of page (vim style) h|Go to previous page (vim style) diff --git a/cointop/chart.go b/cointop/chart.go index e1e3b27..5de5204 100644 --- a/cointop/chart.go +++ b/cointop/chart.go @@ -2,18 +2,17 @@ package cointop import ( "fmt" - "log" "time" "github.com/gizak/termui" + "github.com/jroimartin/gocui" "github.com/miguelmota/cointop/pkg/color" ) func (ct *Cointop) updateChart() error { maxX := ct.Width() - if len(ct.chartpoints) == 0 { - ct.chartPoints(maxX, "bitcoin") - } + coin := ct.selectedCoinName() + ct.chartPoints(maxX, coin) for i := range ct.chartpoints { var s string @@ -38,23 +37,25 @@ func (ct *Cointop) chartPoints(maxX int, coin string) error { start := secs - oneWeek end := secs - _ = coin - //graphData, err := cmc.GetCoinGraphData(coin, start, end) - graphData, err := ct.api.GetGlobalMarketGraphData(start, end) - if err != nil { - log.Fatal(err) - return nil - } - var data []float64 - /* + if coin == "" { + graphData, err := ct.api.GetGlobalMarketGraphData(start, end) + if err != nil { + return nil + } + for i := range graphData.MarketCapByAvailableSupply { + data = append(data, graphData.MarketCapByAvailableSupply[i][1]/1E9) + } + } else { + graphData, err := ct.api.GetCoinGraphData(coin, start, end) + if err != nil { + return nil + } for i := range graphData.PriceUSD { data = append(data, graphData.PriceUSD[i][1]) } - */ - for i := range graphData.MarketCapByAvailableSupply { - data = append(data, graphData.MarketCapByAvailableSupply[i][1]/1E9) } + chart.Data = data termui.Body = termui.NewGrid() termui.Body.Width = maxX @@ -83,3 +84,27 @@ func (ct *Cointop) chartPoints(maxX int, coin string) error { ct.chartpoints = points return nil } + +func (ct *Cointop) selectedCoinName() string { + coin := ct.selectedcoin + if coin != nil { + return coin.Name + } + + return "" +} + +func (ct *Cointop) toggleCoinChart(g *gocui.Gui, v *gocui.View) error { + highlightedcoin := ct.highlightedRowCoin() + if ct.selectedcoin == highlightedcoin { + ct.selectedcoin = nil + } else { + ct.selectedcoin = highlightedcoin + } + ct.Update(func() { + ct.chartview.Clear() + ct.updateMarketbar() + ct.updateChart() + }) + return nil +} diff --git a/cointop/cointop.go b/cointop/cointop.go index 71f328a..a03037e 100644 --- a/cointop/cointop.go +++ b/cointop/cointop.go @@ -42,6 +42,7 @@ type Cointop struct { refreshmux sync.Mutex refreshticker *time.Ticker forcerefresh chan bool + selectedcoin *apt.Coin } // Run runs cointop diff --git a/cointop/keybindings.go b/cointop/keybindings.go index ee2744c..6e337e8 100644 --- a/cointop/keybindings.go +++ b/cointop/keybindings.go @@ -34,6 +34,7 @@ func (ct *Cointop) keybindings(g *gocui.Gui) error { ct.setKeybinding('2', ct.sortfn("24hchange", true)) ct.setKeybinding('7', ct.sortfn("7dchange", true)) ct.setKeybinding('a', ct.sortfn("availablesupply", true)) + ct.setKeybinding('c', ct.toggleCoinChart) ct.setKeybinding('g', ct.navigateFirstLine) ct.setKeybinding('G', ct.navigateLastLine) ct.setKeybinding('h', ct.prevPage) diff --git a/cointop/marketbar.go b/cointop/marketbar.go index e1d3d6c..3062989 100644 --- a/cointop/marketbar.go +++ b/cointop/marketbar.go @@ -15,25 +15,28 @@ func (ct *Cointop) updateMarketbar() error { return err } timeframe := "7 Day" + chartname := ct.selectedCoinName() + if chartname == "" { + chartname = "Global" + } ct.Update(func() { ct.marketview.Clear() fmt.Fprintln( ct.marketview, - color.White( - pad.Right( - fmt.Sprintf( - "%s Chart: %s • Total Market Cap: %s • 24H Volume: %s • BTC Dominance: %.2f%% • Active Currencies: %s • Active Markets: %s", - color.Cyan("cointop"), - timeframe, - humanize.Commaf(market.TotalMarketCapUSD), - humanize.Commaf(market.Total24HVolumeUSD), - market.BitcoinPercentageOfMarketCap, - humanize.Commaf(float64(market.ActiveCurrencies)), - humanize.Commaf(float64(market.ActiveMarkets)), - ), - maxX, - " ", + pad.Right( + fmt.Sprintf( + "%s [ Chart: %s %s ] Global ▶ Market Cap: %s • 24H Volume: %s • BTC Dominance: %.2f%% • Active Currencies: %s • Active Markets: %s", + fmt.Sprintf("%s%s%s%s", color.Green("❯"), color.Cyan("❯"), color.Green("❯"), color.Cyan("cointop")), + color.Cyan(chartname), + timeframe, + humanize.Commaf(market.TotalMarketCapUSD), + humanize.Commaf(market.Total24HVolumeUSD), + market.BitcoinPercentageOfMarketCap, + humanize.Commaf(float64(market.ActiveCurrencies)), + humanize.Commaf(float64(market.ActiveMarkets)), ), + maxX, + " ", ), ) }) diff --git a/cointop/statusbar.go b/cointop/statusbar.go index fbe82e3..808dfe8 100644 --- a/cointop/statusbar.go +++ b/cointop/statusbar.go @@ -12,7 +12,8 @@ func (ct *Cointop) updateStatusbar(s string) { ct.statusbarview.Clear() currpage := ct.getCurrentPage() totalpages := ct.getTotalPages() - fmt.Fprintln(ct.statusbarview, pad.Right(fmt.Sprintf("[q]uit [?]help [← →]page %v/%v %s", currpage, totalpages, s), maxX, " ")) + base := "[q]uit [?]help [c]hart" + fmt.Fprintln(ct.statusbarview, pad.Right(fmt.Sprintf("%v [← →]page %v/%v %s", base, currpage, totalpages, s), maxX, " ")) }) } diff --git a/cointop/table.go b/cointop/table.go index 808be34..5863d13 100644 --- a/cointop/table.go +++ b/cointop/table.go @@ -86,7 +86,7 @@ func (ct *Cointop) refreshTable() error { return nil } -func (ct *Cointop) selectedRowIndex() int { +func (ct *Cointop) highlightedRowIndex() int { _, y := ct.tableview.Origin() _, cy := ct.tableview.Cursor() idx := y + cy @@ -99,13 +99,13 @@ func (ct *Cointop) selectedRowIndex() int { return idx } -func (ct *Cointop) selectedCoin() *apt.Coin { - idx := ct.selectedRowIndex() +func (ct *Cointop) highlightedRowCoin() *apt.Coin { + idx := ct.highlightedRowIndex() return ct.coins[idx] } func (ct *Cointop) rowLink() string { - slug := strings.ToLower(strings.Replace(ct.selectedCoin().Name, " ", "-", -1)) + slug := strings.ToLower(strings.Replace(ct.highlightedRowCoin().Name, " ", "-", -1)) return fmt.Sprintf("https://coinmarketcap.com/currencies/%s", slug) } diff --git a/pkg/api/cmc/cmc.go b/pkg/api/cmc/cmc.go index acf334b..5f2c976 100644 --- a/pkg/api/cmc/cmc.go +++ b/pkg/api/cmc/cmc.go @@ -1,6 +1,8 @@ package api import ( + "strings" + types "github.com/miguelmota/cointop/pkg/api/types" cmc "github.com/miguelmota/go-coinmarketcap" ) @@ -45,7 +47,7 @@ func (s *Service) GetAllCoinData() (map[string]types.Coin, error) { // GetCoinGraphData gets coin graph data func (s *Service) GetCoinGraphData(coin string, start int64, end int64) (types.CoinGraph, error) { ret := types.CoinGraph{} - graphData, err := cmc.GetCoinGraphData(coin, start, end) + graphData, err := cmc.GetCoinGraphData(strings.ToLower(coin), start, end) if err != nil { return ret, err } diff --git a/pkg/color/color.go b/pkg/color/color.go index f117e33..8188aa8 100644 --- a/pkg/color/color.go +++ b/pkg/color/color.go @@ -8,15 +8,19 @@ var ( // White color White = color.New(color.FgWhite).SprintFunc() // WhiteBold bold - WhiteBold = color.New(color.FgWhite & color.Bold).SprintFunc() + WhiteBold = color.New(color.FgWhite, color.Bold).SprintFunc() // Green color Green = color.New(color.FgGreen).SprintFunc() + // GreenBg color + GreenBg = color.New(color.BgGreen, color.FgBlack).SprintFunc() // Red color Red = color.New(color.FgRed).SprintFunc() // Cyan color Cyan = color.New(color.FgCyan).SprintFunc() // CyanBg color - CyanBg = color.New(color.BgCyan).SprintFunc() + CyanBg = color.New(color.BgCyan, color.FgBlack).SprintFunc() + // Blue color + Blue = color.New(color.FgBlue).SprintFunc() // BlueBg color BlueBg = color.New(color.BgBlue).SprintFunc() )