diff options
author | Reto Brunner <reto@labrat.space> | 2019-06-02 20:13:18 +0200 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2019-06-02 14:22:04 -0400 |
commit | 92b10fcef561074208b725e79c71c9a60e52b6b6 (patch) | |
tree | 1cd41b556ece22ce9a3f84364de9b61f847dc196 | |
parent | 3a5b4c229e42c14b1389cd985506d09b3f17388b (diff) |
Add Tabs history
Fixes #77: When closing a tab, bring you back to the one you last had focused
-rw-r--r-- | lib/ui/tab.go | 38 |
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 |