mirror of
https://github.com/jroimartin/gocui.git
synced 2025-04-24 13:48:51 +08:00
Add scroll support. First approach.
This commit is contained in:
parent
a7d5a3d2cc
commit
35b346590c
@ -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
1
gui.go
@ -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
25
view.go
@ -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++ {
|
||||
|
Loading…
x
Reference in New Issue
Block a user