mirror of
https://github.com/jroimartin/gocui.git
synced 2025-04-28 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()
|
cx, cy := v.Cursor()
|
||||||
if err := v.SetCursor(cx, cy+1); err != nil {
|
if err := v.SetCursor(cx, cy+1); err != nil {
|
||||||
ox, oy := v.Origin()
|
ox, oy := v.Origin()
|
||||||
v.SetOrigin(ox, oy+1)
|
if err := v.SetOrigin(ox, oy+1); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
@ -48,7 +50,9 @@ func cursorUp(g *gocui.Gui, v *gocui.View) error {
|
|||||||
ox, oy := v.Origin()
|
ox, oy := v.Origin()
|
||||||
cx, cy := v.Cursor()
|
cx, cy := v.Cursor()
|
||||||
if err := v.SetCursor(cx, cy-1); err != nil && oy > 0 {
|
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
|
return nil
|
||||||
@ -59,7 +63,9 @@ func cursorLeft(g *gocui.Gui, v *gocui.View) error {
|
|||||||
ox, oy := v.Origin()
|
ox, oy := v.Origin()
|
||||||
cx, cy := v.Cursor()
|
cx, cy := v.Cursor()
|
||||||
if err := v.SetCursor(cx-1, cy); err != nil && ox > 0 {
|
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
|
return nil
|
||||||
@ -70,7 +76,9 @@ func cursorRight(g *gocui.Gui, v *gocui.View) error {
|
|||||||
cx, cy := v.Cursor()
|
cx, cy := v.Cursor()
|
||||||
if err := v.SetCursor(cx+1, cy); err != nil {
|
if err := v.SetCursor(cx+1, cy); err != nil {
|
||||||
ox, oy := v.Origin()
|
ox, oy := v.Origin()
|
||||||
v.SetOrigin(ox+1, oy)
|
if err := v.SetOrigin(ox+1, oy); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
@ -99,7 +107,7 @@ func setLayout2(g *gocui.Gui, v *gocui.View) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func keybindings(g *gocui.Gui) 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
|
return err
|
||||||
}
|
}
|
||||||
if err := g.SetKeybinding("", gocui.KeyCtrlS, 0, focusSide); err != nil {
|
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 {
|
if kb.CB == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if err := kb.CB(g, g.currentView); err != nil {
|
return kb.CB(g, g.currentView)
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
37
view.go
37
view.go
@ -8,7 +8,6 @@ import (
|
|||||||
"bufio"
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"io"
|
|
||||||
|
|
||||||
"github.com/nsf/termbox-go"
|
"github.com/nsf/termbox-go"
|
||||||
)
|
)
|
||||||
@ -18,7 +17,7 @@ type View struct {
|
|||||||
x0, y0, x1, y1 int
|
x0, y0, x1, y1 int
|
||||||
ox, oy int
|
ox, oy int
|
||||||
cx, cy int
|
cx, cy int
|
||||||
buffer []rune
|
lines [][]rune
|
||||||
bgColor, fgColor Attribute
|
bgColor, fgColor Attribute
|
||||||
selBgColor, selFgColor Attribute
|
selBgColor, selFgColor Attribute
|
||||||
|
|
||||||
@ -77,9 +76,13 @@ func (v *View) Cursor() (x, y int) {
|
|||||||
return v.cx, v.cy
|
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.ox = x
|
||||||
v.oy = y
|
v.oy = y
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *View) Origin() (x, y int) {
|
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) {
|
func (v *View) Write(p []byte) (n int, err error) {
|
||||||
pr := bytes.Runes(p)
|
r := bytes.NewReader(p)
|
||||||
v.buffer = append(v.buffer, pr...)
|
s := bufio.NewScanner(r)
|
||||||
return len(pr), nil
|
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 {
|
func (v *View) draw() error {
|
||||||
maxX, maxY := v.Size()
|
maxX, maxY := v.Size()
|
||||||
buf := bytes.NewBufferString(string(v.buffer))
|
|
||||||
br := bufio.NewReader(buf)
|
|
||||||
|
|
||||||
y := 0
|
y := 0
|
||||||
for i := 0; ; i++ {
|
for i, line := range v.lines {
|
||||||
line, _, err := br.ReadLine()
|
|
||||||
if err == io.EOF {
|
|
||||||
break
|
|
||||||
} else if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if i < v.oy {
|
if i < v.oy {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
x := 0
|
x := 0
|
||||||
for j, ch := range bytes.Runes(line) {
|
for j, ch := range line {
|
||||||
if j < v.ox {
|
if j < v.ox {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@ -126,7 +127,7 @@ func (v *View) draw() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (v *View) Clear() {
|
func (v *View) Clear() {
|
||||||
v.buffer = nil
|
v.lines = nil
|
||||||
v.clearRunes()
|
v.clearRunes()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user