aboutsummaryrefslogtreecommitdiffstats
path: root/main.go
blob: f1bf3b4a72da2f7031ed58025b6123240f6f7f9f (plain) (blame)
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package main

import (
	"image"
	"image/color"

	"github.com/faiface/mainthread"
	"volute/gui"
	"volute/gui/layout"
	"volute/gui/widget"
	"volute/gui/win"
)

const (
	WIDTH  = 800
	HEIGHT = 600

	POINTS = 6
)

func run() {
	w, err := win.New(win.Title("volute"), win.Size(WIDTH, HEIGHT))
	if err != nil {
		panic(err)
	}
	mux, env := gui.NewMux(w)

	var (
		displacementChan = make(chan uint)
		rpmChan          = make([]chan uint, POINTS)
		focus            = NewFocus(1 + POINTS)
	)
	for i := 0; i < POINTS; i++ {
		rpmChan[i] = make(chan uint)
	}

	bounds := layout.Grid{
		Rows:        []int{2, 8, 8},
		Background:  color.Gray{255},
		Gap:         1,
		Split:       layout.EvenSplit,
		SplitRows:   layout.EvenSplit,
		Margin:      0,
		Border:      0,
		BorderColor: color.Gray{16},
		Flip:        false,
	}.Lay(image.Rect(0, 0, WIDTH, HEIGHT))

	go widget.Label("displacement (cc)", bounds[0], mux.MakeEnv())
	go widget.Input(
		displacementChan,
		bounds[1],
		focus.widgets[0],
		mux.MakeEnv(),
	)

	go widget.Label("speed (rpm)", bounds[2], mux.MakeEnv())
	for i := 0; i < len(rpmChan); i++ {
		go widget.Input(
			rpmChan[i],
			bounds[i+3],
			focus.widgets[i+1],
			mux.MakeEnv(),
		)
	}

	focus.widgets[focus.i] <- true

Loop:
	for {
		select {
		case _ = <-displacementChan:
		case _ = <-rpmChan[0]:
		case event, ok := <-env.Events():
			if !ok { // channel closed
				break Loop
			}
			switch event := event.(type) {
			case win.WiClose:
				break Loop
			case win.KbType:
				switch event.Rune {
				case 'q':
					break Loop
				case 'j', 'l':
					focus.Next()
				case 'k', 'h':
					focus.Prev()
				}
			}
		}
	}
	close(env.Draw())
	close(displacementChan)
	for i := range rpmChan {
		close(rpmChan[i])
	}
}

func main() {
	mainthread.Run(run)
}