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
}
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 {
g.SetLayout(layout)
return nil
}
func setLayout2(g *gocui.Gui, v *gocui.View) error {
g.SetLayout(layout2)
return nil
@ -149,6 +170,12 @@ func keybindings(g *gocui.Gui) error {
if err := g.SetKeybinding("", '2', 0, setLayout2); err != nil {
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
}

85
gui.go
View File

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