Add scroll support. First approach.

This commit is contained in:
Roi Martin (@nibble_ds) 2014-01-13 20:15:39 +01:00
parent a7d5a3d2cc
commit 35b346590c
3 changed files with 35 additions and 7 deletions

View File

@ -29,28 +29,36 @@ func showHideCursor(g *gocui.Gui, v *gocui.View) error {
func cursorDown(g *gocui.Gui, v *gocui.View) error {
if v != nil {
v.SetCursor(v.CX, v.CY+1)
if err := v.SetCursor(v.CX, v.CY+1); err != nil {
v.SetOrigin(v.OX, v.OY+1)
}
}
return nil
}
func cursorUp(g *gocui.Gui, v *gocui.View) error {
if v != nil {
v.SetCursor(v.CX, v.CY-1)
if err := v.SetCursor(v.CX, v.CY-1); err != nil && v.OY > 0 {
v.SetOrigin(v.OX, v.OY-1)
}
}
return nil
}
func cursorLeft(g *gocui.Gui, v *gocui.View) error {
if v != nil {
v.SetCursor(v.CX-1, v.CY)
if err := v.SetCursor(v.CX-1, v.CY); err != nil && v.OX > 0 {
v.SetOrigin(v.OX-1, v.OY)
}
}
return nil
}
func cursorRight(g *gocui.Gui, v *gocui.View) error {
if v != nil {
v.SetCursor(v.CX+1, v.CY)
if err := v.SetCursor(v.CX+1, v.CY); err != nil {
v.SetOrigin(v.OX+1, v.OY)
}
}
return nil
}

1
gui.go
View File

@ -203,6 +203,7 @@ func (g *Gui) draw() (err error) {
}
for _, v := range g.views {
v.clearRunes()
if err := v.draw(); err != nil {
return err
}

25
view.go
View File

@ -13,6 +13,7 @@ type View struct {
Name string
X0, Y0, X1, Y1 int
CX, CY int
OX, OY int
Highlight bool
buffer []rune
bgColor, fgColor Attribute
@ -73,6 +74,11 @@ func (v *View) SetCursor(x, y int) (err error) {
return nil
}
func (v *View) SetOrigin(x, y int) {
v.OX = x
v.OY = y
}
func (v *View) Write(p []byte) (n int, err error) {
pr := bytes.Runes(p)
v.buffer = append(v.buffer, pr...)
@ -84,26 +90,39 @@ func (v *View) draw() (err error) {
buf := bytes.NewBufferString(string(v.buffer))
br := bufio.NewReader(buf)
for nl := 0; ; nl++ {
for y, nl := 0, 0; ; y++ {
line, _, err := br.ReadLine()
if err == io.EOF {
break
} else if err != nil {
return err
}
if y < v.OY {
continue
}
x := 0
for i, ch := range bytes.Runes(line) {
if i >= 0 && i < maxX && nl >= 0 && nl < maxY {
if err := v.SetRune(i, nl, ch); err != nil {
if i < v.OX {
continue
}
if x >= 0 && x < maxX && nl >= 0 && nl < maxY {
if err := v.SetRune(x, nl, ch); err != nil {
return err
}
}
x++
}
nl++
}
return nil
}
func (v *View) Clear() {
v.buffer = nil
v.clearRunes()
}
func (v *View) clearRunes() {
maxX, maxY := v.Size()
for x := 0; x < maxX; x++ {
for y := 0; y < maxY; y++ {