~sircmpwn/aerc

92b10fcef561074208b725e79c71c9a60e52b6b6 — Reto Brunner 11 months ago 3a5b4c2
Add Tabs history

Fixes #77: When closing a tab, bring you back to the one you last had focused
1 files changed, 34 insertions(+), 4 deletions(-)

M lib/ui/tab.go
M lib/ui/tab.go => lib/ui/tab.go +34 -4
@@ 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