From c656f58a6bfa49222399259c7e6d115f3b1aebf4 Mon Sep 17 00:00:00 2001 From: hitzhangjie Date: Tue, 24 May 2022 02:10:48 +0800 Subject: [PATCH] feat: support multiple default values This CL supports multiple default values like , this parameter will rendered like this in `generateView`: ``` --proxy=cfg1|cfg2|cfg3---------------------------------- |cfg1 | |cfg2 | |cfg3 | |------------------------------------------------------ ``` then we can use up/down arrow to select the wanted item, after press `enter` evaluateResult will be executed. This CL also let the parameter view's title use larger width. close #192 --- dialog/params.go | 22 ++++++++++++++++------ dialog/view.go | 27 +++++++++++++++++++++++---- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/dialog/params.go b/dialog/params.go index 8f7e507..0f56dd8 100644 --- a/dialog/params.go +++ b/dialog/params.go @@ -8,10 +8,11 @@ import ( ) var ( - views = []string{} - layoutStep = 3 - curView = -1 - idxView = 0 + views = []string{} + viewsUseMultiValues = map[string]bool{} + layoutStep = 3 + curView = -1 + idxView = 0 //CurrentCommand is the command before assigning to variables CurrentCommand string @@ -57,8 +58,17 @@ func evaluateParams(g *gocui.Gui, _ *gocui.View) error { for _, v := range views { view, _ := g.View(v) res := view.Buffer() - res = strings.Replace(res, "\n", "", -1) - paramsFilled[v] = strings.TrimSpace(res) + if _, ok := viewsUseMultiValues[v]; !ok { + res = strings.Replace(res, "\n", "", -1) + paramsFilled[v] = strings.TrimSpace(res) + } else { + _, cy := view.Cursor() + l, err := view.Line(cy) + if err != nil { + return err + } + paramsFilled[v] = strings.TrimSpace(l) + } } FinalCommand = insertParams(CurrentCommand, paramsFilled) return gocui.ErrQuit diff --git a/dialog/view.go b/dialog/view.go index be7d9c7..acdfd7a 100644 --- a/dialog/view.go +++ b/dialog/view.go @@ -1,13 +1,15 @@ package dialog import ( + "bytes" "fmt" "log" + "strings" "github.com/jroimartin/gocui" ) -func generateView(g *gocui.Gui, desc string, fill string, coords []int, editable bool) error { +func generateView(g *gocui.Gui, desc string, fill string, coords []int, editable, listStyle bool) error { if StringInSlice(desc, views) { return nil } @@ -23,6 +25,12 @@ func generateView(g *gocui.Gui, desc string, fill string, coords []int, editable view.Autoscroll = true view.Editable = editable + if listStyle { + view.Highlight = true + view.SelBgColor = gocui.ColorGreen + view.SelFgColor = gocui.ColorRed + } + views = append(views, desc) idxView++ @@ -45,11 +53,22 @@ func GenerateParamsLayout(params map[string]string, command string) { maxX, maxY := g.Size() generateView(g, "Command(TAB => Select next, ENTER => Execute command):", - command, []int{maxX / 10, maxY / 10, (maxX / 2) + (maxX / 3), maxY/10 + 5}, false) + command, []int{maxX / 10, maxY / 10, (maxX / 2) + (maxX / 3), maxY/10 + 5}, false, false) idx := 0 for k, v := range params { - generateView(g, k, v, []int{maxX / 10, (maxY / 4) + (idx+1)*layoutStep, - maxX/10 + 20, (maxY / 4) + 2 + (idx+1)*layoutStep}, true) + defaultValues := strings.Split(v, "|") + if len(defaultValues) <= 1 { + generateView(g, k, v, []int{maxX / 10, (maxY / 4) + (idx+1)*layoutStep, + maxX/2 + maxX/3, (maxY / 4) + 2 + (idx+1)*layoutStep}, true, false) + } else { + b := bytes.Buffer{} + for _, value := range defaultValues { + fmt.Fprintf(&b, "%s\n", value) + } + generateView(g, k, b.String(), []int{maxX / 10, (maxY / 4) + (idx+1)*layoutStep, + maxX/2 + maxX/3, (maxY / 4) + 2 + (idx+1)*layoutStep + len(defaultValues)}, true, true) + viewsUseMultiValues[k] = true + } idx++ }