summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--widgets/account.go75
-rw-r--r--widgets/aerc.go49
2 files changed, 58 insertions, 66 deletions
diff --git a/widgets/account.go b/widgets/account.go
index dd7b068..d283956 100644
--- a/widgets/account.go
+++ b/widgets/account.go
@@ -1,6 +1,7 @@
package widgets
import (
+ "fmt"
"log"
"time"
@@ -16,15 +17,19 @@ type AccountView struct {
conf *config.AccountConfig
grid *ui.Grid
logger *log.Logger
+ interactive ui.Interactive
onInvalidate func(d ui.Drawable)
- status *StatusLine
+ statusline *StatusLine
+ statusbar *ui.Stack
worker *types.Worker
}
-func NewAccountView(conf *config.AccountConfig,
- logger *log.Logger, statusbar ui.Drawable) *AccountView {
+func NewAccountView(
+ conf *config.AccountConfig, logger *log.Logger) *AccountView {
- status := NewStatusLine()
+ statusbar := ui.NewStack()
+ statusline := NewStatusLine()
+ statusbar.Push(statusline)
grid := ui.NewGrid().Rows([]ui.GridSpec{
{ui.SIZE_WEIGHT, 1},
@@ -36,28 +41,27 @@ func NewAccountView(conf *config.AccountConfig,
grid.AddChild(ui.NewBordered(
ui.NewFill('s'), ui.BORDER_RIGHT)).Span(2, 1)
grid.AddChild(ui.NewFill('.')).At(0, 1)
- grid.AddChild(status).At(1, 1)
+ grid.AddChild(statusbar).At(1, 1)
worker, err := worker.NewWorker(conf.Source, logger)
if err != nil {
- acct := &AccountView{
- conf: conf,
- grid: grid,
- logger: logger,
- status: status,
- }
// TODO: Update status line with error
- return acct
+ return &AccountView{
+ conf: conf,
+ grid: grid,
+ logger: logger,
+ statusline: statusline,
+ }
}
acct := &AccountView{
- conf: conf,
- grid: grid,
- logger: logger,
- status: status,
- worker: worker,
+ conf: conf,
+ grid: grid,
+ logger: logger,
+ statusline: statusline,
+ statusbar: statusbar,
+ worker: worker,
}
- logger.Printf("My grid is %p; status %p", grid, status)
go worker.Backend.Run()
go func() {
@@ -71,31 +75,26 @@ func NewAccountView(conf *config.AccountConfig,
worker.PostAction(&types.Configure{Config: conf}, nil)
worker.PostAction(&types.Connect{}, acct.connected)
- go func() {
- time.Sleep(10 * time.Second)
- status.Set("Test")
- }()
-
return acct
}
func (acct *AccountView) connected(msg types.WorkerMessage) {
switch msg := msg.(type) {
case *types.Done:
- acct.status.Set("Connected.")
+ acct.statusline.Set("Connected.")
acct.logger.Println("Connected.")
acct.worker.PostAction(&types.ListDirectories{}, nil)
case *types.CertificateApprovalRequest:
// TODO: Ask the user
acct.logger.Println("Approved unknown certificate.")
- acct.status.Push("Approved unknown certificate.", 5*time.Second)
+ acct.statusline.Push("Approved unknown certificate.", 5*time.Second)
acct.worker.PostAction(&types.ApproveCertificate{
Message: types.RespondTo(msg),
Approved: true,
}, acct.connected)
default:
acct.logger.Println("Connection failed.")
- acct.status.Set("Connection failed.").
+ acct.statusline.Set("Connection failed.").
Color(tcell.ColorRed, tcell.ColorDefault)
}
}
@@ -113,3 +112,27 @@ func (acct *AccountView) Invalidate() {
func (acct *AccountView) Draw(ctx *ui.Context) {
acct.grid.Draw(ctx)
}
+
+func (acct *AccountView) Event(event tcell.Event) bool {
+ if acct.interactive != nil {
+ return acct.interactive.Event(event)
+ }
+ switch event := event.(type) {
+ case *tcell.EventKey:
+ if event.Rune() == ':' {
+ exline := NewExLine(func(command string) {
+ acct.statusline.Push(
+ fmt.Sprintf("TODO: execute %s", command), 3*time.Second)
+ acct.statusbar.Pop()
+ acct.interactive = nil
+ }, func() {
+ acct.statusbar.Pop()
+ acct.interactive = nil
+ })
+ acct.interactive = exline
+ acct.statusbar.Push(exline)
+ return true
+ }
+ }
+ return false
+}
diff --git a/widgets/aerc.go b/widgets/aerc.go
index 58e8972..cd4b773 100644
--- a/widgets/aerc.go
+++ b/widgets/aerc.go
@@ -1,9 +1,7 @@
package widgets
import (
- "fmt"
"log"
- "time"
"github.com/gdamore/tcell"
@@ -12,12 +10,9 @@ import (
)
type Aerc struct {
- accounts map[string]*AccountView
- grid *libui.Grid
- tabs *libui.Tabs
- statusbar *libui.Stack
- statusline *StatusLine
- interactive libui.Interactive
+ accounts map[string]*AccountView
+ grid *libui.Grid
+ tabs *libui.Tabs
}
func NewAerc(conf *config.AercConfig, logger *log.Logger) *Aerc {
@@ -31,10 +26,6 @@ func NewAerc(conf *config.AercConfig, logger *log.Logger) *Aerc {
{libui.SIZE_WEIGHT, 1},
})
- statusbar := libui.NewStack()
- statusline := NewStatusLine()
- statusbar.Push(statusline)
-
// TODO: Grab sidebar size from config and via :set command
mainGrid.AddChild(libui.NewText("aerc").
Strategy(libui.TEXT_CENTER).
@@ -45,17 +36,15 @@ func NewAerc(conf *config.AercConfig, logger *log.Logger) *Aerc {
accts := make(map[string]*AccountView)
for _, acct := range conf.Accounts {
- view := NewAccountView(&acct, logger, statusbar)
+ view := NewAccountView(&acct, logger)
accts[acct.Name] = view
tabs.Add(view, acct.Name)
}
return &Aerc{
- accounts: accts,
- grid: mainGrid,
- statusbar: statusbar,
- statusline: statusline,
- tabs: tabs,
+ accounts: accts,
+ grid: mainGrid,
+ tabs: tabs,
}
}
@@ -74,26 +63,6 @@ func (aerc *Aerc) Draw(ctx *libui.Context) {
}
func (aerc *Aerc) Event(event tcell.Event) bool {
- switch event := event.(type) {
- case *tcell.EventKey:
- if event.Rune() == ':' {
- exline := NewExLine(func(command string) {
- aerc.statusline.Push(fmt.Sprintf("TODO: execute %s", command),
- 3*time.Second)
- aerc.statusbar.Pop()
- aerc.interactive = nil
- }, func() {
- aerc.statusbar.Pop()
- aerc.interactive = nil
- })
- aerc.interactive = exline
- aerc.statusbar.Push(exline)
- return true
- }
- }
- if aerc.interactive != nil {
- return aerc.interactive.Event(event)
- } else {
- return false
- }
+ acct, _ := aerc.tabs.Tabs[aerc.tabs.Selected].Content.(*AccountView)
+ return acct.Event(event)
}