1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
package statusline
import (
"fmt"
"git.sr.ht/~rjarry/aerc/config"
)
type State struct {
separator string
renderer renderFunc
acct *accountState
fldr map[string]*folderState
width int
}
type accountState struct {
Name string
Multiple bool
ConnActivity string
Connected bool
Passthrough bool
}
type folderState struct {
Name string
Search string
Filter string
FilterActivity string
Sorting bool
Threading bool
}
func NewState(name string, multipleAccts bool, conf config.StatuslineConfig) *State {
return &State{separator: conf.Separator,
renderer: newRenderer(conf.RenderFormat, conf.DisplayMode),
acct: &accountState{Name: name, Multiple: multipleAccts},
fldr: make(map[string]*folderState),
}
}
func (s *State) StatusLine(folder string) string {
return s.renderer(renderParams{
width: s.width,
sep: s.separator,
acct: s.acct,
fldr: s.folderState(folder),
})
}
func (s *State) folderState(folder string) *folderState {
if _, ok := s.fldr[folder]; !ok {
s.fldr[folder] = &folderState{Name: folder}
}
return s.fldr[folder]
}
func (s *State) SetWidth(w int) bool {
changeState := false
if s.width != w {
s.width = w
changeState = true
}
return changeState
}
func (s *State) Connected() bool {
return s.acct.Connected
}
type SetStateFunc func(s *State, folder string)
func SetConnected(state bool) SetStateFunc {
return func(s *State, folder string) {
s.acct.ConnActivity = ""
s.acct.Connected = state
}
}
func ConnectionActivity(desc string) SetStateFunc {
return func(s *State, folder string) {
s.acct.ConnActivity = desc
}
}
func SearchFilterClear() SetStateFunc {
return func(s *State, folder string) {
s.folderState(folder).Search = ""
s.folderState(folder).FilterActivity = ""
s.folderState(folder).Filter = ""
}
}
func FilterActivity(str string) SetStateFunc {
return func(s *State, folder string) {
s.folderState(folder).FilterActivity = str
}
}
func FilterResult(str string) SetStateFunc {
return func(s *State, folder string) {
s.folderState(folder).FilterActivity = ""
s.folderState(folder).Filter = concatFilters(s.folderState(folder).Filter, str)
}
}
func concatFilters(existing, next string) string {
if existing == "" {
return next
}
return fmt.Sprintf("%s && %s", existing, next)
}
func Search(desc string) SetStateFunc {
return func(s *State, folder string) {
s.folderState(folder).Search = desc
}
}
func Sorting(on bool) SetStateFunc {
return func(s *State, folder string) {
s.folderState(folder).Sorting = on
}
}
func Threading(on bool) SetStateFunc {
return func(s *State, folder string) {
s.folderState(folder).Threading = on
}
}
func Passthrough(on bool) SetStateFunc {
return func(s *State, folder string) {
s.acct.Passthrough = on
}
}
|