2512c0403f
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>
133 lines
2.3 KiB
Go
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"
|
|
}
|
|
}
|
|
}
|