summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--aerc.go8
-rw-r--r--commands/commands.go28
-rw-r--r--commands/next-folder.go15
-rw-r--r--commands/prev-folder.go15
-rw-r--r--widgets/account.go10
-rw-r--r--widgets/aerc.go14
-rw-r--r--widgets/directories.go37
7 files changed, 119 insertions, 8 deletions
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)
+}