Fix some split bugs

This commit is contained in:
Zachary Yedidia
2019-01-05 14:09:02 -05:00
parent 5201cb71b0
commit 23f5e9c770

View File

@@ -2,6 +2,7 @@ package views
import ( import (
"fmt" "fmt"
"log"
"strings" "strings"
) )
@@ -112,30 +113,28 @@ func (n *Node) vResizeSplit(i int, size int) bool {
if i < 0 || i >= len(n.children)-1 { if i < 0 || i >= len(n.children)-1 {
return false return false
} }
v1, v2 := n.children[i].GetView(), n.children[i+1].GetView() c1, c2 := n.children[i], n.children[i+1]
toth := v1.H + v2.H toth := c1.H + c2.H
if size >= toth { if size >= toth {
return false return false
} }
v1.H, v2.H = size, toth-size c2.Y = size
v2.Y = size c1.Resize(c1.W, size)
n.children[i].SetView(v1) c2.Resize(c2.W, toth-size)
n.children[i+1].SetView(v2)
return true return true
} }
func (n *Node) hResizeSplit(i int, size int) bool { func (n *Node) hResizeSplit(i int, size int) bool {
if i < 0 || i >= len(n.children)-1 { if i < 0 || i >= len(n.children)-1 {
return false return false
} }
v1, v2 := n.children[i].GetView(), n.children[i+1].GetView() c1, c2 := n.children[i], n.children[i+1]
totw := v1.W + v2.W totw := c1.W + c2.W
if size >= totw { if size >= totw {
return false return false
} }
v1.W, v2.W = size, totw-size c2.X = size
v2.X = size c1.Resize(size, c1.H)
n.children[i].SetView(v1) c2.Resize(totw-size, c2.H)
n.children[i+1].SetView(v2)
return true return true
} }
@@ -180,15 +179,15 @@ func (n *Node) vHSplit(i int, right bool) uint64 {
} }
n.children = append(n.children, hn1, hn2) n.children = append(n.children, hn1, hn2)
n.alignSize()
return newid return newid
} else { } else {
numr := 0 numr := 0
numnr := 0 numnr := 0
nonrh := 0 nonrh := 0
for _, c := range n.children { for _, c := range n.children {
view := c.GetView()
if !c.CanResize() { if !c.CanResize() {
nonrh += view.H nonrh += c.H
numnr++ numnr++
} else { } else {
numr++ numr++
@@ -212,18 +211,15 @@ func (n *Node) vHSplit(i int, right bool) uint64 {
copy(n.children[inspos+1:], n.children[inspos:]) copy(n.children[inspos+1:], n.children[inspos:])
n.children[inspos] = hn n.children[inspos] = hn
y := 0 y := n.Y
for _, c := range n.children { for _, c := range n.children {
view := c.GetView() c.Y = y
if c.CanResize() { if c.CanResize() {
view.H = height c.Resize(c.W, height)
view.Y = y
} else {
view.Y = y
} }
y += view.H y += c.H
c.SetView(view)
} }
n.alignSize()
return newid return newid
} }
} }
@@ -237,15 +233,15 @@ func (n *Node) hVSplit(i int, right bool) uint64 {
} }
n.children = append(n.children, vn1, vn2) n.children = append(n.children, vn1, vn2)
n.alignSize()
return newid return newid
} else { } else {
numr := 0 numr := 0
numnr := 0 numnr := 0
nonrw := 0 nonrw := 0
for _, c := range n.children { for _, c := range n.children {
view := c.GetView()
if !c.CanResize() { if !c.CanResize() {
nonrw += view.W nonrw += c.W
numnr++ numnr++
} else { } else {
numr++ numr++
@@ -269,18 +265,15 @@ func (n *Node) hVSplit(i int, right bool) uint64 {
copy(n.children[inspos+1:], n.children[inspos:]) copy(n.children[inspos+1:], n.children[inspos:])
n.children[inspos] = vn n.children[inspos] = vn
x := 0 x := n.X
for _, c := range n.children { for _, c := range n.children {
view := c.GetView() c.X = x
if c.CanResize() { if c.CanResize() {
view.W = width c.Resize(width, c.H)
view.X = x
} else {
view.X = x
} }
x += view.W x += c.W
c.SetView(view)
} }
n.alignSize()
return newid return newid
} }
} }
@@ -326,9 +319,34 @@ func (n *Node) Resize(w, h int) {
y += cH y += cH
} }
} }
n.alignSize()
n.W, n.H = w, h n.W, n.H = w, h
} }
func (n *Node) alignSize() {
if len(n.children) == 0 {
return
}
totw, toth := 0, 0
for _, c := range n.children {
if n.kind == STHoriz {
totw += c.W
} else {
toth += c.H
}
}
if n.kind == STVert && toth != n.H {
last := n.children[len(n.children)-1]
last.Resize(last.W, last.H+n.H-toth)
log.Println("bad height")
} else if n.kind == STHoriz && totw != n.W {
last := n.children[len(n.children)-1]
last.Resize(last.W+n.W-totw, last.H)
log.Println("bad width")
}
}
func (n *Node) Unsplit() { func (n *Node) Unsplit() {
} }