/
market_selector_view.go
64 lines (52 loc) · 1.38 KB
/
market_selector_view.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package main
import (
"fmt"
"github.com/rivo/tview"
"code.cryptowat.ch/cw-sdk-go/common"
)
type MarketSelectorParams struct {
Title string
// OnSelected is a callback which is called when a market is selected.
// It should return true if the market selector dialog should be closed.
OnSelected func(marketID common.MarketID) bool
}
type MarketSelectorView struct {
mainView *MainView
list *tview.List
}
func NewMarketSelectorView(
mainView *MainView, params *MarketSelectorParams,
) *MarketSelectorView {
msv := &MarketSelectorView{
mainView: mainView,
}
msv.list = tview.NewList().ShowSecondaryText(false)
msv.list.SetBorder(true).SetBorderPadding(1, 1, 1, 1).SetTitle(params.Title)
msv.list.SetTitleAlign(tview.AlignLeft)
msv.list.SetDoneFunc(func() {
msv.Hide()
})
for _, market := range msv.mainView.params.Markets {
// NOTE: we need to allocate it in this scope, because we use it in the
// function literal below.
marketID := market.ID
msv.list.AddItem(
fmt.Sprintf("%s %s%s", market.Exchange, market.Base, market.Quote),
"",
0,
func() {
shouldClose := params.OnSelected(marketID)
if shouldClose {
msv.Hide()
}
},
)
}
return msv
}
func (msv *MarketSelectorView) Show() {
msv.mainView.showModal(pageNameMarketSelector, msv.list, 40, 10)
}
func (msv *MarketSelectorView) Hide() {
msv.mainView.hideModal(pageNameMarketSelector)
}