diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/statusline/state.go | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/lib/statusline/state.go b/lib/statusline/state.go new file mode 100644 index 00000000..30029c13 --- /dev/null +++ b/lib/statusline/state.go @@ -0,0 +1,133 @@ +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" + } + } +} |