Add ability to delete splits
This commit is contained in:
parent
cbbe312762
commit
bd55c5f834
3 changed files with 51 additions and 2 deletions
|
@ -768,8 +768,9 @@ func (v *View) Quit() bool {
|
||||||
if v.CanClose("Quit anyway? (yes, no, save) ") {
|
if v.CanClose("Quit anyway? (yes, no, save) ") {
|
||||||
v.CloseBuffer()
|
v.CloseBuffer()
|
||||||
if len(tabs[curTab].views) > 1 {
|
if len(tabs[curTab].views) > 1 {
|
||||||
screen.Fini()
|
v.splitNode.Delete()
|
||||||
os.Exit(0)
|
tabs[v.TabNum].Cleanup()
|
||||||
|
tabs[v.TabNum].Resize()
|
||||||
} else if len(tabs) > 1 {
|
} else if len(tabs) > 1 {
|
||||||
if len(tabs[v.TabNum].views) == 1 {
|
if len(tabs[v.TabNum].views) == 1 {
|
||||||
tabs = tabs[:v.TabNum+copy(tabs[v.TabNum:], tabs[v.TabNum+1:])]
|
tabs = tabs[:v.TabNum+copy(tabs[v.TabNum:], tabs[v.TabNum+1:])]
|
||||||
|
|
|
@ -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() {
|
func (s *SplitTree) ResizeSplits() {
|
||||||
for i, node := range s.children {
|
for i, node := range s.children {
|
||||||
if n, ok := node.(*LeafNode); ok {
|
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.y = s.y + n.view.height*i
|
||||||
n.view.x = s.x
|
n.view.x = s.x
|
||||||
}
|
}
|
||||||
|
n.view.matches = Match(n.view)
|
||||||
} else if n, ok := node.(*SplitTree); ok {
|
} else if n, ok := node.(*SplitTree); ok {
|
||||||
if s.kind == VerticalSplit {
|
if s.kind == VerticalSplit {
|
||||||
n.width = s.width / len(s.children)
|
n.width = s.width / len(s.children)
|
||||||
|
@ -140,6 +175,15 @@ func search(haystack []Node, needle Node) int {
|
||||||
return 0
|
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) VSplit(buf *Buffer) {}
|
||||||
func (s *SplitTree) HSplit(buf *Buffer) {}
|
func (s *SplitTree) HSplit(buf *Buffer) {}
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,10 @@ func (t *Tab) SetNum(num int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *Tab) Cleanup() {
|
||||||
|
t.tree.Cleanup()
|
||||||
|
}
|
||||||
|
|
||||||
func (t *Tab) Resize() {
|
func (t *Tab) Resize() {
|
||||||
t.tree.ResizeSplits()
|
t.tree.ResizeSplits()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue