aerc

Working clone of aerc-mail.org
git clone git://git.danielmoch.com/aerc.git
Log | Files | Refs | README | LICENSE

commit 92b10fcef561074208b725e79c71c9a60e52b6b6
parent 3a5b4c229e42c14b1389cd985506d09b3f17388b
Author: Reto Brunner <reto@labrat.space>
Date:   Sun,  2 Jun 2019 20:13:18 +0200

Add Tabs history

Fixes #77: When closing a tab, bring you back to the one you last had focused

Diffstat:
Mlib/ui/tab.go | 38++++++++++++++++++++++++++++++++++----
1 file changed, 34 insertions(+), 4 deletions(-)

diff --git 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