diff --git a/_demos/demo2.go b/_demos/demo2.go index 459b160..59187f1 100644 --- a/_demos/demo2.go +++ b/_demos/demo2.go @@ -37,7 +37,9 @@ func cursorDown(g *gocui.Gui, v *gocui.View) error { cx, cy := v.Cursor() if err := v.SetCursor(cx, cy+1); err != nil { ox, oy := v.Origin() - v.SetOrigin(ox, oy+1) + if err := v.SetOrigin(ox, oy+1); err != nil { + return err + } } } return nil @@ -48,7 +50,9 @@ func cursorUp(g *gocui.Gui, v *gocui.View) error { ox, oy := v.Origin() cx, cy := v.Cursor() if err := v.SetCursor(cx, cy-1); err != nil && oy > 0 { - v.SetOrigin(ox, oy-1) + if err := v.SetOrigin(ox, oy-1); err != nil { + return err + } } } return nil @@ -59,7 +63,9 @@ func cursorLeft(g *gocui.Gui, v *gocui.View) error { ox, oy := v.Origin() cx, cy := v.Cursor() if err := v.SetCursor(cx-1, cy); err != nil && ox > 0 { - v.SetOrigin(ox-1, oy) + if err := v.SetOrigin(ox-1, oy); err != nil { + return err + } } } return nil @@ -70,7 +76,9 @@ func cursorRight(g *gocui.Gui, v *gocui.View) error { cx, cy := v.Cursor() if err := v.SetCursor(cx+1, cy); err != nil { ox, oy := v.Origin() - v.SetOrigin(ox+1, oy) + if err := v.SetOrigin(ox+1, oy); err != nil { + return err + } } } return nil @@ -99,7 +107,7 @@ func setLayout2(g *gocui.Gui, v *gocui.View) error { } func keybindings(g *gocui.Gui) error { - if err := g.SetKeybinding("", gocui.KeyCtrlM, 0, focusMain); err != nil { + if err := g.SetKeybinding("", gocui.KeyCtrlSpace, 0, focusMain); err != nil { return err } if err := g.SetKeybinding("", gocui.KeyCtrlS, 0, focusSide); err != nil { diff --git a/gui.go b/gui.go index e006d87..ea3f03d 100644 --- a/gui.go +++ b/gui.go @@ -370,9 +370,7 @@ func (g *Gui) onKey(ev *termbox.Event) error { if kb.CB == nil { return nil } - if err := kb.CB(g, g.currentView); err != nil { - return err - } + return kb.CB(g, g.currentView) } } return nil diff --git a/view.go b/view.go index 4af1e38..e56cc1b 100644 --- a/view.go +++ b/view.go @@ -8,7 +8,6 @@ import ( "bufio" "bytes" "errors" - "io" "github.com/nsf/termbox-go" ) @@ -18,7 +17,7 @@ type View struct { x0, y0, x1, y1 int ox, oy int cx, cy int - buffer []rune + lines [][]rune bgColor, fgColor Attribute selBgColor, selFgColor Attribute @@ -77,9 +76,13 @@ func (v *View) Cursor() (x, y int) { return v.cx, v.cy } -func (v *View) SetOrigin(x, y int) { +func (v *View) SetOrigin(x, y int) error { + if x < 0 || y < 0 { + return errors.New("invalid point") + } v.ox = x v.oy = y + return nil } func (v *View) Origin() (x, y int) { @@ -87,29 +90,27 @@ func (v *View) Origin() (x, y int) { } func (v *View) Write(p []byte) (n int, err error) { - pr := bytes.Runes(p) - v.buffer = append(v.buffer, pr...) - return len(pr), nil + r := bytes.NewReader(p) + s := bufio.NewScanner(r) + for s.Scan() { + line := bytes.Runes(s.Bytes()) + v.lines = append(v.lines, line) + } + if err := s.Err(); err != nil { + return 0, err + } + return len(p), nil } func (v *View) draw() error { maxX, maxY := v.Size() - buf := bytes.NewBufferString(string(v.buffer)) - br := bufio.NewReader(buf) - y := 0 - for i := 0; ; i++ { - line, _, err := br.ReadLine() - if err == io.EOF { - break - } else if err != nil { - return err - } + for i, line := range v.lines { if i < v.oy { continue } x := 0 - for j, ch := range bytes.Runes(line) { + for j, ch := range line { if j < v.ox { continue } @@ -126,7 +127,7 @@ func (v *View) draw() error { } func (v *View) Clear() { - v.buffer = nil + v.lines = nil v.clearRunes() }