aboutsummaryrefslogtreecommitdiff
path: root/lib/ui/tab.go
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ui/tab.go')
-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