aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--commands/msg/archive.go3
-rw-r--r--commands/msg/delete.go3
-rw-r--r--commands/msg/move.go3
-rw-r--r--lib/msgstore.go41
-rw-r--r--widgets/msglist.go63
5 files changed, 67 insertions, 46 deletions
diff --git a/commands/msg/archive.go b/commands/msg/archive.go
index da4c421..4fe7330 100644
--- a/commands/msg/archive.go
+++ b/commands/msg/archive.go
@@ -34,7 +34,8 @@ func Archive(aerc *widgets.Aerc, args []string) error {
msg := widget.SelectedMessage()
store := widget.Store()
archiveDir := acct.AccountConfig().Archive
- acct.Messages().Next()
+ store.Next()
+ acct.Messages().Scroll()
switch args[1] {
case ARCHIVE_MONTH:
diff --git a/commands/msg/delete.go b/commands/msg/delete.go
index 082dbe3..ee3dd29 100644
--- a/commands/msg/delete.go
+++ b/commands/msg/delete.go
@@ -31,7 +31,8 @@ func DeleteMessage(aerc *widgets.Aerc, args []string) error {
if isMsgView {
aerc.RemoveTab(widget)
}
- acct.Messages().Next()
+ store.Next()
+ acct.Messages().Scroll()
store.Delete([]uint32{msg.Uid}, func(msg types.WorkerMessage) {
switch msg := msg.(type) {
case *types.Done:
diff --git a/commands/msg/move.go b/commands/msg/move.go
index 5300c5a..2367076 100644
--- a/commands/msg/move.go
+++ b/commands/msg/move.go
@@ -45,7 +45,8 @@ func Move(aerc *widgets.Aerc, args []string) error {
if isMsgView {
aerc.RemoveTab(widget)
}
- acct.Messages().Next()
+ store.Next()
+ acct.Messages().Scroll()
store.Move([]uint32{msg.Uid}, args[optind], createParents, func(
msg types.WorkerMessage) {
diff --git a/lib/msgstore.go b/lib/msgstore.go
index 5b4d540..a81f9ad 100644
--- a/lib/msgstore.go
+++ b/lib/msgstore.go
@@ -17,6 +17,7 @@ type MessageStore struct {
// Ordered list of known UIDs
Uids []uint32
+ selected int
bodyCallbacks map[uint32][]func(io.Reader)
headerCallbacks map[uint32][]func(*types.MessageInfo)
@@ -34,6 +35,7 @@ func NewMessageStore(worker *types.Worker,
Deleted: make(map[uint32]interface{}),
DirInfo: *dirInfo,
+ selected: 0,
bodyCallbacks: make(map[uint32][]func(io.Reader)),
headerCallbacks: make(map[uint32][]func(*types.MessageInfo)),
@@ -279,3 +281,42 @@ func (store *MessageStore) Read(uids []uint32, read bool,
Uids: set,
}, cb)
}
+
+func (store *MessageStore) Selected() *types.MessageInfo {
+ return store.Messages[store.Uids[len(store.Uids)-store.selected-1]]
+}
+
+func (store *MessageStore) SelectedIndex() int {
+ return store.selected
+}
+
+func (store *MessageStore) Select(index int) {
+ store.selected = index
+ for ; store.selected < 0; store.selected = len(store.Uids) + store.selected {
+ /* This space deliberately left blank */
+ }
+ if store.selected > len(store.Uids) {
+ store.selected = len(store.Uids)
+ }
+}
+
+func (store *MessageStore) nextPrev(delta int) {
+ if len(store.Uids) == 0 {
+ return
+ }
+ store.selected += delta
+ if store.selected < 0 {
+ store.selected = 0
+ }
+ if store.selected >= len(store.Uids) {
+ store.selected = len(store.Uids) - 1
+ }
+}
+
+func (store *MessageStore) Next() {
+ store.nextPrev(1)
+}
+
+func (store *MessageStore) Prev() {
+ store.nextPrev(-1)
+}
diff --git a/widgets/msglist.go b/widgets/msglist.go
index 1afe487..43c2ee4 100644
--- a/widgets/msglist.go
+++ b/widgets/msglist.go
@@ -16,22 +16,20 @@ import (
type MessageList struct {
ui.Invalidatable
- conf *config.AercConfig
- logger *log.Logger
- height int
- scroll int
- selected int
- nmsgs int
- spinner *Spinner
- store *lib.MessageStore
+ conf *config.AercConfig
+ logger *log.Logger
+ height int
+ scroll int
+ nmsgs int
+ spinner *Spinner
+ store *lib.MessageStore
}
func NewMessageList(conf *config.AercConfig, logger *log.Logger) *MessageList {
ml := &MessageList{
- conf: conf,
- logger: logger,
- selected: 0,
- spinner: NewSpinner(),
+ conf: conf,
+ logger: logger,
+ spinner: NewSpinner(),
}
ml.spinner.OnInvalidate(func(_ ui.Drawable) {
ml.Invalidate()
@@ -78,7 +76,7 @@ func (ml *MessageList) Draw(ctx *ui.Context) {
style := tcell.StyleDefault
// current row
- if row == ml.selected-ml.scroll {
+ if row == ml.store.SelectedIndex()-ml.scroll {
style = style.Reverse(true)
}
// deleted message
@@ -139,12 +137,12 @@ func (ml *MessageList) storeUpdate(store *lib.MessageStore) {
// for the previously selected UID.
if len(store.Uids) > ml.nmsgs && ml.nmsgs != 0 {
for i := 0; i < len(store.Uids)-ml.nmsgs; i++ {
- ml.Next()
+ ml.Scroll()
}
}
if len(store.Uids) < ml.nmsgs && ml.nmsgs != 0 {
for i := 0; i < ml.nmsgs-len(store.Uids); i++ {
- ml.Prev()
+ ml.Scroll()
}
}
ml.nmsgs = len(store.Uids)
@@ -156,7 +154,6 @@ func (ml *MessageList) storeUpdate(store *lib.MessageStore) {
func (ml *MessageList) SetStore(store *lib.MessageStore) {
if ml.Store() != store {
ml.scroll = 0
- ml.selected = 0
}
ml.store = store
if store != nil {
@@ -180,54 +177,34 @@ func (ml *MessageList) Empty() bool {
func (ml *MessageList) Selected() *types.MessageInfo {
store := ml.Store()
- return store.Messages[store.Uids[len(store.Uids)-ml.selected-1]]
+ return store.Messages[store.Uids[len(store.Uids)-ml.store.SelectedIndex()-1]]
}
func (ml *MessageList) Select(index int) {
store := ml.Store()
+ store.Select(index)
- ml.selected = index
- for ; ml.selected < 0; ml.selected = len(store.Uids) + ml.selected {
- }
- if ml.selected > len(store.Uids) {
- ml.selected = len(store.Uids)
- }
// I'm too lazy to do the math right now
- for ml.selected-ml.scroll >= ml.Height() {
+ for store.SelectedIndex()-ml.scroll >= ml.Height() {
ml.scroll += 1
}
- for ml.selected-ml.scroll < 0 {
+ for store.SelectedIndex()-ml.scroll < 0 {
ml.scroll -= 1
}
}
-func (ml *MessageList) nextPrev(delta int) {
+func (ml *MessageList) Scroll() {
store := ml.Store()
if store == nil || len(store.Uids) == 0 {
return
}
- ml.selected += delta
- if ml.selected < 0 {
- ml.selected = 0
- }
- if ml.selected >= len(store.Uids) {
- ml.selected = len(store.Uids) - 1
- }
if ml.Height() != 0 {
- if ml.selected-ml.scroll >= ml.Height() {
+ if store.SelectedIndex()-ml.scroll >= ml.Height() {
ml.scroll += 1
- } else if ml.selected-ml.scroll < 0 {
+ } else if store.SelectedIndex()-ml.scroll < 0 {
ml.scroll -= 1
}
}
ml.Invalidate()
}
-
-func (ml *MessageList) Next() {
- ml.nextPrev(1)
-}
-
-func (ml *MessageList) Prev() {
- ml.nextPrev(-1)
-}