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
|
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
85
gui.go
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user