mirror of
https://github.com/jroimartin/gocui.git
synced 2025-04-24 13:48:51 +08:00
Refactoring. Split Views internal buffer in lines.
This commit is contained in:
parent
4112df7d76
commit
db002da861
@ -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
4
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
|
||||
|
37
view.go
37
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()
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user