split: prevent opening split when no messages are selected

The [v]split command panics when it is run with no message selected, or
when messages aren't loaded. Check for a valid selected message before
creating a split, and report an error if one isn't selected.

Signed-off-by: Tim Culverhouse <tim@timculverhouse.com>
Acked-by: Robin Jarry <robin@jarry.cc>
This commit is contained in:
Tim Culverhouse 2022-10-19 14:28:50 -05:00 committed by Robin Jarry
parent ee964ad6b0
commit bd8a4feecc
2 changed files with 18 additions and 10 deletions

View file

@ -55,9 +55,7 @@ func (Split) Execute(aerc *widgets.Aerc, args []string) error {
n = 0
}
if args[0] == "split" {
acct.Split(n)
return nil
return acct.Split(n)
}
acct.Vsplit(n)
return nil
return acct.Vsplit(n)
}

View file

@ -545,10 +545,14 @@ func (acct *AccountView) SplitDirection() string {
// Split splits the message list view horizontally. The message list will be n
// rows high. If n is 0, any existing split is removed
func (acct *AccountView) Split(n int) {
func (acct *AccountView) Split(n int) error {
if n == 0 {
acct.clearSplit()
return
return nil
}
msg, err := acct.SelectedMessage()
if err != nil {
return fmt.Errorf("could not create split: %w", err)
}
acct.splitSize = n
acct.splitDir = "split"
@ -570,7 +574,7 @@ func (acct *AccountView) Split(n int) {
acct.grid.AddChild(ui.NewBordered(acct.dirlist, ui.BORDER_RIGHT, acct.uiConf)).Span(2, 1)
}
acct.grid.AddChild(ui.NewBordered(acct.msglist, ui.BORDER_BOTTOM, acct.uiConf)).At(0, 1)
lib.NewMessageStoreView(acct.msglist.Selected(), false, acct.Store(), acct.aerc.Crypto, acct.aerc.DecryptKeys,
lib.NewMessageStoreView(msg, false, acct.Store(), acct.aerc.Crypto, acct.aerc.DecryptKeys,
func(view lib.MessageView, err error) {
if err != nil {
acct.aerc.PushError(err.Error())
@ -580,14 +584,19 @@ func (acct *AccountView) Split(n int) {
acct.grid.AddChild(acct.split).At(1, 1)
})
ui.Invalidate()
return nil
}
// Vsplit splits the message list view vertically. The message list will be n
// rows wide. If n is 0, any existing split is removed
func (acct *AccountView) Vsplit(n int) {
func (acct *AccountView) Vsplit(n int) error {
if n == 0 {
acct.clearSplit()
return
return nil
}
msg, err := acct.SelectedMessage()
if err != nil {
return fmt.Errorf("could not create split: %w", err)
}
acct.splitSize = n
acct.splitDir = "vsplit"
@ -608,7 +617,7 @@ func (acct *AccountView) Vsplit(n int) {
acct.grid.AddChild(ui.NewBordered(acct.dirlist, ui.BORDER_RIGHT, acct.uiConf)).At(0, 0)
}
acct.grid.AddChild(ui.NewBordered(acct.msglist, ui.BORDER_RIGHT, acct.uiConf)).At(0, 1)
lib.NewMessageStoreView(acct.msglist.Selected(), false, acct.Store(), acct.aerc.Crypto, acct.aerc.DecryptKeys,
lib.NewMessageStoreView(msg, false, acct.Store(), acct.aerc.Crypto, acct.aerc.DecryptKeys,
func(view lib.MessageView, err error) {
if err != nil {
acct.aerc.PushError(err.Error())
@ -618,4 +627,5 @@ func (acct *AccountView) Vsplit(n int) {
acct.grid.AddChild(acct.split).At(0, 2)
})
ui.Invalidate()
return nil
}