2
0
mirror of https://github.com/miguelmota/cointop synced 2024-11-05 00:00:14 +00:00

Add flag to hide marketbar, statusbar, or chart view and add flag to only show the table. Closes #27

This commit is contained in:
Miguel Mota 2019-06-25 21:42:07 -07:00
parent 434db031ee
commit 22e5e5a201
No known key found for this signature in database
GPG Key ID: 67EC1161588A00F9
9 changed files with 162 additions and 52 deletions

View File

@ -9,7 +9,7 @@ version:
commit_rev:
@echo $(COMMIT_REV)
run:
start:
go run main.go
deps:

View File

@ -809,6 +809,22 @@ Frequently asked questions:
- A: Sometimes the coin APIs will make updates and break things. If you see this problem please [submit an issue](https://github.com/miguelmota/cointop/issues/new).
- Q: How can run cointop with just the table?
- A: Run cointop with the `--only-table` flag.
- Q: How can I hide the top marketbar?
- A: Run cointop with the `--hide-marketbar` flag.
- Q: How can I hide the chart?
- A: Run cointop with the `--hide-chart` flag.
- Q: How can I hide the bottom statusbar?
- A: Run cointop with the `--hide-statusbar` flag.
- Q: How can I delete the cache?
- A: Run `cointop -clean` to delete the cache files. Cointop will generate new cache files after fetching data.

View File

@ -9,18 +9,23 @@ import (
// Run ...
func Run() {
var v, ver, test, clean, reset bool
var v, ver, test, clean, reset, hideMarketbar, hideChart, hideStatusbar, onlyTable bool
var config, cmcAPIKey, apiChoice, colorscheme string
flag.BoolVar(&v, "v", false, "Version")
flag.BoolVar(&ver, "version", false, "Version")
flag.BoolVar(&test, "test", false, "Run test")
flag.BoolVar(&clean, "clean", false, "Clean cache")
flag.BoolVar(&reset, "reset", false, "Reset config")
flag.BoolVar(&hideMarketbar, "hide-marketbar", false, "Hide marketbar")
flag.BoolVar(&hideChart, "hide-chart", false, "Hide chart view")
flag.BoolVar(&hideStatusbar, "hide-statusbar", false, "Hide statusbar")
flag.BoolVar(&onlyTable, "only-table", false, "Show only the table")
flag.StringVar(&config, "config", "", "Config filepath")
flag.StringVar(&cmcAPIKey, "coinmarketcap-api-key", "", "CoinMarketCap API key")
flag.StringVar(&apiChoice, "api", cointop.CoinGecko, "API choice")
flag.StringVar(&colorscheme, "colorscheme", "", "Colorscheme name")
flag.Parse()
if v || ver {
fmt.Printf("cointop v%s", cointop.Version())
} else if test {
@ -35,6 +40,10 @@ func Run() {
CoinMarketCapAPIKey: cmcAPIKey,
APIChoice: apiChoice,
Colorscheme: colorscheme,
HideMarketbar: hideMarketbar,
HideChart: hideChart,
HideStatusbar: hideStatusbar,
OnlyTable: onlyTable,
}).Run()
}
}

View File

@ -15,6 +15,10 @@ var chartlock sync.Mutex
var chartpointslock sync.Mutex
func (ct *Cointop) updateChart() error {
if ct.chartview == nil {
return nil
}
chartlock.Lock()
defer chartlock.Unlock()

View File

@ -93,6 +93,10 @@ type Cointop struct {
defaultView string
apiKeys *apiKeys
limiter <-chan time.Time
hideMarketbar bool
hideChart bool
hideStatusbar bool
onlyTable bool
}
// CoinMarketCap is API choice
@ -119,6 +123,10 @@ type Config struct {
ConfigFilepath string
CoinMarketCapAPIKey string
NoPrompts bool
HideMarketbar bool
HideChart bool
HideStatusbar bool
OnlyTable bool
}
// apiKeys is api keys structure
@ -220,6 +228,10 @@ func NewCointop(config *Config) *Cointop {
inputviewname: "input",
apiKeys: new(apiKeys),
limiter: time.Tick(2 * time.Second),
hideMarketbar: config.HideMarketbar,
hideChart: config.HideChart,
hideStatusbar: config.HideStatusbar,
onlyTable: config.OnlyTable,
}
err := ct.setupConfig()

View File

@ -1,6 +1,8 @@
package cointop
import (
"strconv"
fcolor "github.com/fatih/color"
gocui "github.com/jroimartin/gocui"
xtermcolor "github.com/tomnomnom/xtermcolor"
@ -337,6 +339,17 @@ func (c *Colorscheme) toGocuiAttr(v string) (gocui.Attribute, bool) {
}
func hexToAnsi(h string) (uint8, bool) {
if h == "" {
return 0, false
}
n, err := strconv.Atoi(h)
if err == nil {
if n <= 255 {
return uint8(n), true
}
}
code, err := xtermcolor.FromHexStr(h)
if err != nil {
return 0, false
@ -344,3 +357,5 @@ func hexToAnsi(h string) (uint8, bool) {
return code, true
}
// gocui can use xterm colors

View File

@ -10,43 +10,69 @@ import (
// layout sets initial layout
func (ct *Cointop) layout(g *gocui.Gui) error {
maxX, maxY := ct.size()
chartHeight := 10
topOffset := 0
if v, err := g.SetView(ct.marketbarviewname, 0, topOffset, maxX, 2); err != nil {
if err != gocui.ErrUnknownView {
return err
}
ct.marketbarview = v
ct.marketbarview.Frame = false
ct.colorscheme.SetViewColor(ct.marketbarview, "marketbar")
go func() {
ct.updateMarketbar()
_, found := ct.cache.Get(ct.marketbarviewname)
if found {
ct.cache.Delete(ct.marketbarviewname)
ct.updateMarketbar()
}
}()
marketbarHeight := 1
chartHeight := 10
statusbarHeight := 1
if ct.onlyTable {
ct.hideMarketbar = true
ct.hideChart = true
ct.hideStatusbar = true
}
topOffset = topOffset + 1
if v, err := g.SetView(ct.chartviewname, 0, topOffset, maxX, topOffset+chartHeight+1); err != nil {
if err != gocui.ErrUnknownView {
return err
}
ct.chartview = v
ct.chartview.Frame = false
ct.colorscheme.SetViewColor(ct.chartview, "chart")
go func() {
ct.updateChart()
cachekey := strings.ToLower(fmt.Sprintf("%s_%s", "globaldata", strings.Replace(ct.selectedchartrange, " ", "", -1)))
_, found := ct.cache.Get(cachekey)
if found {
ct.cache.Delete(cachekey)
ct.updateChart()
if ct.hideMarketbar {
marketbarHeight = 0
}
if ct.hideChart {
chartHeight = 0
}
if ct.hideStatusbar {
statusbarHeight = 0
}
if !ct.hideMarketbar {
if v, err := g.SetView(ct.marketbarviewname, 0, topOffset, maxX, 2); err != nil {
if err != gocui.ErrUnknownView {
return err
}
}()
ct.marketbarview = v
ct.marketbarview.Frame = false
ct.colorscheme.SetViewColor(ct.marketbarview, "marketbar")
go func() {
ct.updateMarketbar()
_, found := ct.cache.Get(ct.marketbarviewname)
if found {
ct.cache.Delete(ct.marketbarviewname)
ct.updateMarketbar()
}
}()
}
}
topOffset = topOffset + marketbarHeight
if !ct.hideChart {
if v, err := g.SetView(ct.chartviewname, 0, topOffset, maxX, topOffset+chartHeight+marketbarHeight); err != nil {
if err != gocui.ErrUnknownView {
return err
}
ct.chartview = v
ct.chartview.Frame = false
ct.colorscheme.SetViewColor(ct.chartview, "chart")
go func() {
ct.updateChart()
cachekey := strings.ToLower(fmt.Sprintf("%s_%s", "globaldata", strings.Replace(ct.selectedchartrange, " ", "", -1)))
_, found := ct.cache.Get(cachekey)
if found {
ct.cache.Delete(cachekey)
ct.updateChart()
}
}()
}
}
topOffset = topOffset + chartHeight
@ -61,7 +87,7 @@ func (ct *Cointop) layout(g *gocui.Gui) error {
}
topOffset = topOffset + 1
if v, err := g.SetView(ct.tableviewname, 0, topOffset, ct.maxtablewidth, maxY-1); err != nil {
if v, err := g.SetView(ct.tableviewname, 0, topOffset, ct.maxtablewidth, maxY-statusbarHeight); err != nil {
if err != gocui.ErrUnknownView {
return err
}
@ -79,14 +105,16 @@ func (ct *Cointop) layout(g *gocui.Gui) error {
}()
}
if v, err := g.SetView(ct.statusbarviewname, 0, maxY-2, ct.maxtablewidth, maxY); err != nil {
if err != gocui.ErrUnknownView {
return err
if !ct.hideStatusbar {
if v, err := g.SetView(ct.statusbarviewname, 0, maxY-2, ct.maxtablewidth, maxY); err != nil {
if err != gocui.ErrUnknownView {
return err
}
ct.statusbarview = v
ct.statusbarview.Frame = false
ct.colorscheme.SetViewColor(ct.statusbarview, "statusbar")
go ct.updateStatusbar("")
}
ct.statusbarview = v
ct.statusbarview.Frame = false
ct.colorscheme.SetViewColor(ct.statusbarview, "statusbar")
go ct.updateStatusbar("")
}
if v, err := g.SetView(ct.searchfieldviewname, 0, maxY-2, ct.maxtablewidth, maxY); err != nil {
@ -100,7 +128,7 @@ func (ct *Cointop) layout(g *gocui.Gui) error {
ct.colorscheme.SetViewColor(ct.searchfield, "searchbar")
}
if v, err := g.SetView(ct.helpviewname, 1, 1, ct.maxtablewidth-2, maxY-1); err != nil {
if v, err := g.SetView(ct.helpviewname, 1, 1, ct.maxtablewidth-1, maxY-1); err != nil {
if err != gocui.ErrUnknownView {
return err
}
@ -109,7 +137,7 @@ func (ct *Cointop) layout(g *gocui.Gui) error {
ct.colorscheme.SetViewColor(ct.helpview, "menu")
}
if v, err := g.SetView(ct.portfolioupdatemenuviewname, 1, 1, ct.maxtablewidth-2, maxY-1); err != nil {
if v, err := g.SetView(ct.portfolioupdatemenuviewname, 1, 1, ct.maxtablewidth-1, maxY-1); err != nil {
if err != gocui.ErrUnknownView {
return err
}
@ -129,7 +157,7 @@ func (ct *Cointop) layout(g *gocui.Gui) error {
ct.colorscheme.SetViewColor(ct.inputview, "menu")
}
if v, err := g.SetView(ct.convertmenuviewname, 1, 1, ct.maxtablewidth-2, maxY-1); err != nil {
if v, err := g.SetView(ct.convertmenuviewname, 1, 1, ct.maxtablewidth-1, maxY-1); err != nil {
if err != gocui.ErrUnknownView {
return err
}

View File

@ -13,6 +13,10 @@ import (
)
func (ct *Cointop) updateMarketbar() error {
if ct.marketbarview == nil {
return nil
}
maxX := ct.width()
logo := "cointop"
if ct.colorschemename == "cointop" {
@ -58,10 +62,18 @@ func (ct *Cointop) updateMarketbar() error {
arrow = "▼"
}
chartInfo := ""
if !ct.hideChart {
chartInfo = fmt.Sprintf(
"[ Chart: %s %s ] ",
charttitle,
timeframe,
)
}
content = fmt.Sprintf(
"[ Chart: %s %s ] Total Portfolio Value: %s • 24H: %s",
charttitle,
timeframe,
"%sTotal Portfolio Value: %s • 24H: %s",
chartInfo,
ct.colorscheme.MarketBarLabelActive(fmt.Sprintf("%s%s", ct.currencySymbol(), totalstr)),
color24h(fmt.Sprintf("%.2f%%%s", percentChange24H, arrow)),
)
@ -98,10 +110,18 @@ func (ct *Cointop) updateMarketbar() error {
chartname = "Global"
}
chartInfo := ""
if !ct.hideChart {
chartInfo = fmt.Sprintf(
"[ Chart: %s %s ] ",
ct.colorscheme.MarketBarLabelActive(chartname),
timeframe,
)
}
content = fmt.Sprintf(
"[ Chart: %s %s ] Global ▶ Market Cap: %s • 24H Volume: %s • BTC Dominance: %.2f%%",
ct.colorscheme.MarketBarLabelActive(chartname),
timeframe,
"%sGlobal ▶ Market Cap: %s • 24H Volume: %s • BTC Dominance: %.2f%%",
chartInfo,
fmt.Sprintf("%s%s", ct.currencySymbol(), humanize.Commaf(market.TotalMarketCapUSD)),
fmt.Sprintf("%s%s", ct.currencySymbol(), humanize.Commaf(market.Total24HVolumeUSD)),
market.BitcoinPercentageOfMarketCap,

View File

@ -6,7 +6,11 @@ import (
"github.com/miguelmota/cointop/cointop/common/pad"
)
func (ct *Cointop) updateStatusbar(s string) {
func (ct *Cointop) updateStatusbar(s string) error {
if ct.statusbarview == nil {
return nil
}
currpage := ct.currentDisplayPage()
totalpages := ct.totalPagesDisplay()
var quitText string
@ -36,6 +40,8 @@ func (ct *Cointop) updateStatusbar(s string) {
str = str[:len(str)-len(v)+2] + v
fmt.Fprintln(ct.statusbarview, str)
})
return nil
}
func (ct *Cointop) refreshRowLink() {