mirror of https://github.com/liamg/aminal.git
83 lines
1.5 KiB
Go
83 lines
1.5 KiB
Go
package buffer
|
|
|
|
import (
|
|
"strings"
|
|
)
|
|
|
|
type Line struct {
|
|
wrapped bool // whether line was wrapped onto from the previous one
|
|
cells []Cell
|
|
}
|
|
|
|
func newLine() Line {
|
|
return Line{
|
|
wrapped: false,
|
|
cells: []Cell{},
|
|
}
|
|
}
|
|
|
|
func (line *Line) Cells() []Cell {
|
|
return line.cells
|
|
}
|
|
|
|
func (line *Line) ReverseVideo() {
|
|
for i := range line.cells {
|
|
line.cells[i].attr.ReverseVideo()
|
|
}
|
|
}
|
|
|
|
// Cleanse removes null bytes from the end of the row
|
|
func (line *Line) Cleanse() {
|
|
cut := 0
|
|
for i := len(line.cells) - 1; i >= 0; i-- {
|
|
if line.cells[i].r != 0 {
|
|
break
|
|
}
|
|
cut++
|
|
}
|
|
if cut == 0 {
|
|
return
|
|
}
|
|
line.cells = line.cells[:len(line.cells)-cut]
|
|
}
|
|
|
|
func (line *Line) setWrapped(wrapped bool) {
|
|
line.wrapped = wrapped
|
|
}
|
|
|
|
func (line *Line) String() string {
|
|
runes := []rune{}
|
|
for _, cell := range line.cells {
|
|
runes = append(runes, cell.r)
|
|
}
|
|
return strings.TrimRight(string(runes), "\x00 ")
|
|
}
|
|
|
|
// @todo test these (ported from legacy) ------------------
|
|
func (line *Line) CutCellsAfter(n int) []Cell {
|
|
cut := line.cells[n:]
|
|
line.cells = line.cells[:n]
|
|
return cut
|
|
}
|
|
|
|
func (line *Line) CutCellsFromBeginning(n int) []Cell {
|
|
if n > len(line.cells) {
|
|
n = len(line.cells)
|
|
}
|
|
cut := line.cells[:n]
|
|
line.cells = line.cells[n:]
|
|
return cut
|
|
}
|
|
|
|
func (line *Line) CutCellsFromEnd(n int) []Cell {
|
|
cut := line.cells[len(line.cells)-n:]
|
|
line.cells = line.cells[:len(line.cells)-n]
|
|
return cut
|
|
}
|
|
|
|
func (line *Line) Append(cells ...Cell) {
|
|
line.cells = append(line.cells, cells...)
|
|
}
|
|
|
|
// -------------------------------------------------------
|