Start building out command subsystem
This commit is contained in:
parent
62862d8a9e
commit
b60999c39e
7 changed files with 119 additions and 8 deletions
8
aerc.go
8
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)
|
||||
}
|
||||
|
|
28
commands/commands.go
Normal file
28
commands/commands.go
Normal file
|
@ -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)
|
||||
}
|
15
commands/next-folder.go
Normal file
15
commands/next-folder.go
Normal file
|
@ -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
|
||||
}
|
15
commands/prev-folder.go
Normal file
15
commands/prev-folder.go
Normal file
|
@ -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
|
||||
}
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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]
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue