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("table")
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("table", 'j', gocui.ModNone, cursorDown); err != nil {
69 return err
70 }
71 if err := g.SetKeybinding("table", gocui.KeyArrowDown, gocui.ModNone, cursorDown); err != nil {
72 return err
73 }
74 if err := g.SetKeybinding("table", 'k', gocui.ModNone, cursorUp); err != nil {
75 return err
76 }
77 if err := g.SetKeybinding("table", gocui.KeyArrowUp, gocui.ModNone, cursorUp); err != nil {
78 return err
79 }
80
81 //err = g.SetKeybinding("table", 'h', gocui.ModNone, popTable)
82 //err = g.SetKeybinding("table", gocui.KeyArrowLeft, gocui.ModNone, popTable)
83 //err = g.SetKeybinding("table", 'l', gocui.ModNone, pushTable)
84 //err = g.SetKeybinding("table", gocui.KeyArrowRight, gocui.ModNone, pushTable)
85 //err = g.SetKeybinding("table", 'p', gocui.ModNone, playSelected)
86 //err = g.SetKeybinding("table", gocui.KeyEnter, gocui.ModNone, playSelectedAndExit)
87 //err = g.SetKeybinding("table", 'm', gocui.ModNone, loadNextRecords)
88
89 return nil
90}
91
92func quit(g *gocui.Gui, v *gocui.View) error {
93 return gocui.ErrQuit
94}
95
96func cursorDown(g *gocui.Gui, v *gocui.View) error {
97 _, y := v.Cursor()
98 y = minInt(y+1, ui.bugTable.getTableLength()-1)
99
100 err := v.SetCursor(0, y)
101 if err != nil {
102 return err
103 }
104
105 return nil
106}
107
108func cursorUp(g *gocui.Gui, v *gocui.View) error {
109 _, y := v.Cursor()
110 y = maxInt(y-1, 0)
111
112 err := v.SetCursor(0, y)
113 if err != nil {
114 return err
115 }
116
117 return nil
118}
119
120func cursorClamp(v *gocui.View) error {
121 _, y := v.Cursor()
122
123 y = minInt(y, ui.bugTable.getTableLength()-1)
124 y = maxInt(y, 0)
125
126 err := v.SetCursor(0, y)
127 if err != nil {
128 return err
129 }
130
131 return nil
132}