Refactoring. Split Views internal buffer in lines.

This commit is contained in:
Roi Martin (@nibble_ds) 2014-01-18 12:31:53 +01:00
parent 4112df7d76
commit db002da861
3 changed files with 33 additions and 26 deletions

View File

@ -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 {

4
gui.go
View File

@ -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

37
view.go
View File

@ -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()
}