dirlist: actually honor the DirInfo
Currently the dirlist ignores the counts provided by the dirInfo. However some of the workers can actually provide accurate counts much quicker than if we count the flags. Eventually we will also want to enable displaying counts for background folders, where the brute force counting won't work as none of the headers are fetched yet. This commit models it in an opt-in manner, if the flag isn't set then we still count the messages manually.
This commit is contained in:
parent
bd4df53009
commit
66b68f35b3
2 changed files with 39 additions and 25 deletions
|
@ -50,6 +50,9 @@ type DirectoryInfo struct {
|
|||
|
||||
// The number of unread messages
|
||||
Unseen int
|
||||
|
||||
// set to true if the value counts are accurate
|
||||
AccurateCounts bool
|
||||
}
|
||||
|
||||
// A MessageInfo holds information about the structure of a message
|
||||
|
|
|
@ -171,32 +171,17 @@ func (dirlist *DirectoryList) getDirString(name string, width int, recentUnseen
|
|||
}
|
||||
|
||||
func (dirlist *DirectoryList) getRUEString(name string) string {
|
||||
totalUnseen := 0
|
||||
totalRecent := 0
|
||||
totalExists := 0
|
||||
if msgStore, ok := dirlist.MsgStore(name); ok {
|
||||
for _, msg := range msgStore.Messages {
|
||||
if msg == nil {
|
||||
continue
|
||||
}
|
||||
seen := false
|
||||
recent := false
|
||||
for _, flag := range msg.Flags {
|
||||
if flag == models.SeenFlag {
|
||||
seen = true
|
||||
} else if flag == models.RecentFlag {
|
||||
recent = true
|
||||
}
|
||||
}
|
||||
if !seen {
|
||||
if recent {
|
||||
totalRecent++
|
||||
} else {
|
||||
totalUnseen++
|
||||
}
|
||||
}
|
||||
}
|
||||
msgStore, ok := dirlist.MsgStore(name)
|
||||
if !ok {
|
||||
return ""
|
||||
}
|
||||
var totalRecent, totalUnseen, totalExists int
|
||||
if msgStore.DirInfo.AccurateCounts {
|
||||
totalRecent = msgStore.DirInfo.Recent
|
||||
totalUnseen = msgStore.DirInfo.Unseen
|
||||
totalExists = msgStore.DirInfo.Exists
|
||||
} else {
|
||||
totalRecent, totalUnseen, totalExists = countRUE(msgStore)
|
||||
}
|
||||
rueString := ""
|
||||
if totalRecent > 0 {
|
||||
|
@ -395,3 +380,29 @@ func (dirlist *DirectoryList) getSortCriteria() []*types.SortCriterion {
|
|||
}
|
||||
return criteria
|
||||
}
|
||||
|
||||
func countRUE(msgStore *lib.MessageStore) (recent, unread, exist int) {
|
||||
for _, msg := range msgStore.Messages {
|
||||
if msg == nil {
|
||||
continue
|
||||
}
|
||||
seen := false
|
||||
isrecent := false
|
||||
for _, flag := range msg.Flags {
|
||||
if flag == models.SeenFlag {
|
||||
seen = true
|
||||
} else if flag == models.RecentFlag {
|
||||
isrecent = true
|
||||
}
|
||||
}
|
||||
if !seen {
|
||||
if isrecent {
|
||||
recent++
|
||||
} else {
|
||||
unread++
|
||||
}
|
||||
}
|
||||
exist++
|
||||
}
|
||||
return recent, unread, exist
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue