97 lines
2 KiB
Go
97 lines
2 KiB
Go
package field
|
|
|
|
func (f *Field) Blank(x, y int) {
|
|
if !f.isIn(x, y) {
|
|
// outside the field, nothing to do
|
|
return
|
|
}
|
|
l := &f.lines[y-f.y]
|
|
if x < l.x || x >= l.x+l.l {
|
|
// outside the current line's columns
|
|
return
|
|
}
|
|
if x > l.x && x < l.x+l.l-1 {
|
|
// just set the value
|
|
l.columns[x-l.x] = ' '
|
|
return
|
|
}
|
|
// do we need to trim this line?
|
|
if l.l == 1 {
|
|
// this was the last character on the line
|
|
if y == f.y {
|
|
// We need to trim the leading lines
|
|
leadingLines := 1
|
|
for i := 1; i < f.ly; i++ {
|
|
if f.lines[i].l == 0 {
|
|
leadingLines++
|
|
} else {
|
|
break
|
|
}
|
|
}
|
|
f.y += leadingLines
|
|
f.ly -= leadingLines
|
|
lines := make([]Line, f.ly)
|
|
for i := 0; i < f.ly; i++ {
|
|
lines[i] = f.lines[leadingLines+i]
|
|
}
|
|
f.lines = lines
|
|
} else if y == f.y+f.ly-1 {
|
|
// We need to trim the trailing lines
|
|
trailingLines := 1
|
|
for i := f.ly + f.y - 2; i >= 0; i-- {
|
|
if f.lines[i].l == 0 {
|
|
trailingLines++
|
|
} else {
|
|
break
|
|
}
|
|
}
|
|
f.ly -= trailingLines
|
|
f.lines = f.lines[:f.ly]
|
|
} else {
|
|
// it was a line in the middle
|
|
l.l = 0
|
|
l.columns = make([]int, 0)
|
|
}
|
|
} else if x == l.x {
|
|
// We need to remove leading spaces
|
|
leadingSpaces := 1
|
|
for i := 1; i < l.l; i++ {
|
|
if l.columns[i] == ' ' {
|
|
leadingSpaces++
|
|
} else {
|
|
break
|
|
}
|
|
}
|
|
l.x += leadingSpaces
|
|
l.l -= leadingSpaces
|
|
columns := make([]int, l.l)
|
|
for i := 0; i < l.l; i++ {
|
|
columns[i] = l.columns[leadingSpaces+i]
|
|
}
|
|
l.columns = columns
|
|
} else if x == l.l+l.x-1 {
|
|
// we need to remove trailing spaces
|
|
trailingSpaces := 1
|
|
for i := l.l - 2; i >= 0; i-- {
|
|
if l.columns[i] == ' ' {
|
|
trailingSpaces++
|
|
} else {
|
|
break
|
|
}
|
|
}
|
|
l.l -= trailingSpaces
|
|
l.columns = l.columns[:l.l]
|
|
}
|
|
// we now need to find the new field limits
|
|
f.x = f.lines[0].x
|
|
x2 := f.lines[0].l + f.lines[0].x
|
|
for i := 1; i < f.ly; i++ {
|
|
if f.x > f.lines[i].x {
|
|
f.x = f.lines[i].x
|
|
}
|
|
if x2 < f.lines[i].x+f.lines[i].l {
|
|
x2 = f.lines[i].x + f.lines[i].l
|
|
}
|
|
}
|
|
f.lx = x2 - f.x
|
|
}
|