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()
)