mirror of https://github.com/miguelmota/cointop
add support for custom shortcuts
Former-commit-id: 0cbbdec70aeb238f3d2335402125e85ad86a749d [formerly 0cbbdec70aeb238f3d2335402125e85ad86a749d [formerly 8684c983cc8fe39ae992e98c8b1468863edc5522 [formerly 9acdc2f1a2412e48fd78c77e8c33f37a8e65f11a]]] Former-commit-id: da315cd287d39ed5929367e5ba291a1557256722 Former-commit-id: e832893298a69578434b8361effaf09401fc2bcb [formerly b3764ccad924fa795368fbca84852b19f018d873] Former-commit-id: a4e140a3b193a387e61ea03267475b451260a2b0pull/15/head
parent
01c81f3871
commit
555e1b8742
@ -0,0 +1,125 @@
|
||||
package cointop
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/user"
|
||||
"strings"
|
||||
|
||||
"github.com/BurntSushi/toml"
|
||||
)
|
||||
|
||||
type config struct {
|
||||
Shortcuts map[string]interface{} `toml:"shortcuts"`
|
||||
}
|
||||
|
||||
func (ct *Cointop) setupConfig() error {
|
||||
err := ct.makeConfigDir()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = ct.makeConfigFile()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = ct.parseConfig()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = ct.loadShortcutsFromConfig()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (ct *Cointop) configDirPath() string {
|
||||
usr, err := user.Current()
|
||||
if err != nil {
|
||||
return ".cointop"
|
||||
}
|
||||
|
||||
return fmt.Sprintf("%s%s", usr.HomeDir, "/.cointop")
|
||||
}
|
||||
|
||||
func (ct *Cointop) configPath() string {
|
||||
return fmt.Sprintf("%v%v", ct.configDirPath(), "/config")
|
||||
}
|
||||
|
||||
func (ct *Cointop) makeConfigDir() error {
|
||||
path := ct.configDirPath()
|
||||
if _, err := os.Stat(path); os.IsNotExist(err) {
|
||||
_ = os.Mkdir(path, os.ModePerm)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (ct *Cointop) makeConfigFile() error {
|
||||
path := ct.configPath()
|
||||
if _, err := os.Stat(path); os.IsNotExist(err) {
|
||||
fo, err := os.Create(path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer fo.Close()
|
||||
b, err := ct.configToToml()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err := fo.Write(b); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (ct *Cointop) parseConfig() error {
|
||||
var conf config
|
||||
path := ct.configPath()
|
||||
if _, err := toml.DecodeFile(path, &conf); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
ct.config = conf
|
||||
return nil
|
||||
}
|
||||
|
||||
func (ct *Cointop) configToToml() ([]byte, error) {
|
||||
s := defaultShortcuts()
|
||||
ifcs := map[string]interface{}{}
|
||||
for k, v := range s {
|
||||
var i interface{} = v
|
||||
ifcs[k] = i
|
||||
}
|
||||
var inputs = &config{
|
||||
Shortcuts: ifcs,
|
||||
}
|
||||
|
||||
var b bytes.Buffer
|
||||
encoder := toml.NewEncoder(&b)
|
||||
err := encoder.Encode(inputs)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return b.Bytes(), nil
|
||||
}
|
||||
|
||||
func (ct *Cointop) loadShortcutsFromConfig() error {
|
||||
actionsmap := actionsMap()
|
||||
for k, ifc := range ct.config.Shortcuts {
|
||||
k = strings.ToLower(k)
|
||||
v, ok := ifc.(string)
|
||||
if ok {
|
||||
if !actionsmap[k] {
|
||||
continue
|
||||
}
|
||||
if ct.shortcutkeys[k] == "" {
|
||||
continue
|
||||
}
|
||||
ct.shortcutkeys[k] = v
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
@ -0,0 +1,94 @@
|
||||
package cointop
|
||||
|
||||
func actionsMap() map[string]bool {
|
||||
return map[string]bool{
|
||||
"first_page": true,
|
||||
"help": true,
|
||||
"last_page": true,
|
||||
"move_to_page_first_row": true,
|
||||
"move_to_page_last_row": true,
|
||||
"move_to_page_visible_first_row": true,
|
||||
"move_to_page_visible_last_row": true,
|
||||
"move_to_page_visible_middle_row": true,
|
||||
"move_up": true,
|
||||
"move_down": true,
|
||||
"next_page": true,
|
||||
"open_link": true,
|
||||
"page_down": true,
|
||||
"page_up": true,
|
||||
"previous_page": true,
|
||||
"quit": true,
|
||||
"refresh": true,
|
||||
"sort_column_1h_change": true,
|
||||
"sort_column_24h_change": true,
|
||||
"sort_column_24h_volume": true,
|
||||
"sort_column_7d_change": true,
|
||||
"sort_column_asc": true,
|
||||
"sort_column_available_supply": true,
|
||||
"sort_column_desc": true,
|
||||
"sort_column_last_updated": true,
|
||||
"sort_column_market_cap": true,
|
||||
"sort_column_name": true,
|
||||
"sort_column_price": true,
|
||||
"sort_column_rank": true,
|
||||
"sort_column_symbol": true,
|
||||
"sort_column_total_supply": true,
|
||||
"sort_left_column": true,
|
||||
"sort_right_column": true,
|
||||
"toggle_row_chart": true,
|
||||
}
|
||||
}
|
||||
|
||||
func defaultShortcuts() map[string]string {
|
||||
return map[string]string{
|
||||
"arrowup": "move_up",
|
||||
"arrowdown": "move_down",
|
||||
"arrowleft": "previous_page",
|
||||
"arrowright": "next_page",
|
||||
"pagedown": "page_down",
|
||||
"pageup": "page_up",
|
||||
"home": "move_to_page_first_row",
|
||||
"end": "move_to_page_last_row",
|
||||
"enter": "open_link",
|
||||
"esc": "quit",
|
||||
"space": "open_link",
|
||||
"ctrl+c": "quit",
|
||||
"ctrl+d": "page_down",
|
||||
"ctrl+n": "next_page",
|
||||
"ctrl+p": "previous_page",
|
||||
"ctrl+r": "refresh",
|
||||
"ctrl+u": "page_up",
|
||||
"alt+arrowup": "sort_column_asc",
|
||||
"alt+arrowdown": "sort_column_desc",
|
||||
"alt+arrowleft": "sort_left_column",
|
||||
"alt+arrowright": "sort_right_column",
|
||||
"f1": "help",
|
||||
"0": "first_page",
|
||||
"1": "sort_column_1h_change",
|
||||
"2": "sort_column_24h_change",
|
||||
"7": "sort_column_7d_change",
|
||||
"a": "sort_column_available_supply",
|
||||
"c": "toggle_row_chart",
|
||||
"g": "move_to_page_first_row",
|
||||
"G": "move_to_page_last_row",
|
||||
"h": "previous_page",
|
||||
"H": "move_to_page_visible_first_row",
|
||||
"j": "move_down",
|
||||
"k": "move_up",
|
||||
"l": "next_page",
|
||||
"L": "move_to_page_visible_last_row",
|
||||
"m": "sort_column_market_cap",
|
||||
"M": "move_to_page_visible_middle_row",
|
||||
"n": "sort_column_name",
|
||||
"o": "open_link",
|
||||
"p": "sort_column_price",
|
||||
"r": "sort_column_rank",
|
||||
"s": "sort_column_symbol",
|
||||
"t": "sort_column_total_supply",
|
||||
"u": "sort_column_last_updated",
|
||||
"v": "sort_column_24h_volume",
|
||||
"q": "quit",
|
||||
"$": "last_page",
|
||||
"?": "help",
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue