diff options
author | Drew DeVault <sir@cmpwn.com> | 2018-01-10 22:54:55 -0500 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2018-01-10 22:54:55 -0500 |
commit | 55e84533022c1f9bf9fd9e2cd2db930394b590b8 (patch) | |
tree | 513ee239f641aa5154427776efa18fda752e642d /ui/ui.go | |
parent | 77a0f68758905faa74407499ff92c90929e27989 (diff) | |
download | aerc-55e84533022c1f9bf9fd9e2cd2db930394b590b8.tar.gz |
Improve invalidation logic
Diffstat (limited to 'ui/ui.go')
-rw-r--r-- | ui/ui.go | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/ui/ui.go b/ui/ui.go new file mode 100644 index 00000000..f01af08f --- /dev/null +++ b/ui/ui.go @@ -0,0 +1,88 @@ +package ui + +import ( + tb "github.com/nsf/termbox-go" + + "git.sr.ht/~sircmpwn/aerc2/config" +) + +func Initialize(conf *config.AercConfig) (*UIState, error) { + state := UIState{ + Config: conf, + InvalidPanes: InvalidateAll, + + tbEvents: make(chan tb.Event, 10), + } + if err := tb.Init(); err != nil { + return nil, err + } + tb.SetInputMode(tb.InputEsc | tb.InputMouse) + tb.SetOutputMode(tb.Output256) + go (func() { + for !state.Exit { + state.tbEvents <- tb.PollEvent() + } + })() + return &state, nil +} + +func (state *UIState) Close() { + tb.Close() +} + +func (state *UIState) AddTab(tab AercTab) { + tab.SetParent(state) + state.Tabs = append(state.Tabs, tab) +} + +func (state *UIState) Invalidate(what uint) { + state.InvalidPanes |= what +} + +func (state *UIState) InvalidateFrom(tab AercTab) { + if state.Tabs[state.SelectedTab] == tab { + state.Invalidate(InvalidateTabView) + } +} + +func (state *UIState) calcGeometries() { + width, height := tb.Size() + // TODO: more + state.Panes.TabView = Geometry{ + Row: 0, + Col: 0, + Width: width, + Height: height, + } +} + +func (state *UIState) Tick() bool { + select { + case event := <-state.tbEvents: + switch event.Type { + case tb.EventKey: + if event.Key == tb.KeyEsc { + state.Exit = true + } + case tb.EventResize: + state.Invalidate(InvalidateAll) + } + default: + // no-op + break + } + if state.InvalidPanes != 0 { + invalid := state.InvalidPanes + state.InvalidPanes = 0 + if invalid&InvalidateAll == InvalidateAll { + tb.Clear(tb.ColorDefault, tb.ColorDefault) + state.calcGeometries() + } + if invalid&InvalidateTabView != 0 { + tab := state.Tabs[state.SelectedTab] + tab.Render(state.Panes.TabView) + } + tb.Flush() + } + return true +} |