From 9a270d4b19fdea3a716946eef4a841cfb03e0cfc Mon Sep 17 00:00:00 2001 From: Simon Roberts Date: Tue, 28 Sep 2021 11:55:02 +1000 Subject: [PATCH 1/6] Allow configurable max_chart_width (default 175, if 0 use full width) Start working on MaxTableWidth --- cointop/chart.go | 4 ++-- cointop/cointop.go | 10 +++++++++- cointop/config.go | 6 ++++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/cointop/chart.go b/cointop/chart.go index 7566161..a6e7938 100644 --- a/cointop/chart.go +++ b/cointop/chart.go @@ -453,8 +453,8 @@ func (ct *Cointop) ShowChartLoader() error { func (ct *Cointop) ChartWidth() int { log.Debug("ChartWidth()") w := ct.Width() - max := 175 - if w > max { + max := int(ct.config.MaxChartWidth.(int64)) + if max > 0 && w > max { return max } diff --git a/cointop/cointop.go b/cointop/cointop.go index ebbd4b0..10a6e02 100644 --- a/cointop/cointop.go +++ b/cointop/cointop.go @@ -110,6 +110,7 @@ type Cointop struct { forceRefresh chan bool limiter <-chan time.Time maxTableWidth int + maxChartWidth int refreshMux sync.Mutex refreshTicker *time.Ticker saveMux sync.Mutex @@ -179,6 +180,12 @@ var DefaultCurrency = "USD" // DefaultChartRange ... var DefaultChartRange = "1Y" +// DefaultMaxTableWidth ... +var DefaultMaxTableWidth int = 175 + +// DefaultMaxChartWidth ... +var DefaultMaxChartWidth int = 175 + // DefaultSortBy ... var DefaultSortBy = "rank" @@ -230,7 +237,8 @@ func NewCointop(config *Config) (*Cointop, error) { apiChoice: CoinGecko, apiKeys: new(APIKeys), forceRefresh: make(chan bool), - maxTableWidth: 175, + maxTableWidth: DefaultMaxTableWidth, + maxChartWidth: DefaultMaxChartWidth, ActionsMap: ActionsMap(), cache: cache.New(1*time.Minute, 2*time.Minute), colorsDir: config.ColorsDir, diff --git a/cointop/config.go b/cointop/config.go index 055bf49..6e7f1f9 100644 --- a/cointop/config.go +++ b/cointop/config.go @@ -42,6 +42,8 @@ type ConfigFileConfig struct { Currency interface{} `toml:"currency"` DefaultView interface{} `toml:"default_view"` DefaultChartRange interface{} `toml:"default_chart_range"` + MaxTableWidth interface{} `toml:"max_table_width"` + MaxChartWidth interface{} `toml:"max_chart_width"` CoinMarketCap map[string]interface{} `toml:"coinmarketcap"` API interface{} `toml:"api"` Colorscheme interface{} `toml:"colorscheme"` @@ -264,6 +266,8 @@ func (ct *Cointop) ConfigToToml() ([]byte, error) { var currencyIfc interface{} = ct.State.currencyConversion var defaultViewIfc interface{} = ct.State.defaultView var defaultChartRangeIfc interface{} = ct.State.defaultChartRange + var maxTableWidth interface{} = ct.maxChartWidth + var maxChartWidth interface{} = ct.maxChartWidth var colorschemeIfc interface{} = ct.colorschemeName var refreshRateIfc interface{} = uint(ct.State.refreshRate.Seconds()) var cacheDirIfc interface{} = ct.State.cacheDir @@ -304,6 +308,8 @@ func (ct *Cointop) ConfigToToml() ([]byte, error) { Currency: currencyIfc, DefaultView: defaultViewIfc, DefaultChartRange: defaultChartRangeIfc, + MaxTableWidth: maxTableWidth, + MaxChartWidth: maxChartWidth, Favorites: favoritesMapIfc, RefreshRate: refreshRateIfc, Shortcuts: shortcutsIfcs, From caccc13ea09b98114b3a27afb33b05fd77a1e115 Mon Sep 17 00:00:00 2001 From: Simon Roberts Date: Wed, 29 Sep 2021 08:47:42 +1000 Subject: [PATCH 2/6] Move maxChartWidth to ct.State --- cointop/chart.go | 2 +- cointop/cointop.go | 4 ++-- cointop/config.go | 18 ++++++++++++++++-- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/cointop/chart.go b/cointop/chart.go index a6e7938..df95063 100644 --- a/cointop/chart.go +++ b/cointop/chart.go @@ -453,7 +453,7 @@ func (ct *Cointop) ShowChartLoader() error { func (ct *Cointop) ChartWidth() int { log.Debug("ChartWidth()") w := ct.Width() - max := int(ct.config.MaxChartWidth.(int64)) + max := ct.State.maxChartWidth if max > 0 && w > max { return max } diff --git a/cointop/cointop.go b/cointop/cointop.go index 10a6e02..50aae1b 100644 --- a/cointop/cointop.go +++ b/cointop/cointop.go @@ -46,6 +46,7 @@ type State struct { convertMenuVisible bool defaultView string defaultChartRange string + maxChartWidth int // DEPRECATED: favorites by 'symbol' is deprecated because of collisions. favoritesBySymbol map[string]bool @@ -110,7 +111,6 @@ type Cointop struct { forceRefresh chan bool limiter <-chan time.Time maxTableWidth int - maxChartWidth int refreshMux sync.Mutex refreshTicker *time.Ticker saveMux sync.Mutex @@ -238,7 +238,6 @@ func NewCointop(config *Config) (*Cointop, error) { apiKeys: new(APIKeys), forceRefresh: make(chan bool), maxTableWidth: DefaultMaxTableWidth, - maxChartWidth: DefaultMaxChartWidth, ActionsMap: ActionsMap(), cache: cache.New(1*time.Minute, 2*time.Minute), colorsDir: config.ColorsDir, @@ -253,6 +252,7 @@ func NewCointop(config *Config) (*Cointop, error) { coinsTableColumns: DefaultCoinTableHeaders, currencyConversion: DefaultCurrency, defaultChartRange: DefaultChartRange, + maxChartWidth: DefaultMaxChartWidth, // DEPRECATED: favorites by 'symbol' is deprecated because of collisions. Kept for backward compatibility. favoritesBySymbol: make(map[string]bool), favorites: make(map[string]bool), diff --git a/cointop/config.go b/cointop/config.go index 6e7f1f9..b64f422 100644 --- a/cointop/config.go +++ b/cointop/config.go @@ -79,6 +79,10 @@ func (ct *Cointop) SetupConfig() error { if err := ct.loadDefaultChartRangeFromConfig(); err != nil { return err } + if err := ct.loadMaxChartWidthFromConfig(); err != nil { + log.Debug("SetupConfig() ERR", err) + return err + } if err := ct.loadAPIKeysFromConfig(); err != nil { return err } @@ -266,8 +270,8 @@ func (ct *Cointop) ConfigToToml() ([]byte, error) { var currencyIfc interface{} = ct.State.currencyConversion var defaultViewIfc interface{} = ct.State.defaultView var defaultChartRangeIfc interface{} = ct.State.defaultChartRange - var maxTableWidth interface{} = ct.maxChartWidth - var maxChartWidth interface{} = ct.maxChartWidth + var maxTableWidth interface{} = ct.maxTableWidth + var maxChartWidth interface{} = ct.State.maxChartWidth var colorschemeIfc interface{} = ct.colorschemeName var refreshRateIfc interface{} = uint(ct.State.refreshRate.Seconds()) var cacheDirIfc interface{} = ct.State.cacheDir @@ -431,6 +435,16 @@ func (ct *Cointop) loadDefaultChartRangeFromConfig() error { return nil } +// loadMaxChartWidthFromConfig loads max chart width from config file to struct +func (ct *Cointop) loadMaxChartWidthFromConfig() error { + log.Debug("loadMaxChartWidthFromConfig()") + if maxChartWidth, ok := ct.config.MaxChartWidth.(int64); ok { + ct.State.maxChartWidth = int(maxChartWidth) + } + + return nil +} + // LoadAPIKeysFromConfig loads API keys from config file to struct func (ct *Cointop) loadAPIKeysFromConfig() error { log.Debug("loadAPIKeysFromConfig()") From f0631cf2de6440cfa47865975b28af3e3875b4c5 Mon Sep 17 00:00:00 2001 From: Simon Roberts Date: Wed, 29 Sep 2021 08:51:17 +1000 Subject: [PATCH 3/6] The world is not ready for configurable MaxTableWidth --- cointop/cointop.go | 5 +---- cointop/config.go | 4 ---- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/cointop/cointop.go b/cointop/cointop.go index 50aae1b..3ec8632 100644 --- a/cointop/cointop.go +++ b/cointop/cointop.go @@ -180,9 +180,6 @@ var DefaultCurrency = "USD" // DefaultChartRange ... var DefaultChartRange = "1Y" -// DefaultMaxTableWidth ... -var DefaultMaxTableWidth int = 175 - // DefaultMaxChartWidth ... var DefaultMaxChartWidth int = 175 @@ -237,7 +234,7 @@ func NewCointop(config *Config) (*Cointop, error) { apiChoice: CoinGecko, apiKeys: new(APIKeys), forceRefresh: make(chan bool), - maxTableWidth: DefaultMaxTableWidth, + maxTableWidth: 175, ActionsMap: ActionsMap(), cache: cache.New(1*time.Minute, 2*time.Minute), colorsDir: config.ColorsDir, diff --git a/cointop/config.go b/cointop/config.go index b64f422..ef7fb9b 100644 --- a/cointop/config.go +++ b/cointop/config.go @@ -42,7 +42,6 @@ type ConfigFileConfig struct { Currency interface{} `toml:"currency"` DefaultView interface{} `toml:"default_view"` DefaultChartRange interface{} `toml:"default_chart_range"` - MaxTableWidth interface{} `toml:"max_table_width"` MaxChartWidth interface{} `toml:"max_chart_width"` CoinMarketCap map[string]interface{} `toml:"coinmarketcap"` API interface{} `toml:"api"` @@ -80,7 +79,6 @@ func (ct *Cointop) SetupConfig() error { return err } if err := ct.loadMaxChartWidthFromConfig(); err != nil { - log.Debug("SetupConfig() ERR", err) return err } if err := ct.loadAPIKeysFromConfig(); err != nil { @@ -270,7 +268,6 @@ func (ct *Cointop) ConfigToToml() ([]byte, error) { var currencyIfc interface{} = ct.State.currencyConversion var defaultViewIfc interface{} = ct.State.defaultView var defaultChartRangeIfc interface{} = ct.State.defaultChartRange - var maxTableWidth interface{} = ct.maxTableWidth var maxChartWidth interface{} = ct.State.maxChartWidth var colorschemeIfc interface{} = ct.colorschemeName var refreshRateIfc interface{} = uint(ct.State.refreshRate.Seconds()) @@ -312,7 +309,6 @@ func (ct *Cointop) ConfigToToml() ([]byte, error) { Currency: currencyIfc, DefaultView: defaultViewIfc, DefaultChartRange: defaultChartRangeIfc, - MaxTableWidth: maxTableWidth, MaxChartWidth: maxChartWidth, Favorites: favoritesMapIfc, RefreshRate: refreshRateIfc, From 4fa05a5e88a491ef8ec82043efb9e096d1c672ac Mon Sep 17 00:00:00 2001 From: Simon Roberts Date: Wed, 29 Sep 2021 13:18:05 +1000 Subject: [PATCH 4/6] Use constant for DefaultChartHeight --- cointop/cointop.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/cointop/cointop.go b/cointop/cointop.go index 3ec8632..3f9cf7b 100644 --- a/cointop/cointop.go +++ b/cointop/cointop.go @@ -183,6 +183,9 @@ var DefaultChartRange = "1Y" // DefaultMaxChartWidth ... var DefaultMaxChartWidth int = 175 +// DefaultChartHeight ... +var DefaultChartHeight int = 10 + // DefaultSortBy ... var DefaultSortBy = "rank" @@ -274,8 +277,8 @@ func NewCointop(config *Config) (*Cointop, error) { Entries: make(map[string]*PortfolioEntry), }, portfolioTableColumns: DefaultPortfolioTableHeaders, - chartHeight: 10, - lastChartHeight: 10, + chartHeight: DefaultChartHeight, + lastChartHeight: DefaultChartHeight, tableOffsetX: 0, tableColumnWidths: sync.Map{}, tableColumnAlignLeft: sync.Map{}, From a85fb5ea5071b13d2c5603344d732645fe2cbecc Mon Sep 17 00:00:00 2001 From: Simon Roberts Date: Wed, 29 Sep 2021 13:18:55 +1000 Subject: [PATCH 5/6] Move maxChartWidth to [chart] section in config. Start working on persistent chart height --- cointop/config.go | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/cointop/config.go b/cointop/config.go index ef7fb9b..5b16c17 100644 --- a/cointop/config.go +++ b/cointop/config.go @@ -42,13 +42,13 @@ type ConfigFileConfig struct { Currency interface{} `toml:"currency"` DefaultView interface{} `toml:"default_view"` DefaultChartRange interface{} `toml:"default_chart_range"` - MaxChartWidth interface{} `toml:"max_chart_width"` CoinMarketCap map[string]interface{} `toml:"coinmarketcap"` API interface{} `toml:"api"` Colorscheme interface{} `toml:"colorscheme"` RefreshRate interface{} `toml:"refresh_rate"` CacheDir interface{} `toml:"cache_dir"` Table map[string]interface{} `toml:"table"` + Chart map[string]interface{} `toml:"chart"` } // SetupConfig loads config file @@ -63,6 +63,9 @@ func (ct *Cointop) SetupConfig() error { if err := ct.loadTableConfig(); err != nil { return err } + if err := ct.loadChartConfig(); err != nil { + return err + } if err := ct.loadShortcutsFromConfig(); err != nil { return err } @@ -78,9 +81,6 @@ func (ct *Cointop) SetupConfig() error { if err := ct.loadDefaultChartRangeFromConfig(); err != nil { return err } - if err := ct.loadMaxChartWidthFromConfig(); err != nil { - return err - } if err := ct.loadAPIKeysFromConfig(); err != nil { return err } @@ -268,7 +268,6 @@ func (ct *Cointop) ConfigToToml() ([]byte, error) { var currencyIfc interface{} = ct.State.currencyConversion var defaultViewIfc interface{} = ct.State.defaultView var defaultChartRangeIfc interface{} = ct.State.defaultChartRange - var maxChartWidth interface{} = ct.State.maxChartWidth var colorschemeIfc interface{} = ct.colorschemeName var refreshRateIfc interface{} = uint(ct.State.refreshRate.Seconds()) var cacheDirIfc interface{} = ct.State.cacheDir @@ -302,6 +301,11 @@ func (ct *Cointop) ConfigToToml() ([]byte, error) { var keepRowFocusOnSortIfc interface{} = ct.State.keepRowFocusOnSort tableMapIfc["keep_row_focus_on_sort"] = keepRowFocusOnSortIfc + chartMapIfc := map[string]interface{}{} + chartMapIfc["max_width"] = ct.State.maxChartWidth + chartMapIfc["height"] = ct.State.chartHeight + log.Debugf("XXX chart = %s", chartMapIfc) + var inputs = &ConfigFileConfig{ API: apiChoiceIfc, Colorscheme: colorschemeIfc, @@ -309,7 +313,6 @@ func (ct *Cointop) ConfigToToml() ([]byte, error) { Currency: currencyIfc, DefaultView: defaultViewIfc, DefaultChartRange: defaultChartRangeIfc, - MaxChartWidth: maxChartWidth, Favorites: favoritesMapIfc, RefreshRate: refreshRateIfc, Shortcuts: shortcutsIfcs, @@ -317,6 +320,7 @@ func (ct *Cointop) ConfigToToml() ([]byte, error) { PriceAlerts: priceAlertsMapIfc, CacheDir: cacheDirIfc, Table: tableMapIfc, + Chart: chartMapIfc, } var b bytes.Buffer @@ -344,6 +348,21 @@ func (ct *Cointop) loadTableConfig() error { return nil } +// LoadChartConfig loads chart config from toml config into state struct +func (ct *Cointop) loadChartConfig() error { + log.Debugf("loadChartConfig()") + maxChartWidthIfc, ok := ct.config.Chart["max_width"] + if ok { + ct.State.maxChartWidth = int(maxChartWidthIfc.(int64)) + } + + chartHeightIfc, ok := ct.config.Chart["height"] + if ok { + ct.State.chartHeight = int(chartHeightIfc.(int64)) + } + return nil +} + // LoadTableColumnsFromConfig loads preferred coins table columns from config file to struct func (ct *Cointop) loadTableColumnsFromConfig() error { log.Debug("loadTableColumnsFromConfig()") @@ -431,16 +450,6 @@ func (ct *Cointop) loadDefaultChartRangeFromConfig() error { return nil } -// loadMaxChartWidthFromConfig loads max chart width from config file to struct -func (ct *Cointop) loadMaxChartWidthFromConfig() error { - log.Debug("loadMaxChartWidthFromConfig()") - if maxChartWidth, ok := ct.config.MaxChartWidth.(int64); ok { - ct.State.maxChartWidth = int(maxChartWidth) - } - - return nil -} - // LoadAPIKeysFromConfig loads API keys from config file to struct func (ct *Cointop) loadAPIKeysFromConfig() error { log.Debug("loadAPIKeysFromConfig()") From 95a31d5488d405d9deb2ab3b63d02e8a625829cf Mon Sep 17 00:00:00 2001 From: Simon Roberts Date: Thu, 30 Sep 2021 07:43:09 +1000 Subject: [PATCH 6/6] Save chart height after change. --- cointop/chart.go | 8 ++++++++ cointop/config.go | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/cointop/chart.go b/cointop/chart.go index df95063..eb0d4c8 100644 --- a/cointop/chart.go +++ b/cointop/chart.go @@ -342,6 +342,10 @@ func (ct *Cointop) ShortenChart() error { ct.State.chartHeight = candidate ct.State.lastChartHeight = ct.State.chartHeight + if err := ct.Save(); err != nil { + return err + } + go ct.UpdateChart() return nil } @@ -356,6 +360,10 @@ func (ct *Cointop) EnlargeChart() error { ct.State.chartHeight = candidate ct.State.lastChartHeight = ct.State.chartHeight + if err := ct.Save(); err != nil { + return err + } + go ct.UpdateChart() return nil } diff --git a/cointop/config.go b/cointop/config.go index 5b16c17..fc80220 100644 --- a/cointop/config.go +++ b/cointop/config.go @@ -304,7 +304,6 @@ func (ct *Cointop) ConfigToToml() ([]byte, error) { chartMapIfc := map[string]interface{}{} chartMapIfc["max_width"] = ct.State.maxChartWidth chartMapIfc["height"] = ct.State.chartHeight - log.Debugf("XXX chart = %s", chartMapIfc) var inputs = &ConfigFileConfig{ API: apiChoiceIfc, @@ -359,6 +358,7 @@ func (ct *Cointop) loadChartConfig() error { chartHeightIfc, ok := ct.config.Chart["height"] if ok { ct.State.chartHeight = int(chartHeightIfc.(int64)) + ct.State.lastChartHeight = ct.State.chartHeight } return nil }