aboutsummaryrefslogtreecommitdiff
path: root/ui/render.go
diff options
context:
space:
mode:
Diffstat (limited to 'ui/render.go')
-rw-r--r--ui/render.go53
1 files changed, 44 insertions, 9 deletions
diff --git a/ui/render.go b/ui/render.go
index bca0cf6..4fedc2c 100644
--- a/ui/render.go
+++ b/ui/render.go
@@ -8,15 +8,21 @@ import (
func Initialize(conf *config.AercConfig) (*UIState, error) {
state := UIState{
+ Config: conf,
InvalidPanes: InvalidateAll,
- Tabs: make([]AercTab, len(conf.Accounts)),
+
+ tbEvents: make(chan tb.Event, 10),
}
- // TODO: Initialize each tab to a mailbox tab
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
}
@@ -24,21 +30,50 @@ func (state *UIState) Close() {
tb.Close()
}
+func (state *UIState) AddTab(tab AercTab) {
+ state.Tabs = append(state.Tabs, tab)
+}
+
func (state *UIState) Invalidate(what uint) {
state.InvalidPanes |= what
}
+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 {
- switch e := tb.PollEvent(); e.Type {
- case tb.EventKey:
- if e.Key == tb.KeyEsc {
- state.Exit = true
+ 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)
}
- case tb.EventResize:
- state.Invalidate(InvalidateAll)
+ default:
+ // no-op
+ break
}
if state.InvalidPanes != 0 {
- // TODO: re-render
+ if state.InvalidPanes&InvalidateAll == InvalidateAll {
+ tb.Clear(tb.ColorDefault, tb.ColorDefault)
+ state.calcGeometries()
+ }
+ if state.InvalidPanes&InvalidateTabs != 0 {
+ tab := state.Tabs[state.SelectedTab]
+ tab.Render(state.Panes.TabView)
+ }
+ tb.Flush()
state.InvalidPanes = 0
}
return true