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("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}