diff options
Diffstat (limited to 'lib/ui')
| -rw-r--r-- | lib/ui/interfaces.go | 7 | ||||
| -rw-r--r-- | lib/ui/tab.go | 28 | ||||
| -rw-r--r-- | lib/ui/ui.go | 1 | 
3 files changed, 36 insertions, 0 deletions
| diff --git a/lib/ui/interfaces.go b/lib/ui/interfaces.go index 0cdffc1..9008ea7 100644 --- a/lib/ui/interfaces.go +++ b/lib/ui/interfaces.go @@ -40,3 +40,10 @@ type Container interface {  	// recurse into your grandchildren).  	Children() []Drawable  } + +// A drawable that can be clicked +type Clickable interface { +	Drawable + +	MouseEvent(event tcell.Event) +} diff --git a/lib/ui/tab.go b/lib/ui/tab.go index 61d544a..0061472 100644 --- a/lib/ui/tab.go +++ b/lib/ui/tab.go @@ -126,6 +126,19 @@ func (tabs *Tabs) removeHistory(index int) {  	tabs.history = newHist  } +func (tabs *Tabs) MouseEvent(event tcell.Event) { +	switch event := event.(type) { +	case *tcell.EventMouse: +		if event.Buttons()&tcell.Button1 != 0 { +			x, y := event.Position() +			selectedTab, ok := tabs.TabStrip.Clicked(x, y) +			if ok { +				tabs.Select(selectedTab) +			} +		} +	} +} +  // TODO: Color repository  func (strip *TabStrip) Draw(ctx *Context) {  	x := 0 @@ -151,6 +164,21 @@ func (strip *TabStrip) OnInvalidate(onInvalidate func(d Drawable)) {  	strip.onInvalidateStrip = onInvalidate  } +func (strip *TabStrip) Clicked(mouseX int, mouseY int) (int, bool) { +	x := 0 +	if mouseY == 0 { +		for i, tab := range strip.Tabs { +			trunc := runewidth.Truncate(tab.Name, 32, "…") +			length := len(trunc) + 2 +			if x <= mouseX && mouseX < x+length { +				return i, true +			} +			x += length +		} +	} +	return 0, false +} +  func (content *TabContent) Children() []Drawable {  	children := make([]Drawable, len(content.Tabs))  	for i, tab := range content.Tabs { diff --git a/lib/ui/ui.go b/lib/ui/ui.go index f04d3d8..b057885 100644 --- a/lib/ui/ui.go +++ b/lib/ui/ui.go @@ -32,6 +32,7 @@ func Initialize(conf *config.AercConfig,  	screen.Clear()  	screen.HideCursor() +	screen.EnableMouse()  	width, height := screen.Size() | 
