From cf47763e5582563f712b4a40a9b299378aba9003 Mon Sep 17 00:00:00 2001 From: Koni Marti Date: Fri, 24 Nov 2023 16:03:03 +0100 Subject: patch/list: add list sub-cmd Implement the :patch list command. List the the current project and add a flag to list all saved projects. Use the pager to display the data and extract the pager commands and move them into the config package. Signed-off-by: Koni Marti Acked-by: Robin Jarry --- commands/patch/list.go | 113 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 commands/patch/list.go (limited to 'commands/patch') diff --git a/commands/patch/list.go b/commands/patch/list.go new file mode 100644 index 00000000..6dcc06e8 --- /dev/null +++ b/commands/patch/list.go @@ -0,0 +1,113 @@ +package patch + +import ( + "bufio" + "fmt" + "io" + "os/exec" + "time" + + "git.sr.ht/~rjarry/aerc/app" + "git.sr.ht/~rjarry/aerc/config" + "git.sr.ht/~rjarry/aerc/lib/pama" + "git.sr.ht/~rjarry/aerc/lib/pama/models" + "git.sr.ht/~rjarry/aerc/lib/ui" + "git.sr.ht/~rjarry/go-opt" + "github.com/gdamore/tcell/v2" +) + +type List struct { + All bool `opt:"-a"` +} + +func init() { + register(List{}) +} + +func (List) Aliases() []string { + return []string{"list", "ls"} +} + +func (l List) Execute(args []string) error { + m := pama.New() + current, err := m.CurrentProject() + if err != nil { + return err + } + + projects := []models.Project{current} + if l.All { + projects, err = m.Projects("") + if err != nil { + return err + } + } + + app.PushStatus(fmt.Sprintf("Current project: %s", current.Name), 30*time.Second) + + createWidget := func(r io.Reader) (ui.DrawableInteractive, error) { + pagerCmd, err := app.CmdFallbackSearch(config.PagerCmds(), true) + if err != nil { + return nil, err + } + + cmd := opt.SplitArgs(pagerCmd) + pager := exec.Command(cmd[0], cmd[1:]...) + pager.Stdin = r + + term, err := app.NewTerminal(pager) + if err != nil { + return nil, err + } + start := time.Now() + term.OnClose = func(err error) { + if time.Since(start) > 250*time.Millisecond { + app.CloseDialog() + return + } + term.OnEvent = func(_ tcell.Event) bool { + app.CloseDialog() + return true + } + } + return term, nil + } + + viewer, err := createWidget(m.NewReader(projects)) + if err != nil { + viewer = app.NewListBox( + "Press or to close. "+ + "Start typing to filter.", + numerify(m.NewReader(projects)), app.SelectedAccountUiConfig(), + func(_ string) { app.CloseDialog() }, + ) + } + + app.AddDialog(app.NewDialog( + ui.NewBox(viewer, "Patch Management", "", + app.SelectedAccountUiConfig(), + ), + // start pos on screen + func(h int) int { + return h / 8 + }, + // dialog height + func(h int) int { + return h - 2*h/8 + }, + )) + + return nil +} + +func numerify(r io.Reader) []string { + var lines []string + nr := 1 + scanner := bufio.NewScanner(r) + for scanner.Scan() { + s := scanner.Text() + lines = append(lines, fmt.Sprintf("%3d %s", nr, s)) + nr++ + } + return lines +} -- cgit