gocui/view.go

129 lines
2.3 KiB
Go
Raw Normal View History

2014-01-14 20:11:12 +01:00
// Copyright 2014 The gocui Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
2013-12-27 21:36:26 +01:00
package gocui
import (
2014-01-09 20:20:14 +01:00
"bufio"
"bytes"
2014-01-06 18:36:38 +01:00
"errors"
2014-01-09 20:20:14 +01:00
"io"
2013-12-31 21:23:28 +01:00
"github.com/nsf/termbox-go"
2013-12-27 21:36:26 +01:00
)
type View struct {
Name string
X0, Y0, X1, Y1 int
CX, CY int
2014-01-13 20:15:39 +01:00
OX, OY int
2014-01-10 12:38:08 +01:00
Highlight bool
buffer []rune
bgColor, fgColor Attribute
selBgColor, selFgColor Attribute
2013-12-27 21:36:26 +01:00
}
func newView(name string, x0, y0, x1, y1 int) *View {
v := &View{
2014-01-10 12:38:08 +01:00
Name: name,
X0: x0,
Y0: y0,
X1: x1,
Y1: y1,
}
return v
2013-12-27 21:36:26 +01:00
}
2014-01-06 18:36:38 +01:00
2014-01-09 20:20:14 +01:00
func (v *View) Size() (x, y int) {
return v.X1 - v.X0 - 1, v.Y1 - v.Y0 - 1
}
func (v *View) setRune(x, y int, ch rune) error {
2014-01-09 20:20:14 +01:00
maxX, maxY := v.Size()
if x < 0 || x >= maxX || y < 0 || y >= maxY {
return errors.New("invalid point")
}
2014-01-09 21:55:23 +01:00
var fgColor, bgColor Attribute
2014-01-10 12:38:08 +01:00
if v.Highlight && y == v.CY {
fgColor = v.selFgColor
bgColor = v.selBgColor
2014-01-09 21:55:23 +01:00
} else {
2014-01-10 12:38:08 +01:00
fgColor = v.fgColor
bgColor = v.bgColor
2014-01-09 21:55:23 +01:00
}
termbox.SetCell(v.X0+x+1, v.Y0+y+1, ch,
termbox.Attribute(fgColor), termbox.Attribute(bgColor))
2014-01-09 20:20:14 +01:00
return nil
}
func (v *View) SetCursor(x, y int) error {
2014-01-09 20:20:14 +01:00
maxX, maxY := v.Size()
if x < 0 || x >= maxX || y < 0 || y >= maxY {
2014-01-06 18:36:38 +01:00
return errors.New("invalid point")
}
v.CX = x
v.CY = y
return nil
}
2014-01-13 20:15:39 +01:00
func (v *View) SetOrigin(x, y int) {
v.OX = x
v.OY = y
}
2014-01-06 18:36:38 +01:00
func (v *View) Write(p []byte) (n int, err error) {
2014-01-09 20:20:14 +01:00
pr := bytes.Runes(p)
v.buffer = append(v.buffer, pr...)
return len(pr), nil
}
func (v *View) draw() error {
2014-01-09 20:20:14 +01:00
maxX, maxY := v.Size()
buf := bytes.NewBufferString(string(v.buffer))
br := bufio.NewReader(buf)
2014-01-10 12:38:08 +01:00
2014-01-13 20:21:49 +01:00
y := 0
for i := 0; ; i++ {
2014-01-09 20:20:14 +01:00
line, _, err := br.ReadLine()
if err == io.EOF {
break
} else if err != nil {
return err
}
2014-01-13 20:21:49 +01:00
if i < v.OY {
2014-01-13 20:15:39 +01:00
continue
}
x := 0
2014-01-13 20:21:49 +01:00
for j, ch := range bytes.Runes(line) {
if j < v.OX {
2014-01-13 20:15:39 +01:00
continue
}
2014-01-13 20:21:49 +01:00
if x >= 0 && x < maxX && y >= 0 && y < maxY {
if err := v.setRune(x, y, ch); err != nil {
2014-01-09 20:20:14 +01:00
return err
}
}
2014-01-13 20:15:39 +01:00
x++
2014-01-09 20:20:14 +01:00
}
2014-01-13 20:21:49 +01:00
y++
2014-01-09 20:20:14 +01:00
}
return nil
2014-01-06 18:36:38 +01:00
}
2014-01-10 12:38:08 +01:00
func (v *View) Clear() {
v.buffer = nil
2014-01-13 20:15:39 +01:00
v.clearRunes()
}
func (v *View) clearRunes() {
2014-01-10 12:38:08 +01:00
maxX, maxY := v.Size()
for x := 0; x < maxX; x++ {
for y := 0; y < maxY; y++ {
termbox.SetCell(v.X0+x+1, v.Y0+y+1, 0,
termbox.Attribute(v.fgColor), termbox.Attribute(v.bgColor))
}
}
}