commit 55e84533022c1f9bf9fd9e2cd2db930394b590b8
parent 77a0f68758905faa74407499ff92c90929e27989
Author: Drew DeVault <sir@cmpwn.com>
Date: Wed, 10 Jan 2018 22:54:55 -0500
Improve invalidation logic
Diffstat:
M | ui/account.go | | | 13 | ++++++++----- |
D | ui/render.go | | | 80 | ------------------------------------------------------------------------------- |
M | ui/types.go | | | 11 | +++++++---- |
A | ui/ui.go | | | 88 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
4 files changed, 103 insertions(+), 89 deletions(-)
diff --git a/ui/account.go b/ui/account.go
@@ -11,6 +11,8 @@ type AccountTab struct {
Config *config.AccountConfig
Worker *worker.Worker
Parent *UIState
+
+ counter int
}
func NewAccountTab(conf *config.AccountConfig, work *worker.Worker) *AccountTab {
@@ -24,10 +26,6 @@ func (acc *AccountTab) Name() string {
return acc.Config.Name
}
-func (acc *AccountTab) Invalid() bool {
- return false
-}
-
func (acc *AccountTab) SetParent(parent *UIState) {
acc.Parent = parent
}
@@ -37,5 +35,10 @@ func (acc *AccountTab) Render(at Geometry) {
Fg: tb.ColorDefault,
Bg: tb.ColorDefault,
}
- TPrintf(&at, cell, "%s", acc.Name())
+ TPrintf(&at, cell, "%s %d", acc.Name(), acc.counter)
+ acc.counter++
+ if acc.counter%10000 == 0 {
+ acc.counter = 0
+ }
+ acc.Parent.InvalidateFrom(acc)
}
diff --git a/ui/render.go b/ui/render.go
@@ -1,80 +0,0 @@
-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) {
- 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 {
- 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 {
- 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
-}
diff --git a/ui/types.go b/ui/types.go
@@ -7,14 +7,18 @@ import (
)
const (
- Valid = 0
- InvalidateTabs = 1 << iota
+ Valid = 0
+ InvalidateTabList = 1 << iota
+ InvalidateTabView
InvalidateSidebar
InvalidateStatusBar
)
const (
- InvalidateAll = InvalidateTabs | InvalidateSidebar | InvalidateStatusBar
+ InvalidateAll = InvalidateTabList |
+ InvalidateTabView |
+ InvalidateSidebar |
+ InvalidateStatusBar
)
type Geometry struct {
@@ -26,7 +30,6 @@ type Geometry struct {
type AercTab interface {
Name() string
- Invalid() bool
Render(at Geometry)
SetParent(parent *UIState)
}
diff --git a/ui/ui.go 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
+}