1package termui
2
3import (
4 "github.com/MichaelMure/git-bug/cache"
5 "github.com/MichaelMure/git-bug/repository"
6 "github.com/jroimartin/gocui"
7)
8
9type termUI struct {
10 cache cache.RepoCacher
11 bugTable *bugTable
12}
13
14var ui *termUI
15
16func Run(repo repository.Repo) error {
17 c := cache.NewRepoCache(repo)
18
19 ui = &termUI{
20 cache: c,
21 bugTable: newBugTable(c),
22 }
23
24 g, err := gocui.NewGui(gocui.OutputNormal)
25
26 if err != nil {
27 return err
28 }
29
30 defer g.Close()
31
32 g.SetManagerFunc(layout)
33
34 err = keybindings(g)
35
36 if err != nil {
37 return err
38 }
39
40 err = g.MainLoop()
41
42 if err != nil && err != gocui.ErrQuit {
43 return err
44 }
45
46 return nil
47}
48
49func layout(g *gocui.Gui) error {
50 //maxX, maxY := g.Size()
51
52 ui.bugTable.layout(g)
53
54 v, err := g.View("bugTable")
55 if err != nil {
56 return err
57 }
58
59 cursorClamp(v)
60
61 return nil
62}
63
64func keybindings(g *gocui.Gui) error {
65 if err := g.SetKeybinding("", 'q', gocui.ModNone, quit); err != nil {
66 return err
67 }
68 if err := g.SetKeybinding("bugTable", 'j', gocui.ModNone, cursorDown); err != nil {
69 return err
70 }
71 if err := g.SetKeybinding("bugTable", gocui.KeyArrowDown, gocui.ModNone, cursorDown); err != nil {
72 return err
73 }
74 if err := g.SetKeybinding("bugTable", 'k', gocui.ModNone, cursorUp); err != nil {
75 return err
76 }
77 if err := g.SetKeybinding("bugTable", gocui.KeyArrowUp, gocui.ModNone, cursorUp); err != nil {
78 return err
79 }
80
81 if err := g.SetKeybinding("bugTable", 'h', gocui.ModNone, previousPage); err != nil {
82 return err
83 }
84 if err := g.SetKeybinding("bugTable", gocui.KeyArrowLeft, gocui.ModNone, previousPage); err != nil {
85 return err
86 }
87 if err := g.SetKeybinding("bugTable", gocui.KeyPgup, gocui.ModNone, previousPage); err != nil {
88 return err
89 }
90 if err := g.SetKeybinding("bugTable", 'l', gocui.ModNone, nextPage); err != nil {
91 return err
92 }
93 if err := g.SetKeybinding("bugTable", gocui.KeyArrowRight, gocui.ModNone, nextPage); err != nil {
94 return err
95 }
96 if err := g.SetKeybinding("bugTable", gocui.KeyPgup, gocui.ModNone, nextPage); err != nil {
97 return err
98 }
99
100 //err = g.SetKeybinding("bugTable", 'p', gocui.ModNone, playSelected)
101 //err = g.SetKeybinding("bugTable", gocui.KeyEnter, gocui.ModNone, playSelectedAndExit)
102 //err = g.SetKeybinding("bugTable", 'm', gocui.ModNone, loadNextRecords)
103
104 return nil
105}
106
107func quit(g *gocui.Gui, v *gocui.View) error {
108 return gocui.ErrQuit
109}
110
111func cursorDown(g *gocui.Gui, v *gocui.View) error {
112 _, y := v.Cursor()
113 y = minInt(y+1, ui.bugTable.getTableLength()-1)
114
115 err := v.SetCursor(0, y)
116 if err != nil {
117 return err
118 }
119
120 return nil
121}
122
123func cursorUp(g *gocui.Gui, v *gocui.View) error {
124 _, y := v.Cursor()
125 y = maxInt(y-1, 0)
126
127 err := v.SetCursor(0, y)
128 if err != nil {
129 return err
130 }
131
132 return nil
133}
134
135func cursorClamp(v *gocui.View) error {
136 _, y := v.Cursor()
137
138 y = minInt(y, ui.bugTable.getTableLength()-1)
139 y = maxInt(y, 0)
140
141 err := v.SetCursor(0, y)
142 if err != nil {
143 return err
144 }
145
146 return nil
147}
148
149func nextPage(g *gocui.Gui, v *gocui.View) error {
150 _, maxY := v.Size()
151 return ui.bugTable.nextPage(maxY)
152}
153
154func previousPage(g *gocui.Gui, v *gocui.View) error {
155 _, maxY := v.Size()
156 return ui.bugTable.previousPage(maxY)
157}