From b60999c39e11bf4d1e236f2b10a2f895b44d23fb Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Sun, 10 Mar 2019 21:15:24 -0400 Subject: [PATCH] Start building out command subsystem --- aerc.go | 8 +++++++- commands/commands.go | 28 ++++++++++++++++++++++++++++ commands/next-folder.go | 15 +++++++++++++++ commands/prev-folder.go | 15 +++++++++++++++ widgets/account.go | 10 +++++++++- widgets/aerc.go | 14 ++++++++------ widgets/directories.go | 37 +++++++++++++++++++++++++++++++++++++ 7 files changed, 119 insertions(+), 8 deletions(-) create mode 100644 commands/commands.go create mode 100644 commands/next-folder.go create mode 100644 commands/prev-folder.go diff --git a/aerc.go b/aerc.go index 3bdc90a..1e2f884 100644 --- a/aerc.go +++ b/aerc.go @@ -10,6 +10,7 @@ import ( "github.com/mattn/go-isatty" "git.sr.ht/~sircmpwn/aerc2/config" + "git.sr.ht/~sircmpwn/aerc2/commands" libui "git.sr.ht/~sircmpwn/aerc2/lib/ui" "git.sr.ht/~sircmpwn/aerc2/widgets" ) @@ -32,7 +33,12 @@ func main() { panic(err) } - ui, err := libui.Initialize(conf, widgets.NewAerc(conf, logger)) + var aerc *widgets.Aerc + aerc = widgets.NewAerc(conf, logger, func(cmd string) error { + return commands.ExecuteCommand(aerc, cmd) + }) + + ui, err := libui.Initialize(conf, aerc) if err != nil { panic(err) } diff --git a/commands/commands.go b/commands/commands.go new file mode 100644 index 0000000..71dabe4 --- /dev/null +++ b/commands/commands.go @@ -0,0 +1,28 @@ +package commands + +import ( + "errors" + + "git.sr.ht/~sircmpwn/aerc2/widgets" +) + +type AercCommand func(aerc *widgets.Aerc, cmd string) error + +var ( + commands map[string]AercCommand +) + +func init() { + commands = make(map[string]AercCommand) +} + +func Register(name string, cmd AercCommand) { + commands[name] = cmd +} + +func ExecuteCommand(aerc *widgets.Aerc, cmd string) error { + if fn, ok := commands[cmd]; ok { + return fn(aerc, cmd) + } + return errors.New("Unknown command " + cmd) +} diff --git a/commands/next-folder.go b/commands/next-folder.go new file mode 100644 index 0000000..02975e1 --- /dev/null +++ b/commands/next-folder.go @@ -0,0 +1,15 @@ +package commands + +import ( + "git.sr.ht/~sircmpwn/aerc2/widgets" +) + +func init() { + Register("next-folder", NextFolder) +} + +func NextFolder(aerc *widgets.Aerc, cmd string) error { + acct := aerc.SelectedAccount() + acct.Directories().Next() + return nil +} diff --git a/commands/prev-folder.go b/commands/prev-folder.go new file mode 100644 index 0000000..a38214f --- /dev/null +++ b/commands/prev-folder.go @@ -0,0 +1,15 @@ +package commands + +import ( + "git.sr.ht/~sircmpwn/aerc2/widgets" +) + +func init() { + Register("prev-folder", PrevFolder) +} + +func PrevFolder(aerc *widgets.Aerc, cmd string) error { + acct := aerc.SelectedAccount() + acct.Directories().Prev() + return nil +} diff --git a/widgets/account.go b/widgets/account.go index 3848bbf..dc339cb 100644 --- a/widgets/account.go +++ b/widgets/account.go @@ -75,7 +75,7 @@ func NewAccountView(conf *config.AccountConfig, for { msg := <-worker.Messages msg = worker.ProcessMessage(msg) - // TODO: dispatch to appropriate handlers + acct.onMessage(msg) } }() @@ -164,3 +164,11 @@ func (acct *AccountView) connected(msg types.WorkerMessage) { Color(tcell.ColorRed, tcell.ColorDefault) } } + +func (acct *AccountView) Directories() *DirectoryList { + return acct.dirlist +} + +func (acct *AccountView) onMessage(msg types.WorkerMessage) { + // TODO +} diff --git a/widgets/aerc.go b/widgets/aerc.go index 26dc5f2..bf545f9 100644 --- a/widgets/aerc.go +++ b/widgets/aerc.go @@ -1,7 +1,6 @@ package widgets import ( - "fmt" "log" "github.com/gdamore/tcell" @@ -13,11 +12,14 @@ import ( type Aerc struct { accounts map[string]*AccountView + cmd func(cmd string) error grid *libui.Grid tabs *libui.Tabs } -func NewAerc(conf *config.AercConfig, logger *log.Logger) *Aerc { +func NewAerc(conf *config.AercConfig, logger *log.Logger, + cmd func(cmd string) error) *Aerc { + tabs := libui.NewTabs() mainGrid := libui.NewGrid().Rows([]libui.GridSpec{ @@ -37,12 +39,13 @@ func NewAerc(conf *config.AercConfig, logger *log.Logger) *Aerc { aerc := &Aerc{ accounts: make(map[string]*AccountView), + cmd: cmd, grid: mainGrid, tabs: tabs, } for _, acct := range conf.Accounts { - view := NewAccountView(&acct, logger, aerc.RunCommand) + view := NewAccountView(&acct, logger, cmd) aerc.accounts[acct.Name] = view tabs.Add(view, acct.Name) } @@ -73,7 +76,6 @@ func (aerc *Aerc) Event(event tcell.Event) bool { return acct.Event(event) } -func (aerc *Aerc) RunCommand(cmd string) error { - // TODO - return fmt.Errorf("TODO: execute '%s'", cmd) +func (aerc *Aerc) SelectedAccount() *AccountView { + return aerc.accounts[aerc.tabs.Tabs[aerc.tabs.Selected].Name] } diff --git a/widgets/directories.go b/widgets/directories.go index 11fe2d6..ae31d29 100644 --- a/widgets/directories.go +++ b/widgets/directories.go @@ -103,3 +103,40 @@ func (dirlist *DirectoryList) Draw(ctx *ui.Context) { row++ } } + +func (dirlist *DirectoryList) nextPrev(delta int) { + for i, dir := range dirlist.dirs { + if dir == dirlist.selected { + var j int + ndirs := len(dirlist.dirs) + for j = i + delta; j != i; j += delta { + if j < 0 { + j = ndirs - 1 + } + if j >= ndirs { + j = 0 + } + name := dirlist.dirs[j] + if len(dirlist.conf.Folders) > 1 && name != dirlist.selected { + idx := sort.SearchStrings(dirlist.conf.Folders, name) + if idx == len(dirlist.conf.Folders) || + dirlist.conf.Folders[idx] != name { + + continue + } + } + break + } + dirlist.Select(dirlist.dirs[j]) + break + } + } +} + +func (dirlist *DirectoryList) Next() { + dirlist.nextPrev(1) +} + +func (dirlist *DirectoryList) Prev() { + dirlist.nextPrev(-1) +}