mirror of
https://github.com/zyedidia/micro.git
synced 2026-03-16 05:47:06 +09:00
Fix some split bugs
This commit is contained in:
@@ -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() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user