aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/ui/interfaces.go7
-rw-r--r--lib/ui/tab.go28
-rw-r--r--lib/ui/ui.go1
3 files changed, 36 insertions, 0 deletions
diff --git a/lib/ui/interfaces.go b/lib/ui/interfaces.go
index 0cdffc1e..9008ea72 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 61d544ad..00614723 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 f04d3d8a..b0578852 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()