termui.go

  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}