about summary refs log tree commit diff stats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/ui/tab.go38
1 files changed, 34 insertions, 4 deletions
diff --git a/lib/ui/tab.go b/lib/ui/tab.go
index c39e327..2ab703a 100644
--- a/lib/ui/tab.go
+++ b/lib/ui/tab.go
@@ -10,6 +10,7 @@ type Tabs struct {
 	TabStrip   *TabStrip
 	TabContent *TabContent
 	Selected   int
+	history    []int
 
 	onInvalidateStrip   func(d Drawable)
 	onInvalidateContent func(d Drawable)
@@ -28,6 +29,7 @@ func NewTabs() *Tabs {
 	tabs := &Tabs{}
 	tabs.TabStrip = (*TabStrip)(tabs)
 	tabs.TabContent = (*TabContent)(tabs)
+	tabs.history = []int{0}
 	return tabs
 }
 
@@ -58,13 +60,11 @@ func (tabs *Tabs) Remove(content Drawable) {
 	for i, tab := range tabs.Tabs {
 		if tab.Content == content {
 			tabs.Tabs = append(tabs.Tabs[:i], tabs.Tabs[i+1:]...)
+			tabs.removeHistory(i)
 			break
 		}
 	}
-	/* Force the selected index into the existing range */
-	if tabs.Selected >= len(tabs.Tabs) {
-		tabs.Select(tabs.Selected - 1)
-	}
+	tabs.Select(tabs.popHistory())
 	tabs.TabStrip.Invalidate()
 }
 
@@ -75,11 +75,41 @@ func (tabs *Tabs) Select(index int) {
 
 	if tabs.Selected != index {
 		tabs.Selected = index
+		tabs.pushHistory(index)
 		tabs.TabStrip.Invalidate()
 		tabs.TabContent.Invalidate()
 	}
 }
 
+func (tabs *Tabs) pushHistory(index int) {
+	tabs.history = append(tabs.history, index)
+}
+
+func (tabs *Tabs) popHistory() int {
+	lastIdx := len(tabs.history) - 1
+	item := tabs.history[lastIdx]
+	tabs.history = tabs.history[:lastIdx]
+	return item
+}
+
+func (tabs *Tabs) removeHistory(index int) {
+	newHist := make([]int, 0, len(tabs.history))
+	for i, item := range tabs.history {
+		if item == index {
+			continue
+		}
+		if item > index {
+			item = item - 1
+		}
+		// dedup
+		if i > 0 && item == newHist[len(newHist)-1] {
+			continue
+		}
+		newHist = append(newHist, item)
+	}
+	tabs.history = newHist
+}
+
 // TODO: Color repository
 func (strip *TabStrip) Draw(ctx *Context) {
 	x := 0