mirror of
https://github.com/jroimartin/gocui.git
synced 2025-04-26 13:48:49 +08:00
Support overlapping views
This commit is contained in:
parent
db002da861
commit
9478f8b134
@ -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
85
gui.go
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user