~sircmpwn/aerc

753adb90692e4821f8caea1d5d86cd69e312efa7 — Kevin Kuehler 1 year, 5 months ago 2be985f
widget: Add ProvidesMessage interface

Consists of 3 functions
* Store: Access to MessageStore type
* SelectedAccount: Access to Account widget that the target widget
belongs to
* SelectedMessage: Current message (selected in msglist or the one we
are viewing)

Signed-off-by: Kevin Kuehler <keur@ocf.berkeley.edu>
10 files changed, 93 insertions(+), 18 deletions(-)

M aerc.go
M commands/account/view.go
R commands/account/{copy.go => .go}
R commands/account/{delete.go => te.go}
R commands/account/{move.go => .go}
A commands/msg/msg.go
R commands/account/{reply.go => y.go}
M widgets/account.go
M widgets/msgviewer.go
A widgets/providesmessage.go
M aerc.go => aerc.go +3 -0
@@ 13,6 13,7 @@ import (
	"git.sr.ht/~sircmpwn/aerc/commands"
	"git.sr.ht/~sircmpwn/aerc/commands/account"
	"git.sr.ht/~sircmpwn/aerc/commands/compose"
	"git.sr.ht/~sircmpwn/aerc/commands/msg"
	"git.sr.ht/~sircmpwn/aerc/commands/msgview"
	"git.sr.ht/~sircmpwn/aerc/commands/terminal"
	"git.sr.ht/~sircmpwn/aerc/config"


@@ 25,6 26,7 @@ func getCommands(selected libui.Drawable) []*commands.Commands {
	case *widgets.AccountView:
		return []*commands.Commands{
			account.AccountCommands,
			msg.MessageCommands,
			commands.GlobalCommands,
		}
	case *widgets.Composer:


@@ 35,6 37,7 @@ func getCommands(selected libui.Drawable) []*commands.Commands {
	case *widgets.MessageViewer:
		return []*commands.Commands{
			msgview.MessageViewCommands,
			msg.MessageCommands,
			commands.GlobalCommands,
		}
	case *widgets.Terminal:

M commands/account/view.go => commands/account/view.go +1 -1
@@ 24,7 24,7 @@ func ViewMessage(aerc *widgets.Aerc, args []string) error {
	if msg == nil {
		return nil
	}
	viewer := widgets.NewMessageViewer(aerc.Config(), store, msg)
	viewer := widgets.NewMessageViewer(acct, aerc.Config(), store, msg)
	aerc.NewTab(viewer, msg.Envelope.Subject)
	return nil
}

R commands/account/copy.go => commands/msg/copy.go +5 -4
@@ 1,4 1,4 @@
package account
package msg

import (
	"errors"


@@ 19,12 19,13 @@ func Copy(aerc *widgets.Aerc, args []string) error {
	if len(args) != 2 {
		return errors.New("Usage: mv <folder>")
	}
	acct := aerc.SelectedAccount()
	widget := aerc.SelectedTab().(widgets.ProvidesMessage)
	acct := widget.SelectedAccount()
	if acct == nil {
		return errors.New("No account selected")
	}
	msg := acct.Messages().Selected()
	store := acct.Messages().Store()
	msg := widget.SelectedMessage()
	store := widget.Store()
	store.Copy([]uint32{msg.Uid}, args[1], func(msg types.WorkerMessage) {
		switch msg := msg.(type) {
		case *types.Done:

R commands/account/delete.go => commands/msg/delete.go +10 -4
@@ 1,4 1,4 @@
package account
package msg

import (
	"errors"


@@ 19,12 19,18 @@ func DeleteMessage(aerc *widgets.Aerc, args []string) error {
	if len(args) != 1 {
		return errors.New("Usage: :delete")
	}
	acct := aerc.SelectedAccount()

	widget := aerc.SelectedTab().(widgets.ProvidesMessage)
	acct := widget.SelectedAccount()
	if acct == nil {
		return errors.New("No account selected")
	}
	store := acct.Messages().Store()
	msg := acct.Messages().Selected()
	store := widget.Store()
	msg := widget.SelectedMessage()
	_, isMsgView := widget.(*widgets.MessageViewer)
	if isMsgView {
		aerc.RemoveTab(widget)
	}
	acct.Messages().Next()
	store.Delete([]uint32{msg.Uid}, func(msg types.WorkerMessage) {
		switch msg := msg.(type) {

R commands/account/move.go => commands/msg/move.go +9 -4
@@ 1,4 1,4 @@
package account
package msg

import (
	"errors"


@@ 19,12 19,17 @@ func Move(aerc *widgets.Aerc, args []string) error {
	if len(args) != 2 {
		return errors.New("Usage: mv <folder>")
	}
	acct := aerc.SelectedAccount()
	widget := aerc.SelectedTab().(widgets.ProvidesMessage)
	acct := widget.SelectedAccount()
	if acct == nil {
		return errors.New("No account selected")
	}
	msg := acct.Messages().Selected()
	store := acct.Messages().Store()
	msg := widget.SelectedMessage()
	store := widget.Store()
	_, isMsgView := widget.(*widgets.MessageViewer)
	if isMsgView {
		aerc.RemoveTab(widget)
	}
	acct.Messages().Next()
	store.Move([]uint32{msg.Uid}, args[1], func(msg types.WorkerMessage) {
		switch msg := msg.(type) {

A commands/msg/msg.go => commands/msg/msg.go +16 -0
@@ 0,0 1,16 @@
package msg

import (
	"git.sr.ht/~sircmpwn/aerc/commands"
)

var (
	MessageCommands *commands.Commands
)

func register(name string, cmd commands.AercCommand) {
	if MessageCommands == nil {
		MessageCommands = commands.NewCommands()
	}
	MessageCommands.Register(name, cmd)
}

R commands/account/reply.go => commands/msg/reply.go +8 -4
@@ 1,4 1,4 @@
package account
package msg

import (
	"bufio"


@@ 63,11 63,15 @@ func Reply(aerc *widgets.Aerc, args []string) error {
		}
	}

	acct := aerc.SelectedAccount()
	widget := aerc.SelectedTab().(widgets.ProvidesMessage)
	acct := widget.SelectedAccount()
	if acct == nil {
		return errors.New("No account selected")
	}
	conf := acct.AccountConfig()
	us, _ := gomail.ParseAddress(conf.From)
	store := acct.Messages().Store()
	msg := acct.Messages().Selected()
	store := widget.Store()
	msg := widget.SelectedMessage()
	acct.Logger().Println("Replying to email " + msg.Envelope.MessageId)

	var (

M widgets/account.go => widgets/account.go +12 -0
@@ 157,6 157,18 @@ func (acct *AccountView) Messages() *MessageList {
	return acct.msglist
}

func (acct *AccountView) Store() *lib.MessageStore {
	return acct.msglist.Store()
}

func (acct *AccountView) SelectedMessage() *types.MessageInfo {
	return acct.msglist.Selected()
}

func (acct *AccountView) SelectedAccount() *AccountView {
	return acct
}

func (acct *AccountView) onMessage(msg types.WorkerMessage) {
	switch msg := msg.(type) {
	case *types.Done:

M widgets/msgviewer.go => widgets/msgviewer.go +15 -1
@@ 24,6 24,7 @@ import (

type MessageViewer struct {
	ui.Invalidatable
	acct     *AccountView
	conf     *config.AercConfig
	err      error
	grid     *ui.Grid


@@ 55,7 56,7 @@ func formatAddresses(addrs []*imap.Address) string {
	return val.String()
}

func NewMessageViewer(conf *config.AercConfig,
func NewMessageViewer(acct *AccountView, conf *config.AercConfig,
	store *lib.MessageStore, msg *types.MessageInfo) *MessageViewer {

	grid := ui.NewGrid().Rows([]ui.GridSpec{


@@ 124,6 125,7 @@ func NewMessageViewer(conf *config.AercConfig,
	grid.AddChild(switcher).At(1, 0)

	return &MessageViewer{
		acct:     acct,
		grid:     grid,
		msg:      msg,
		store:    store,


@@ 185,6 187,18 @@ func (mv *MessageViewer) OnInvalidate(fn func(d ui.Drawable)) {
	})
}

func (mv *MessageViewer) Store() *lib.MessageStore {
	return mv.store
}

func (mv *MessageViewer) SelectedAccount() *AccountView {
	return mv.acct
}

func (mv *MessageViewer) SelectedMessage() *types.MessageInfo {
	return mv.msg
}

func (mv *MessageViewer) CurrentPart() *PartInfo {
	switcher := mv.switcher
	part := switcher.parts[switcher.selected]

A widgets/providesmessage.go => widgets/providesmessage.go +14 -0
@@ 0,0 1,14 @@
package widgets

import (
	"git.sr.ht/~sircmpwn/aerc/worker/types"
	"git.sr.ht/~sircmpwn/aerc/lib"
	"git.sr.ht/~sircmpwn/aerc/lib/ui"
)

type ProvidesMessage interface {
	ui.Drawable
	Store()           *lib.MessageStore
	SelectedMessage() *types.MessageInfo
	SelectedAccount() *AccountView
}