Add ability to delete splits

This commit is contained in:
Zachary Yedidia 2016-08-11 11:27:32 -04:00
parent cbbe312762
commit bd55c5f834
3 changed files with 51 additions and 2 deletions

View file

@ -768,8 +768,9 @@ func (v *View) Quit() bool {
if v.CanClose("Quit anyway? (yes, no, save) ") {
v.CloseBuffer()
if len(tabs[curTab].views) > 1 {
screen.Fini()
os.Exit(0)
v.splitNode.Delete()
tabs[v.TabNum].Cleanup()
tabs[v.TabNum].Resize()
} else if len(tabs) > 1 {
if len(tabs[v.TabNum].views) == 1 {
tabs = tabs[:v.TabNum+copy(tabs[v.TabNum:], tabs[v.TabNum+1:])]

View file

@ -92,6 +92,40 @@ func (l *LeafNode) HSplit(buf *Buffer) {
}
}
func (l *LeafNode) Delete() {
i := search(l.parent.children, l)
copy(l.parent.children[i:], l.parent.children[i+1:])
l.parent.children[len(l.parent.children)-1] = nil
l.parent.children = l.parent.children[:len(l.parent.children)-1]
tab := tabs[l.parent.tabNum]
j := findView(tab.views, l.view)
copy(tab.views[j:], tab.views[j+1:])
tab.views[len(tab.views)-1] = nil // or the zero value of T
tab.views = tab.views[:len(tab.views)-1]
for i, v := range tab.views {
v.Num = i
}
if tab.curView > 0 {
tab.curView--
}
}
func (s *SplitTree) Cleanup() {
for i, node := range s.children {
if n, ok := node.(*SplitTree); ok {
if len(n.children) == 1 {
if _, ok := n.children[0].(*LeafNode); ok {
s.children[i] = n.children[0]
}
}
n.Cleanup()
}
}
}
func (s *SplitTree) ResizeSplits() {
for i, node := range s.children {
if n, ok := node.(*LeafNode); ok {
@ -108,6 +142,7 @@ func (s *SplitTree) ResizeSplits() {
n.view.y = s.y + n.view.height*i
n.view.x = s.x
}
n.view.matches = Match(n.view)
} else if n, ok := node.(*SplitTree); ok {
if s.kind == VerticalSplit {
n.width = s.width / len(s.children)
@ -140,6 +175,15 @@ func search(haystack []Node, needle Node) int {
return 0
}
func findView(haystack []*View, needle *View) int {
for i, x := range haystack {
if x == needle {
return i
}
}
return 0
}
func (s *SplitTree) VSplit(buf *Buffer) {}
func (s *SplitTree) HSplit(buf *Buffer) {}

View file

@ -42,6 +42,10 @@ func (t *Tab) SetNum(num int) {
}
}
func (t *Tab) Cleanup() {
t.tree.Cleanup()
}
func (t *Tab) Resize() {
t.tree.ResizeSplits()
}