about 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)
+}
>466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518