Support overlapping views

This commit is contained in:
Roi Martin (@nibble_ds) 2014-01-18 13:47:08 +01:00
parent db002da861
commit 9478f8b134
2 changed files with 66 additions and 46 deletions

View File

@ -97,10 +97,31 @@ func writeTest(g *gocui.Gui, v *gocui.View) error {
} }
return nil return nil
} }
func showMsg(g *gocui.Gui, v *gocui.View) error {
maxX, maxY := g.Size()
if v, err := g.SetView("msg", maxX/2-10, maxY/2-10, maxX/2+10, maxY/2+10); err != nil {
if err != gocui.ErrorUnkView {
return err
}
fmt.Fprintln(v, "This is a message")
}
if err := g.SetCurrentView("msg"); err != nil {
return err
}
return nil
}
func delMsg(g *gocui.Gui, v *gocui.View) error {
g.DeleteView("msg")
return nil
}
func setLayout1(g *gocui.Gui, v *gocui.View) error { func setLayout1(g *gocui.Gui, v *gocui.View) error {
g.SetLayout(layout) g.SetLayout(layout)
return nil return nil
} }
func setLayout2(g *gocui.Gui, v *gocui.View) error { func setLayout2(g *gocui.Gui, v *gocui.View) error {
g.SetLayout(layout2) g.SetLayout(layout2)
return nil return nil
@ -149,6 +170,12 @@ func keybindings(g *gocui.Gui) error {
if err := g.SetKeybinding("", '2', 0, setLayout2); err != nil { if err := g.SetKeybinding("", '2', 0, setLayout2); err != nil {
return err return err
} }
if err := g.SetKeybinding("", '3', 0, showMsg); err != nil {
return err
}
if err := g.SetKeybinding("", '4', 0, delMsg); err != nil {
return err
}
return nil return nil
} }

85
gui.go
View File

@ -147,15 +147,9 @@ func (g *Gui) MainLoop() error {
termbox.SetInputMode(termbox.InputAlt) termbox.SetInputMode(termbox.InputAlt)
if err := g.resize(); err != nil { if err := g.Flush(); err != nil {
return err return err
} }
if err := g.draw(); err != nil {
return err
}
termbox.Flush()
for { for {
ev := <-g.events ev := <-g.events
if err := g.handleEvent(&ev); err != nil { if err := g.handleEvent(&ev); err != nil {
@ -164,10 +158,9 @@ func (g *Gui) MainLoop() error {
if err := g.consumeevents(); err != nil { if err := g.consumeevents(); err != nil {
return err return err
} }
if err := g.draw(); err != nil { if err := g.Flush(); err != nil {
return err return err
} }
termbox.Flush()
} }
return nil return nil
} }
@ -189,8 +182,6 @@ func (g *Gui) handleEvent(ev *termbox.Event) error {
switch ev.Type { switch ev.Type {
case termbox.EventKey: case termbox.EventKey:
return g.onKey(ev) return g.onKey(ev)
case termbox.EventResize:
return g.resize()
case termbox.EventError: case termbox.EventError:
return ev.Err return ev.Err
default: default:
@ -198,7 +189,7 @@ func (g *Gui) handleEvent(ev *termbox.Event) error {
} }
} }
func (g *Gui) draw() error { func (g *Gui) draw(v *View) error {
if g.ShowCursor { if g.ShowCursor {
if v := g.currentView; v != nil { if v := g.currentView; v != nil {
maxX, maxY := v.Size() maxX, maxY := v.Size()
@ -218,16 +209,14 @@ func (g *Gui) draw() error {
termbox.HideCursor() termbox.HideCursor()
} }
for _, v := range g.views { v.clearRunes()
v.clearRunes() if err := v.draw(); err != nil {
if err := v.draw(); err != nil { return err
return err
}
} }
return nil return nil
} }
func (g *Gui) resize() error { func (g *Gui) Flush() error {
if g.layout == nil { if g.layout == nil {
return errors.New("Null layout") return errors.New("Null layout")
} }
@ -237,46 +226,50 @@ func (g *Gui) resize() error {
if err := g.layout(g); err != nil { if err := g.layout(g); err != nil {
return err return err
} }
if err := g.drawFrames(); err != nil { for _, v := range g.views {
return err if err := g.drawFrame(v); err != nil {
return err
}
if err := g.draw(v); err != nil {
return err
}
} }
if err := g.drawIntersections(); err != nil { if err := g.drawIntersections(); err != nil {
return err return err
} }
termbox.Flush()
return nil return nil
} }
func (g *Gui) drawFrames() error { func (g *Gui) drawFrame(v *View) error {
for _, v := range g.views { for x := v.x0 + 1; x < v.x1 && x < g.maxX; x++ {
for x := v.x0 + 1; x < v.x1 && x < g.maxX; x++ { if x < 0 {
if x < 0 { continue
continue }
} if v.y0 > -1 && v.y0 < g.maxY {
if v.y0 > -1 && v.y0 < g.maxY { if err := g.SetRune(x, v.y0, '─'); err != nil {
if err := g.SetRune(x, v.y0, '─'); err != nil { return err
return err
}
}
if v.y1 > -1 && v.y1 < g.maxY {
if err := g.SetRune(x, v.y1, '─'); err != nil {
return err
}
} }
} }
for y := v.y0 + 1; y < v.y1 && y < g.maxY; y++ { if v.y1 > -1 && v.y1 < g.maxY {
if y < 0 { if err := g.SetRune(x, v.y1, '─'); err != nil {
continue return err
} }
if v.x0 > -1 && v.x0 < g.maxX { }
if err := g.SetRune(v.x0, y, '│'); err != nil { }
return err for y := v.y0 + 1; y < v.y1 && y < g.maxY; y++ {
} if y < 0 {
continue
}
if v.x0 > -1 && v.x0 < g.maxX {
if err := g.SetRune(v.x0, y, '│'); err != nil {
return err
} }
if v.x1 > -1 && v.x1 < g.maxX { }
if err := g.SetRune(v.x1, y, '│'); err != nil { if v.x1 > -1 && v.x1 < g.maxX {
return err if err := g.SetRune(v.x1, y, '│'); err != nil {
} return err
} }
} }
} }