From 3338dce8a16a860f455186ef9819e661a63577e2 Mon Sep 17 00:00:00 2001 From: Greg Anders Date: Tue, 5 Nov 2019 20:43:45 -0700 Subject: Allow fields in compose widget to be clicked When the mouse is enabled, clicking on a header field switches focus to that field (likewise for the terminal). --- widgets/compose.go | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) (limited to 'widgets') diff --git a/widgets/compose.go b/widgets/compose.go index cae5103..62aaafe 100644 --- a/widgets/compose.go +++ b/widgets/compose.go @@ -322,6 +322,16 @@ func (c *Composer) Event(event tcell.Event) bool { return false } +func (c *Composer) MouseEvent(localX int, localY int, event tcell.Event) { + c.grid.MouseEvent(localX, localY, event) + for _, e := range c.focusable { + he, ok := e.(*headerEditor) + if ok && he.focused { + c.FocusEditor(he) + } + } +} + func (c *Composer) Focus(focus bool) { c.focusable[c.focused].Focus(focus) } @@ -577,6 +587,18 @@ func (c *Composer) resetReview() { } } +func (c *Composer) termEvent(event tcell.Event) bool { + switch event := event.(type) { + case *tcell.EventMouse: + switch event.Buttons() { + case tcell.Button1: + c.FocusTerminal() + return true + } + } + return false +} + func (c *Composer) termClosed(err error) { c.grid.RemoveChild(c.editor) c.review = newReviewMessage(c, err) @@ -605,6 +627,7 @@ func (c *Composer) ShowTerminal() { } editor := exec.Command("/bin/sh", "-c", editorName+" "+c.email.Name()) c.editor, _ = NewTerminal(editor) // TODO: handle error + c.editor.OnEvent = c.termEvent c.editor.OnClose = c.termClosed c.grid.AddChild(c.editor).At(1, 0) c.focusable = append(c.focusable, c.editor) @@ -698,8 +721,9 @@ func (c *Composer) reloadEmail() error { } type headerEditor struct { - name string - input *ui.TextInput + name string + focused bool + input *ui.TextInput } func newHeaderEditor(name string, value string) *headerEditor { @@ -720,6 +744,11 @@ func (he *headerEditor) Draw(ctx *ui.Context) { func (he *headerEditor) MouseEvent(localX int, localY int, event tcell.Event) { switch event := event.(type) { case *tcell.EventMouse: + switch event.Buttons() { + case tcell.Button1: + he.focused = true + } + width := runewidth.StringWidth(he.name + " ") if localX >= width { he.input.MouseEvent(localX-width, localY, event) @@ -738,6 +767,7 @@ func (he *headerEditor) OnInvalidate(fn func(ui.Drawable)) { } func (he *headerEditor) Focus(focused bool) { + he.focused = focused he.input.Focus(focused) } -- cgit 1.4.1-2-gfad0