aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2019-05-12 11:21:28 -0400
committerDrew DeVault <sir@cmpwn.com>2019-05-12 11:21:28 -0400
commitf37508a53980f38c530780650338797e81fe1e3c (patch)
tree17425d8d9426a4e8a51116cc299bca7be5baab4c
parent2a4dd5cb87179d8ffc00bad2552880f9bd50b75f (diff)
downloadaerc-f37508a53980f38c530780650338797e81fe1e3c.tar.gz
Implement :{next,prev}-field in compose view
-rw-r--r--aerc.go3
-rw-r--r--commands/compose/compose.go16
-rw-r--r--commands/compose/next-field.go30
-rw-r--r--lib/ui/textinput.go6
-rw-r--r--widgets/compose.go17
-rw-r--r--widgets/terminal.go3
6 files changed, 70 insertions, 5 deletions
diff --git a/aerc.go b/aerc.go
index 978d448e..f3607bb7 100644
--- a/aerc.go
+++ b/aerc.go
@@ -12,6 +12,7 @@ import (
"git.sr.ht/~sircmpwn/aerc2/config"
"git.sr.ht/~sircmpwn/aerc2/commands"
"git.sr.ht/~sircmpwn/aerc2/commands/account"
+ "git.sr.ht/~sircmpwn/aerc2/commands/compose"
"git.sr.ht/~sircmpwn/aerc2/commands/msgview"
"git.sr.ht/~sircmpwn/aerc2/commands/terminal"
libui "git.sr.ht/~sircmpwn/aerc2/lib/ui"
@@ -27,7 +28,7 @@ func getCommands(selected libui.Drawable) []*commands.Commands {
}
case *widgets.Composer:
return []*commands.Commands{
- // TODO: compose-specific commands
+ compose.ComposeCommands,
commands.GlobalCommands,
}
case *widgets.MessageViewer:
diff --git a/commands/compose/compose.go b/commands/compose/compose.go
new file mode 100644
index 00000000..ea533167
--- /dev/null
+++ b/commands/compose/compose.go
@@ -0,0 +1,16 @@
+package compose
+
+import (
+ "git.sr.ht/~sircmpwn/aerc2/commands"
+)
+
+var (
+ ComposeCommands *commands.Commands
+)
+
+func register(name string, cmd commands.AercCommand) {
+ if ComposeCommands == nil {
+ ComposeCommands = commands.NewCommands()
+ }
+ ComposeCommands.Register(name, cmd)
+}
diff --git a/commands/compose/next-field.go b/commands/compose/next-field.go
new file mode 100644
index 00000000..2c3b4140
--- /dev/null
+++ b/commands/compose/next-field.go
@@ -0,0 +1,30 @@
+package compose
+
+import (
+ "errors"
+ "fmt"
+
+ "git.sr.ht/~sircmpwn/aerc2/widgets"
+)
+
+func init() {
+ register("next-field", NextPrevField)
+ register("prev-field", NextPrevField)
+}
+
+func nextPrevFieldUsage(cmd string) error {
+ return errors.New(fmt.Sprintf("Usage: %s", cmd))
+}
+
+func NextPrevField(aerc *widgets.Aerc, args []string) error {
+ if len(args) > 2 {
+ return nextPrevFieldUsage(args[0])
+ }
+ composer, _ := aerc.SelectedTab().(*widgets.Composer)
+ if args[0] == "prev-field" {
+ composer.PrevField()
+ } else {
+ composer.NextField()
+ }
+ return nil
+}
diff --git a/lib/ui/textinput.go b/lib/ui/textinput.go
index 3e1f68a8..688d91da 100644
--- a/lib/ui/textinput.go
+++ b/lib/ui/textinput.go
@@ -47,9 +47,9 @@ func (ti *TextInput) Draw(ctx *Context) {
ti.ctx = ctx // gross
ctx.Fill(0, 0, ctx.Width(), ctx.Height(), ' ', tcell.StyleDefault)
ctx.Printf(0, 0, tcell.StyleDefault, "%s%s", ti.prompt, string(ti.text))
- cells := runewidth.StringWidth(string(ti.text[:ti.index]))
- if cells != ti.cells {
- ctx.SetCursor(cells+1, 0)
+ cells := runewidth.StringWidth(string(ti.text[:ti.index]) + ti.prompt)
+ if cells != ti.cells && ti.focus {
+ ctx.SetCursor(cells, 0)
}
}
diff --git a/widgets/compose.go b/widgets/compose.go
index 10d14f72..f07e3ee1 100644
--- a/widgets/compose.go
+++ b/widgets/compose.go
@@ -67,7 +67,7 @@ func NewComposer() *Composer {
grid: grid,
editor: term,
// You have to backtab to get to "From", since you usually don't edit it
- focused: 3,
+ focused: 1,
focusable: []ui.DrawableInteractive{
from,
to,
@@ -99,6 +99,21 @@ func (c *Composer) Focus(focus bool) {
c.focusable[c.focused].Focus(focus)
}
+func (c *Composer) PrevField() {
+ c.focusable[c.focused].Focus(false)
+ c.focused--
+ if c.focused == -1 {
+ c.focused = len(c.focusable) - 1
+ }
+ c.focusable[c.focused].Focus(true)
+}
+
+func (c *Composer) NextField() {
+ c.focusable[c.focused].Focus(false)
+ c.focused = (c.focused + 1) % len(c.focusable)
+ c.focusable[c.focused].Focus(true)
+}
+
func newHeaderEditor(name string, value string) *headerEditor {
return &headerEditor{
input: ui.NewTextInput(value),
diff --git a/widgets/terminal.go b/widgets/terminal.go
index 92736d5b..ee99b601 100644
--- a/widgets/terminal.go
+++ b/widgets/terminal.go
@@ -273,6 +273,8 @@ func (term *Terminal) Draw(ctx *ui.Context) {
if ctx.Width() != cols || ctx.Height() != rows {
pty.Setsize(term.pty, &winsize)
term.vterm.SetSize(ctx.Height(), ctx.Width())
+ rect := vterm.NewRect(0, ctx.Width(), 0, ctx.Height())
+ term.damage = append(term.damage, *rect)
return
}
}
@@ -333,6 +335,7 @@ func (term *Terminal) Focus(focus bool) {
state := term.vterm.ObtainState()
row, col := state.GetCursorPos()
term.ctx.SetCursor(col, row)
+ term.Invalidate()
}
}
}