Add modify-labels command

This adds the event type as well as the command implementation, but no backend
supports it yet.
This commit is contained in:
Reto Brunner 2019-09-11 21:01:05 +02:00 committed by Drew DeVault
parent 618a500341
commit a93b4de6f3
5 changed files with 96 additions and 3 deletions

View file

@ -0,0 +1,69 @@
package msg
import (
"errors"
"time"
"git.sr.ht/~sircmpwn/aerc/widgets"
"git.sr.ht/~sircmpwn/aerc/worker/types"
"github.com/gdamore/tcell"
)
type ModifyLabels struct{}
func init() {
register(ModifyLabels{})
}
func (ModifyLabels) Aliases() []string {
return []string{"modify-labels"}
}
func (ModifyLabels) Complete(aerc *widgets.Aerc, args []string) []string {
return nil
}
func (ModifyLabels) Execute(aerc *widgets.Aerc, args []string) error {
changes := args[1:]
if len(changes) == 0 {
return errors.New("Usage: modify-labels <[+-]label> ...")
}
widget := aerc.SelectedTab().(widgets.ProvidesMessage)
acct := widget.SelectedAccount()
if acct == nil {
return errors.New("No account selected")
}
store := widget.Store()
if store == nil {
return errors.New("Cannot perform action. Messages still loading")
}
msg, err := widget.SelectedMessage()
if err != nil {
return err
}
var add, remove []string
for _, l := range changes {
switch l[0] {
case '+':
add = append(add, l[1:])
case '-':
remove = append(remove, l[1:])
default:
// if no operand is given assume add
add = append(add, l)
}
}
store.ModifyLabels([]uint32{msg.Uid}, add, remove, func(
msg types.WorkerMessage) {
switch msg := msg.(type) {
case *types.Done:
aerc.PushStatus("labels updated", 10*time.Second)
case *types.Error:
aerc.PushStatus(" "+msg.Error.Error(), 10*time.Second).
Color(tcell.ColorDefault, tcell.ColorRed)
}
})
return nil
}

View file

@ -133,6 +133,14 @@ message list, the message in the message viewer, etc).
*-t*: Toggle the selected message between read and unread.
*modify-labels* <[+-]label>...
Modify message labels (e.g. notmuch tags). Labels prefixed with a '+' are
added, those prefixed with a '-' removed. As a convenience, labels without
either operand add the specified label.
Example: `modify-labels +inbox -spam unread` adds the labels inbox and unread
and removes spam
*unsubscribe*
Attempt to automatically unsubscribe the user from the mailing list through
use of the List-Unsubscribe header. If supported, aerc may open a compose

View file

@ -425,3 +425,12 @@ func (store *MessageStore) NextResult() {
func (store *MessageStore) PrevResult() {
store.nextPrevResult(-1)
}
func (store *MessageStore) ModifyLabels(uids []uint32, add, remove []string,
cb func(msg types.WorkerMessage)) {
store.worker.PostAction(&types.ModifyLabels{
Uids: uids,
Add: add,
Remove: remove,
}, cb)
}

View file

@ -1,9 +1,9 @@
package widgets
import (
"strings"
"sync/atomic"
"time"
"strings"
"github.com/gdamore/tcell"
@ -13,9 +13,9 @@ import (
type Spinner struct {
ui.Invalidatable
frame int64 // access via atomic
frame int64 // access via atomic
frames []string
stop chan struct{}
stop chan struct{}
}
func NewSpinner(uiConf *config.UIConfig) *Spinner {

View file

@ -175,3 +175,10 @@ type MessagesDeleted struct {
Message
Uids []uint32
}
type ModifyLabels struct {
Message
Uids []uint32
Add []string
Remove []string
}