1 | package main
|
2 |
|
3 | import (
|
4 | "fmt"
|
5 |
|
6 | "github.com/gizak/termui"
|
7 | )
|
8 |
|
9 | func render(wheel *Wheel, status *Status) termui.GridBufferer {
|
10 | var text string
|
11 | switch status.State {
|
12 | case RUNNING:
|
13 | text = fmt.Sprintf(
|
14 | `[%d/%d] Pomodoros completed
|
15 |
|
16 | %s %s remaining
|
17 |
|
18 |
|
19 | [q] - quit [p] - pause
|
20 | `,
|
21 | status.Count,
|
22 | status.NPomodoros,
|
23 | wheel,
|
24 | status.Remaining,
|
25 | )
|
26 | case BREAKING:
|
27 | text = `It is time to take a break!
|
28 |
|
29 | Once you a ready press [enter]
|
30 | to begin the next Pomodoro.
|
31 |
|
32 | [q] - quit [p] - pause
|
33 | `
|
34 | case PAUSED:
|
35 | text = `Pomo is suspended.
|
36 |
|
37 | Press [p] to continue.
|
38 |
|
39 |
|
40 | [q] - quit [p] - unpause
|
41 | `
|
42 | case COMPLETE:
|
43 | text = `This session has concluded.
|
44 |
|
45 | Press [q] to exit.
|
46 |
|
47 |
|
48 | [q] - quit
|
49 | `
|
50 | }
|
51 | par := termui.NewPar(text)
|
52 | par.Height = 8
|
53 | par.BorderLabel = fmt.Sprintf("Pomo - %s", status.State)
|
54 | par.BorderLabelFg = termui.ColorWhite
|
55 | par.BorderFg = termui.ColorRed
|
56 | if status.State == RUNNING {
|
57 | par.BorderFg = termui.ColorGreen
|
58 | }
|
59 | return par
|
60 | }
|
61 |
|
62 | func newBlk() termui.GridBufferer {
|
63 | blk := termui.NewBlock()
|
64 | blk.Height = termui.TermHeight() / 3
|
65 | blk.Border = false
|
66 | return blk
|
67 | }
|
68 |
|
69 | func centered(part termui.GridBufferer) *termui.Grid {
|
70 | grid := termui.NewGrid(
|
71 | termui.NewRow(
|
72 | termui.NewCol(12, 0, newBlk()),
|
73 | ),
|
74 | termui.NewRow(
|
75 | termui.NewCol(3, 0, newBlk()),
|
76 | termui.NewCol(6, 0, part),
|
77 | termui.NewCol(3, 0, newBlk()),
|
78 | ),
|
79 | termui.NewRow(
|
80 | termui.NewCol(12, 0, newBlk()),
|
81 | ),
|
82 | )
|
83 | grid.BgColor = termui.ThemeAttr("bg")
|
84 | grid.Width = termui.TermWidth()
|
85 | grid.Align()
|
86 | return grid
|
87 | }
|
88 |
|
89 | func startUI(runner *TaskRunner) {
|
90 | err := termui.Init()
|
91 | if err != nil {
|
92 | panic(err)
|
93 | }
|
94 | wheel := Wheel(0)
|
95 |
|
96 | defer termui.Close()
|
97 |
|
98 | termui.Render(centered(render(&wheel, runner.Status())))
|
99 |
|
100 | termui.Handle("/timer/1s", func(termui.Event) {
|
101 | termui.Render(centered(render(&wheel, runner.Status())))
|
102 | })
|
103 |
|
104 | termui.Handle("/sys/wnd/resize", func(termui.Event) {
|
105 | termui.Render(centered(render(&wheel, runner.Status())))
|
106 | })
|
107 |
|
108 | termui.Handle("/sys/kbd/<enter>", func(termui.Event) {
|
109 | runner.Toggle()
|
110 | termui.Render(centered(render(&wheel, runner.Status())))
|
111 | })
|
112 |
|
113 | termui.Handle("/sys/kbd/p", func(termui.Event) {
|
114 | runner.Pause()
|
115 | termui.Render(centered(render(&wheel, runner.Status())))
|
116 | })
|
117 |
|
118 | termui.Handle("/sys/kbd/q", func(termui.Event) {
|
119 | termui.StopLoop()
|
120 | })
|
121 |
|
122 | termui.Loop()
|
123 | }
|