diff options
-rw-r--r-- | lib/ui/grid.go | 6 | ||||
-rw-r--r-- | widgets/compose.go | 64 |
2 files changed, 61 insertions, 9 deletions
diff --git a/lib/ui/grid.go b/lib/ui/grid.go index f36a16ac..5011a818 100644 --- a/lib/ui/grid.go +++ b/lib/ui/grid.go @@ -181,10 +181,10 @@ func (grid *Grid) AddChild(content Drawable) *GridCell { return cell } -func (grid *Grid) RemoveChild(cell *GridCell) { +func (grid *Grid) RemoveChild(content Drawable) { grid.mutex.Lock() - for i, _cell := range grid.cells { - if _cell == cell { + for i, cell := range grid.cells { + if cell.Content == content { grid.cells = append(grid.cells[:i], grid.cells[i+1:]...) break } diff --git a/widgets/compose.go b/widgets/compose.go index 3d743017..5b7a1bac 100644 --- a/widgets/compose.go +++ b/widgets/compose.go @@ -12,11 +12,6 @@ import ( "git.sr.ht/~sircmpwn/aerc2/lib/ui" ) -type headerEditor struct { - name string - input *ui.TextInput -} - type Composer struct { headers struct { from *headerEditor @@ -29,6 +24,7 @@ type Composer struct { editor *Terminal email *os.File grid *ui.Grid + review *reviewMessage focusable []ui.DrawableInteractive focused int @@ -74,7 +70,7 @@ func NewComposer(conf *config.AccountConfig) *Composer { grid.AddChild(headers).At(0, 0) grid.AddChild(term).At(1, 0) - return &Composer{ + c := &Composer{ config: conf, editor: term, email: email, @@ -83,6 +79,10 @@ func NewComposer(conf *config.AccountConfig) *Composer { focused: 1, focusable: []ui.DrawableInteractive{from, to, subject, term}, } + + term.OnClose = c.termClosed + + return c } func (c *Composer) Draw(ctx *ui.Context) { @@ -107,6 +107,13 @@ func (c *Composer) Focus(focus bool) { c.focusable[c.focused].Focus(focus) } +func (c *Composer) termClosed(err error) { + // TODO: do we care about that error (note: yes, we do) + c.grid.RemoveChild(c.editor) + c.grid.AddChild(newReviewMessage(c)).At(1, 0) + c.editor.Destroy() +} + func (c *Composer) PrevField() { c.focusable[c.focused].Focus(false) c.focused-- @@ -122,6 +129,11 @@ func (c *Composer) NextField() { c.focusable[c.focused].Focus(true) } +type headerEditor struct { + name string + input *ui.TextInput +} + func newHeaderEditor(name string, value string) *headerEditor { return &headerEditor{ input: ui.NewTextInput(value), @@ -154,3 +166,43 @@ func (he *headerEditor) Focus(focused bool) { func (he *headerEditor) Event(event tcell.Event) bool { return he.input.Event(event) } + +type reviewMessage struct { + composer *Composer + grid *ui.Grid +} + +func newReviewMessage(composer *Composer) *reviewMessage { + grid := ui.NewGrid().Rows([]ui.GridSpec{ + {ui.SIZE_EXACT, 2}, + {ui.SIZE_EXACT, 1}, + {ui.SIZE_WEIGHT, 1}, + }).Columns([]ui.GridSpec{ + {ui.SIZE_WEIGHT, 1}, + }) + grid.AddChild(ui.NewText( + "Send this email? [y]es/[n]o/[e]dit/[a]ttach file")).At(0, 0) + grid.AddChild(ui.NewText("Attachments:"). + Reverse(true)).At(1, 0) + // TODO: Attachments + grid.AddChild(ui.NewText("(none)")).At(2, 0) + + return &reviewMessage{ + composer: composer, + grid: grid, + } +} + +func (rm *reviewMessage) Invalidate() { + rm.grid.Invalidate() +} + +func (rm *reviewMessage) OnInvalidate(fn func(ui.Drawable)) { + rm.grid.OnInvalidate(func(_ ui.Drawable) { + fn(rm) + }) +} + +func (rm *reviewMessage) Draw(ctx *ui.Context) { + rm.grid.Draw(ctx) +} |