voidterm/termutil/resize.go

94 lines
1.8 KiB
Go

package termutil
func (buffer *Buffer) shrink(width uint16) {
var replace []Line
prevCursor := int(buffer.cursorPosition.Line)
for i, line := range buffer.lines {
line.shrink(width)
// this line fits within the new width restriction, keep it as is and continue
if line.Len() <= width {
replace = append(replace, line)
continue
}
wrappedLines := line.wrap(width)
if prevCursor >= i {
buffer.cursorPosition.Line += uint64(len(wrappedLines) - 1)
}
replace = append(replace, wrappedLines...)
}
buffer.cursorPosition.Col = buffer.cursorPosition.Col % width
buffer.lines = replace
}
func (buffer *Buffer) grow(width uint16) {
var replace []Line
var current Line
prevCursor := int(buffer.cursorPosition.Line)
for i, line := range buffer.lines {
if !line.wrapped {
if i > 0 {
replace = append(replace, current)
}
current = newLine()
}
if i == prevCursor {
buffer.cursorPosition.Line -= uint64(i - len(replace))
}
for _, cell := range line.cells {
if len(current.cells) == int(width) {
replace = append(replace, current)
current = newLine()
current.wrapped = true
}
current.cells = append(current.cells, cell)
}
}
replace = append(replace, current)
buffer.lines = replace
}
// deprecated
func (buffer *Buffer) resizeView(width uint16, height uint16) {
if buffer.viewHeight == 0 {
buffer.viewWidth = width
buffer.viewHeight = height
return
}
// scroll to bottom
buffer.scrollLinesFromBottom = 0
if width < buffer.viewWidth { // wrap lines if we're shrinking
buffer.shrink(width)
buffer.grow(width)
} else if width > buffer.viewWidth { // unwrap lines if we're growing
buffer.grow(width)
}
buffer.viewWidth = width
buffer.viewHeight = height
buffer.resetVerticalMargins(uint(buffer.viewHeight))
}