mirror of
https://github.com/jroimartin/gocui.git
synced 2025-04-24 13:48:51 +08:00
Remove Gui.Start callback. Add Gui.SetLayout()
This commit is contained in:
parent
7c70c8be3b
commit
271ec3f2a0
@ -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)
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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
24
gui.go
@ -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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user