diff options
-rw-r--r-- | commands/account/compose.go | 14 | ||||
-rw-r--r-- | commands/account/view-message.go | 5 | ||||
-rw-r--r-- | lib/ui/tab.go | 4 | ||||
-rw-r--r-- | lib/ui/textinput.go | 15 | ||||
-rw-r--r-- | widgets/compose.go | 12 |
5 files changed, 40 insertions, 10 deletions
diff --git a/commands/account/compose.go b/commands/account/compose.go index 10be9ae7..8097d107 100644 --- a/commands/account/compose.go +++ b/commands/account/compose.go @@ -3,8 +3,6 @@ package account import ( "errors" - "github.com/mattn/go-runewidth" - "git.sr.ht/~sircmpwn/aerc2/widgets" ) @@ -19,9 +17,15 @@ func Compose(aerc *widgets.Aerc, args []string) error { } acct := aerc.SelectedAccount() composer := widgets.NewComposer(aerc.Config(), acct.AccountConfig()) - // TODO: Change tab name when message subject changes - aerc.NewTab(composer, runewidth.Truncate( - "New email", 32, "…")) + tab := aerc.NewTab(composer, "New email") + composer.OnSubjectChange(func(subject string) { + if subject == "" { + tab.Name = "New email" + } else { + tab.Name = subject + } + tab.Content.Invalidate() + }) return nil } diff --git a/commands/account/view-message.go b/commands/account/view-message.go index ea6addc2..3697aa74 100644 --- a/commands/account/view-message.go +++ b/commands/account/view-message.go @@ -3,8 +3,6 @@ package account import ( "errors" - "github.com/mattn/go-runewidth" - "git.sr.ht/~sircmpwn/aerc2/widgets" ) @@ -26,8 +24,7 @@ func ViewMessage(aerc *widgets.Aerc, args []string) error { return nil } viewer := widgets.NewMessageViewer(aerc.Config(), store, msg) - aerc.NewTab(viewer, runewidth.Truncate( - msg.Envelope.Subject, 32, "…")) + aerc.NewTab(viewer, msg.Envelope.Subject) return nil } diff --git a/lib/ui/tab.go b/lib/ui/tab.go index 49bdffa8..c39e3273 100644 --- a/lib/ui/tab.go +++ b/lib/ui/tab.go @@ -2,6 +2,7 @@ package ui import ( "github.com/gdamore/tcell" + "github.com/mattn/go-runewidth" ) type Tabs struct { @@ -87,7 +88,8 @@ func (strip *TabStrip) Draw(ctx *Context) { if strip.Selected == i { style = tcell.StyleDefault } - x += ctx.Printf(x, 0, style, " %s ", tab.Name) + trunc := runewidth.Truncate(tab.Name, 32, "…") + x += ctx.Printf(x, 0, style, " %s ", trunc) } style := tcell.StyleDefault.Reverse(true) ctx.Fill(x, 0, ctx.Width()-x, 1, ' ', style) diff --git a/lib/ui/textinput.go b/lib/ui/textinput.go index 688d91da..9d2cdc7b 100644 --- a/lib/ui/textinput.go +++ b/lib/ui/textinput.go @@ -17,6 +17,7 @@ type TextInput struct { prompt string scroll int text []rune + change []func(ti *TextInput) } // Creates a new TextInput. TextInputs will render a "textbox" in the entire @@ -69,6 +70,7 @@ func (ti *TextInput) insert(ch rune) { ti.text = append(left, append([]rune{ch}, right...)...) ti.index++ ti.Invalidate() + ti.onChange() } func (ti *TextInput) deleteWord() { @@ -88,12 +90,14 @@ func (ti *TextInput) deleteWord() { ti.text = append(ti.text[:i+1], ti.text[ti.index:]...) ti.index = i + 1 ti.Invalidate() + ti.onChange() } func (ti *TextInput) deleteChar() { if len(ti.text) > 0 && ti.index != len(ti.text) { ti.text = append(ti.text[:ti.index], ti.text[ti.index+1:]...) ti.Invalidate() + ti.onChange() } } @@ -102,9 +106,20 @@ func (ti *TextInput) backspace() { ti.text = append(ti.text[:ti.index-1], ti.text[ti.index:]...) ti.index-- ti.Invalidate() + ti.onChange() } } +func (ti *TextInput) onChange() { + for _, change := range ti.change { + change(ti) + } +} + +func (ti *TextInput) OnChange(onChange func(ti *TextInput)) { + ti.change = append(ti.change, onChange) +} + func (ti *TextInput) Event(event tcell.Event) bool { switch event := event.(type) { case *tcell.EventKey: diff --git a/widgets/compose.go b/widgets/compose.go index 9460397c..71b55e7c 100644 --- a/widgets/compose.go +++ b/widgets/compose.go @@ -100,6 +100,12 @@ func NewComposer(conf *config.AercConfig, return c } +func (c *Composer) OnSubjectChange(fn func(subject string)) { + c.headers.subject.OnChange(func() { + fn(c.headers.subject.input.String()) + }) +} + func (c *Composer) Draw(ctx *ui.Context) { c.grid.Draw(ctx) } @@ -287,6 +293,12 @@ func (he *headerEditor) Event(event tcell.Event) bool { return he.input.Event(event) } +func (he *headerEditor) OnChange(fn func()) { + he.input.OnChange(func(_ *ui.TextInput) { + fn() + }) +} + type reviewMessage struct { composer *Composer grid *ui.Grid |