Renderer scaffolding
This commit is contained in:
parent
a0be5e8025
commit
db1b2cd53f
4 changed files with 100 additions and 6 deletions
|
@ -1,10 +1,10 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.sr.ht/~sircmpwn/aerc2/config"
|
"git.sr.ht/~sircmpwn/aerc2/config"
|
||||||
|
"git.sr.ht/~sircmpwn/aerc2/ui"
|
||||||
"git.sr.ht/~sircmpwn/aerc2/worker"
|
"git.sr.ht/~sircmpwn/aerc2/worker"
|
||||||
"git.sr.ht/~sircmpwn/aerc2/worker/types"
|
"git.sr.ht/~sircmpwn/aerc2/worker/types"
|
||||||
)
|
)
|
||||||
|
@ -20,19 +20,23 @@ func main() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
fmt.Printf("Initializing worker %s\n", account.Name)
|
|
||||||
go work.Run()
|
go work.Run()
|
||||||
work.PostAction(types.Configure{Config: account})
|
work.PostAction(types.Configure{Config: account})
|
||||||
workers = append(workers, work)
|
workers = append(workers, work)
|
||||||
}
|
}
|
||||||
for {
|
_ui, err := ui.Initialize(conf)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
defer _ui.Close()
|
||||||
|
for !_ui.Exit {
|
||||||
activity := false
|
activity := false
|
||||||
for _, worker := range workers {
|
for _, worker := range workers {
|
||||||
if msg := worker.GetMessage(); msg != nil {
|
if msg := worker.GetMessage(); msg != nil {
|
||||||
activity = true
|
activity = true
|
||||||
fmt.Printf("<- %T\n", msg)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
activity = _ui.Tick() || activity
|
||||||
if !activity {
|
if !activity {
|
||||||
time.Sleep(100 * time.Millisecond)
|
time.Sleep(100 * time.Millisecond)
|
||||||
}
|
}
|
||||||
|
|
45
ui/render.go
Normal file
45
ui/render.go
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
package ui
|
||||||
|
|
||||||
|
import (
|
||||||
|
tb "github.com/nsf/termbox-go"
|
||||||
|
|
||||||
|
"git.sr.ht/~sircmpwn/aerc2/config"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Initialize(conf *config.AercConfig) (*UIState, error) {
|
||||||
|
state := UIState{
|
||||||
|
InvalidPanes: InvalidateAll,
|
||||||
|
Tabs: make([]AercTab, len(conf.Accounts)),
|
||||||
|
}
|
||||||
|
// 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)
|
||||||
|
return &state, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (state *UIState) Close() {
|
||||||
|
tb.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (state *UIState) Invalidate(what uint) {
|
||||||
|
state.InvalidPanes |= what
|
||||||
|
}
|
||||||
|
|
||||||
|
func (state *UIState) Tick() bool {
|
||||||
|
switch e := tb.PollEvent(); e.Type {
|
||||||
|
case tb.EventKey:
|
||||||
|
if e.Key == tb.KeyEsc {
|
||||||
|
state.Exit = true
|
||||||
|
}
|
||||||
|
case tb.EventResize:
|
||||||
|
state.Invalidate(InvalidateAll)
|
||||||
|
}
|
||||||
|
if state.InvalidPanes != 0 {
|
||||||
|
// TODO: re-render
|
||||||
|
state.InvalidPanes = 0
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
47
ui/types.go
Normal file
47
ui/types.go
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
package ui
|
||||||
|
|
||||||
|
const (
|
||||||
|
Valid = 0
|
||||||
|
InvalidateTabs = 1 << iota
|
||||||
|
InvalidateSidebar
|
||||||
|
InvalidateStatusBar
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
InvalidateAll = InvalidateTabs | InvalidateSidebar | InvalidateStatusBar
|
||||||
|
)
|
||||||
|
|
||||||
|
type Geometry struct {
|
||||||
|
row int
|
||||||
|
col int
|
||||||
|
width int
|
||||||
|
height int
|
||||||
|
}
|
||||||
|
|
||||||
|
type AercTab interface {
|
||||||
|
Name() string
|
||||||
|
Invalid() bool
|
||||||
|
Render(at Geometry)
|
||||||
|
}
|
||||||
|
|
||||||
|
type UIState struct {
|
||||||
|
Exit bool
|
||||||
|
InvalidPanes uint
|
||||||
|
|
||||||
|
Panes struct {
|
||||||
|
TabList Geometry
|
||||||
|
TabView Geometry
|
||||||
|
Sidebar Geometry
|
||||||
|
StatusBar Geometry
|
||||||
|
}
|
||||||
|
|
||||||
|
Tabs []AercTab
|
||||||
|
SelectedTab int
|
||||||
|
|
||||||
|
Prompt struct {
|
||||||
|
Prompt *string
|
||||||
|
Text *string
|
||||||
|
Index int
|
||||||
|
Scroll int
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,7 +1,6 @@
|
||||||
package imap
|
package imap
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.sr.ht/~sircmpwn/aerc2/worker/types"
|
"git.sr.ht/~sircmpwn/aerc2/worker/types"
|
||||||
|
@ -50,7 +49,6 @@ func (w *IMAPWorker) Run() {
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case msg := <-w.actions:
|
case msg := <-w.actions:
|
||||||
fmt.Printf("<= %T\n", msg)
|
|
||||||
w.handleMessage(msg)
|
w.handleMessage(msg)
|
||||||
default:
|
default:
|
||||||
time.Sleep(100 * time.Millisecond)
|
time.Sleep(100 * time.Millisecond)
|
||||||
|
|
Loading…
Reference in a new issue