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) }