Remove Gui.Start callback. Add Gui.SetLayout()

This commit is contained in:
Roi Martin (@nibble_ds) 2014-01-10 20:21:54 +01:00
parent 7c70c8be3b
commit 271ec3f2a0
4 changed files with 86 additions and 53 deletions

View File

@ -8,31 +8,40 @@ import (
func layout(g *gocui.Gui) error {
maxX, maxY := g.Size()
if _, err := g.SetView("v1", -1, -1, 10, 10); err != nil {
if _, err := g.SetView("v1", -1, -1, 10, 10); err != nil &&
err != gocui.ErrorUnkView {
return err
}
if _, err := g.SetView("v2", maxX-10, -1, maxX, 10); err != nil {
if _, err := g.SetView("v2", maxX-10, -1, maxX, 10); err != nil &&
err != gocui.ErrorUnkView {
return err
}
if _, err := g.SetView("v3", maxX/2-5, -1, maxX/2+5, 10); err != nil {
if _, err := g.SetView("v3", maxX/2-5, -1, maxX/2+5, 10); err != nil &&
err != gocui.ErrorUnkView {
return err
}
if _, err := g.SetView("v4", -1, maxY/2-5, 10, maxY/2+5); err != nil {
if _, err := g.SetView("v4", -1, maxY/2-5, 10, maxY/2+5); err != nil &&
err != gocui.ErrorUnkView {
return err
}
if _, err := g.SetView("v5", maxX-10, maxY/2-5, maxX, maxY/2+5); err != nil {
if _, err := g.SetView("v5", maxX-10, maxY/2-5, maxX, maxY/2+5); err != nil &&
err != gocui.ErrorUnkView {
return err
}
if _, err := g.SetView("v6", -1, maxY-10, 10, maxY); err != nil {
if _, err := g.SetView("v6", -1, maxY-10, 10, maxY); err != nil &&
err != gocui.ErrorUnkView {
return err
}
if _, err := g.SetView("v7", maxX-10, maxY-10, maxX, maxY); err != nil {
if _, err := g.SetView("v7", maxX-10, maxY-10, maxX, maxY); err != nil &&
err != gocui.ErrorUnkView {
return err
}
if _, err := g.SetView("v8", maxX/2-5, maxY-10, maxX/2+5, maxY); err != nil {
if _, err := g.SetView("v8", maxX/2-5, maxY-10, maxX/2+5, maxY); err != nil &&
err != gocui.ErrorUnkView {
return err
}
if _, err := g.SetView("v9", maxX/2-5, maxY/2-5, maxX/2+5, maxY/2+5); err != nil {
if _, err := g.SetView("v9", maxX/2-5, maxY/2-5, maxX/2+5, maxY/2+5); err != nil &&
err != gocui.ErrorUnkView {
return err
}
return nil
@ -51,8 +60,7 @@ func main() {
}
defer g.Close()
g.Layout = layout
g.SetLayout(layout)
if err := g.SetKeybinding("", gocui.KeyCtrlC, 0, quit); err != nil {
log.Panicln(err)
}

View File

@ -68,6 +68,14 @@ func writeTest(g *gocui.Gui, v *gocui.View) error {
}
return nil
}
func setLayout1(g *gocui.Gui, v *gocui.View) error {
g.SetLayout(layout)
return nil
}
func setLayout2(g *gocui.Gui, v *gocui.View) error {
g.SetLayout(layout2)
return nil
}
func keybindings(g *gocui.Gui) error {
if err := g.SetKeybinding("", gocui.KeyCtrlM, 0, focusMain); err != nil {
@ -106,6 +114,12 @@ func keybindings(g *gocui.Gui) error {
if err := g.SetKeybinding("", 't', 0, writeTest); err != nil {
return err
}
if err := g.SetKeybinding("", '1', 0, setLayout1); err != nil {
return err
}
if err := g.SetKeybinding("", '2', 0, setLayout2); err != nil {
return err
}
return nil
}
@ -116,39 +130,42 @@ func quit(g *gocui.Gui, v *gocui.View) error {
func layout(g *gocui.Gui) error {
maxX, maxY := g.Size()
if _, err := g.SetView("side", -1, -1, 30, maxY-5); err != nil {
return err
}
if _, err := g.SetView("main", 30, -1, maxX, maxY-5); err != nil {
return err
}
if _, err := g.SetView("cmdline", -1, maxY-5, maxX, maxY); err != nil {
return err
}
return nil
}
func start(g *gocui.Gui) error {
if err := keybindings(g); err != nil {
return err
}
if v := g.GetView("main"); v != nil {
fmt.Fprintln(v, "This is a test")
}
if v := g.GetView("side"); v != nil {
if v, err := g.SetView("side", -1, -1, 30, maxY-5); err != nil {
if err != gocui.ErrorUnkView {
return err
}
v.Highlight = true
fmt.Fprintln(v, "Item 1")
fmt.Fprintln(v, "Item 2")
fmt.Fprintln(v, "Item 3")
fmt.Fprintln(v, "Item 4")
}
if v := g.GetView("cmdline"); v != nil {
fmt.Fprintln(v, "Buffer test")
if v, err := g.SetView("main", 30, -1, maxX, maxY-5); err != nil {
if err != gocui.ErrorUnkView {
return err
}
fmt.Fprintln(v, "This is a test")
if err := g.SetCurrentView("main"); err != nil {
return err
}
}
if err := g.SetCurrentView("main"); err != nil {
return err
if v, err := g.SetView("cmdline", -1, maxY-5, maxX, maxY); err != nil {
if err != gocui.ErrorUnkView {
return err
}
fmt.Fprintln(v, "Command line test")
}
return nil
}
func layout2(g *gocui.Gui) error {
maxX, maxY := g.Size()
if v, err := g.SetView("center", maxX/2-10, maxY/2-10, maxX/2+10, maxY/2+10); err != nil {
if err != gocui.ErrorUnkView {
return err
}
fmt.Fprintln(v, "Center view test")
}
g.ShowCursor = true
return nil
}
@ -161,10 +178,13 @@ func main() {
}
defer g.Close()
g.Layout = layout
g.Start = start
g.SetLayout(layout)
if err := keybindings(g); err != nil {
log.Panicln(err)
}
g.SelBgColor = gocui.ColorGreen
g.SelFgColor = gocui.ColorBlack
g.ShowCursor = true
err = g.MainLoop()
if err != nil && err != gocui.ErrorQuit {

View File

@ -8,13 +8,16 @@ import (
func layout(g *gocui.Gui) error {
maxX, maxY := g.Size()
if _, err := g.SetView("side", -1, -1, int(0.2*float32(maxX)), maxY-5); err != nil {
if _, err := g.SetView("side", -1, -1, int(0.2*float32(maxX)), maxY-5); err != nil &&
err != gocui.ErrorUnkView {
return err
}
if _, err := g.SetView("main", int(0.2*float32(maxX)), -1, maxX, maxY-5); err != nil {
if _, err := g.SetView("main", int(0.2*float32(maxX)), -1, maxX, maxY-5); err != nil &&
err != gocui.ErrorUnkView {
return err
}
if _, err := g.SetView("cmdline", -1, maxY-5, maxX, maxY); err != nil {
if _, err := g.SetView("cmdline", -1, maxY-5, maxX, maxY); err != nil &&
err != gocui.ErrorUnkView {
return err
}
return nil
@ -33,7 +36,7 @@ func main() {
}
defer g.Close()
g.Layout = layout
g.SetLayout(layout)
if err := g.SetKeybinding("", gocui.KeyCtrlC, 0, quit); err != nil {
log.Panicln(err)

24
gui.go
View File

@ -6,17 +6,19 @@ import (
"github.com/nsf/termbox-go"
)
var ErrorQuit error = errors.New("quit")
var (
ErrorQuit error = errors.New("quit")
ErrorUnkView error = errors.New("view exists")
)
type Gui struct {
CurrentView *View
Layout func(*Gui) error
Start func(*Gui) error
BgColor, FgColor Attribute
SelBgColor, SelFgColor Attribute
ShowCursor bool
events chan termbox.Event
views []*View
layout func(*Gui) error
keybindings []*Keybinding
maxX, maxY int
}
@ -77,7 +79,7 @@ func (g *Gui) SetView(name string, x0, y0, x1, y1 int) (v *View, err error) {
v.bgColor, v.fgColor = g.BgColor, g.FgColor
v.selBgColor, v.selFgColor = g.SelBgColor, g.SelFgColor
g.views = append(g.views, v)
return v, nil
return v, ErrorUnkView
}
func (g *Gui) GetView(name string) (v *View) {
@ -124,6 +126,11 @@ func (g *Gui) SetKeybinding(viewname string, key interface{}, mod Modifier, cb K
return nil
}
func (g *Gui) SetLayout(layout func(*Gui) error) {
g.layout = layout
go func() { g.events <- termbox.Event{Type: termbox.EventResize} }()
}
func (g *Gui) MainLoop() (err error) {
go func() {
for {
@ -136,11 +143,6 @@ func (g *Gui) MainLoop() (err error) {
if err := g.resize(); err != nil {
return err
}
if g.Start != nil {
if err := g.Start(g); err != nil {
return err
}
}
if err := g.draw(); err != nil {
return err
}
@ -207,13 +209,13 @@ func (g *Gui) draw() (err error) {
}
func (g *Gui) resize() (err error) {
if g.Layout == nil {
if g.layout == nil {
return errors.New("Null layout")
}
termbox.Clear(termbox.Attribute(g.FgColor), termbox.Attribute(g.BgColor))
g.maxX, g.maxY = termbox.Size()
if err := g.Layout(g); err != nil {
if err := g.layout(g); err != nil {
return err
}
if err := g.drawFrames(); err != nil {