aerc/lib/statusline/state.go
Koni Marti 2512c0403f statusline: implement per-account status
Implement a statusline state for each account. Keep the ex line and the
push notifications global. Add account name prefix to push
notifications. Prefix status line with account name when multiple
accounts are available.

Use account-specific status line for each tab where an account is
defined.

Handle threading, filter/search, viewer passthrough and connection
status.

Signed-off-by: Koni Marti <koni.marti@gmail.com>
Acked-by: Robin Jarry <robin@jarry.cc>
2022-03-18 23:42:07 +01:00

133 lines
2.3 KiB
Go

package statusline
import (
"fmt"
"strings"
)
type State struct {
Name string
Multiple bool
Separator string
Connection string
ConnActivity string
Connected bool
Search string
Filter string
FilterActivity string
Threading string
Passthrough string
}
func NewState(name string, multipleAccts bool, sep string) *State {
return &State{Name: name, Multiple: multipleAccts, Separator: sep}
}
func (s *State) String() string {
var line []string
if s.Connection != "" || s.ConnActivity != "" {
conn := s.Connection
if s.ConnActivity != "" {
conn = s.ConnActivity
}
if s.Multiple {
line = append(line, fmt.Sprintf("[%s] %s", s.Name, conn))
} else {
line = append(line, conn)
}
}
if s.Connected {
if s.FilterActivity != "" {
line = append(line, s.FilterActivity)
} else {
if s.Filter != "" {
line = append(line, s.Filter)
}
}
if s.Search != "" {
line = append(line, s.Search)
}
if s.Threading != "" {
line = append(line, s.Threading)
}
if s.Passthrough != "" {
line = append(line, s.Passthrough)
}
}
return strings.Join(line, s.Separator)
}
type SetStateFunc func(s *State)
func Connected(state bool) SetStateFunc {
return func(s *State) {
s.ConnActivity = ""
s.Connected = state
if state {
s.Connection = "Connected"
} else {
s.Connection = "Disconnected"
}
}
}
func ConnectionActivity(desc string) SetStateFunc {
return func(s *State) {
s.ConnActivity = desc
}
}
func SearchFilterClear() SetStateFunc {
return func(s *State) {
s.Search = ""
s.FilterActivity = ""
s.Filter = ""
}
}
func FilterActivity(str string) SetStateFunc {
return func(s *State) {
s.FilterActivity = str
}
}
func FilterResult(str string) SetStateFunc {
return func(s *State) {
s.FilterActivity = ""
s.Filter = concatFilters(s.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) {
s.Search = desc
}
}
func Threading(on bool) SetStateFunc {
return func(s *State) {
s.Threading = ""
if on {
s.Threading = "threading"
}
}
}
func Passthrough(on bool) SetStateFunc {
return func(s *State) {
s.Passthrough = ""
if on {
s.Passthrough = "passthrough"
}
}
}