master > master: code go - fügte settings hinzu
This commit is contained in:
@@ -15,6 +15,14 @@ import (
|
||||
"gopkg.in/yaml.v3"
|
||||
)
|
||||
|
||||
/* ---------------------------------------------------------------- *
|
||||
* METHOD menu class methods
|
||||
* ---------------------------------------------------------------- */
|
||||
|
||||
func (menu *Menu) SetDefault(index int) {
|
||||
menu.Default = index
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------- *
|
||||
* METHOD show menu
|
||||
* ---------------------------------------------------------------- */
|
||||
@@ -29,7 +37,8 @@ func (menu Menu) ShowMenu() (bool, error) {
|
||||
err error
|
||||
)
|
||||
var promptMessages []string
|
||||
var options [][2]string
|
||||
var optionsFlattened []MenuOption
|
||||
var optionsKeyValue [][2]string
|
||||
var defaultOption string
|
||||
var breaks []int
|
||||
|
||||
@@ -40,22 +49,32 @@ func (menu Menu) ShowMenu() (bool, error) {
|
||||
promptMessages = append([]string{head}, promptMessages...)
|
||||
|
||||
// Zurück-Option einfügen
|
||||
defaultOption = fmt.Sprintf("%v", menu.DefaultOption)
|
||||
options = []([2]string){}
|
||||
for i, opt := range menu.Options {
|
||||
key := fmt.Sprintf("%v", i+1)
|
||||
subLabel := opt.SubLabel
|
||||
label := opt.Label
|
||||
if !(subLabel == "") {
|
||||
label = fmt.Sprintf("%v (\033[2m%v\033[0m)", opt.Label, subLabel)
|
||||
defaultOption = ""
|
||||
if menu.Default >= 0 {
|
||||
defaultOption = fmt.Sprintf("%v", menu.Default+1)
|
||||
}
|
||||
breaks = []int{}
|
||||
optionsFlattened = []MenuOption{}
|
||||
optionsKeyValue = []([2]string){}
|
||||
index = 0
|
||||
for _, suboptions := range menu.Options {
|
||||
for _, opt := range suboptions {
|
||||
optionsFlattened = append(optionsFlattened, opt)
|
||||
key := fmt.Sprintf("%v", index+1)
|
||||
subLabel := opt.SubLabel
|
||||
label := opt.Label
|
||||
if !(subLabel == "") {
|
||||
label = fmt.Sprintf("%v (\033[2m%v\033[0m)", opt.Label, subLabel)
|
||||
}
|
||||
optionsKeyValue = append(optionsKeyValue, [2]string{key, label})
|
||||
index++
|
||||
}
|
||||
options = append(options, [2]string{key, label})
|
||||
breaks = append(breaks, index-1)
|
||||
}
|
||||
breaks = []int{len(menu.Options) - 1}
|
||||
if !menu.IsRoot {
|
||||
options = append(options, [2]string{"z", "Zurück zum vorherigen Menü"})
|
||||
optionsKeyValue = append(optionsKeyValue, [2]string{"z", "Zurück zum vorherigen Menü"})
|
||||
}
|
||||
options = append(options, [2]string{"q", "Programm schließen"})
|
||||
optionsKeyValue = append(optionsKeyValue, [2]string{"q", "Programm schließen"})
|
||||
|
||||
// User Response immer abfragen und abarbeiten, bis quit/return.
|
||||
performClearScreen := !menu.IsRoot
|
||||
@@ -65,7 +84,7 @@ func (menu Menu) ShowMenu() (bool, error) {
|
||||
}
|
||||
performClearScreen = true
|
||||
|
||||
choice, meta = PromptListOfOptions(promptMessages, options, breaks, defaultOption)
|
||||
choice, meta = promptListOfOptions(promptMessages, optionsKeyValue, breaks, defaultOption)
|
||||
|
||||
// Falls quit wählt, -> quit:
|
||||
if (menu.IsRoot && meta) || choice == "q" {
|
||||
@@ -80,8 +99,8 @@ func (menu Menu) ShowMenu() (bool, error) {
|
||||
// sonst führe die assoziierte Methode aus
|
||||
index64, _ := strconv.ParseInt(choice, 10, 64)
|
||||
index = int(index64) - 1
|
||||
if 0 <= index && index < len(menu.Options) {
|
||||
opt := menu.Options[index]
|
||||
if 0 <= index && index < len(optionsFlattened) {
|
||||
opt := optionsFlattened[index]
|
||||
// Entweder Untermenü öffnen oder Action ausführen
|
||||
if opt.Submenu != nil {
|
||||
quit, err = opt.Submenu.ShowMenu()
|
||||
@@ -93,13 +112,19 @@ func (menu Menu) ShowMenu() (bool, error) {
|
||||
if err != nil {
|
||||
logging.LogError(err)
|
||||
}
|
||||
if cancel {
|
||||
continue
|
||||
}
|
||||
quit := logging.PromptAnyKeyToContinue()
|
||||
// Falls während der Action der User Meta+D klickt, -> quit:
|
||||
if quit {
|
||||
return true, nil
|
||||
// Falls ForceReturn, dann nach Ausführung der Action, -> return
|
||||
if menu.ForceReturn {
|
||||
return false, nil
|
||||
} else {
|
||||
// Falls während der Action der User Meta+D klickt, -> return:
|
||||
if cancel {
|
||||
continue
|
||||
}
|
||||
quit := logging.PromptAnyKeyToContinue()
|
||||
// Falls nach der Action der User Meta+D klickt, -> quit:
|
||||
if quit {
|
||||
return true, nil
|
||||
}
|
||||
}
|
||||
} else {
|
||||
logging.LogWarn("Option noch nicht implementiert.")
|
||||
|
||||
@@ -6,6 +6,7 @@ package menus
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"ads/internal/core/logging"
|
||||
"ads/internal/core/utils"
|
||||
@@ -16,7 +17,7 @@ import (
|
||||
* ---------------------------------------------------------------- */
|
||||
|
||||
// Zeigt Prompt mit Liste von Optionen an
|
||||
func PromptListOfOptions(messages []string, options [][2]string, breaks []int, defaultChoice string) (string, bool) {
|
||||
func promptListOfOptions(messages []string, options [][2]string, breaks []int, defaultChoice string) (string, bool) {
|
||||
var n = len(options)
|
||||
var (
|
||||
choice string
|
||||
@@ -32,6 +33,8 @@ func PromptListOfOptions(messages []string, options [][2]string, breaks []int, d
|
||||
lines = append(lines, message)
|
||||
}
|
||||
lines = append(lines, "")
|
||||
textbar := fmt.Sprintf(" \033[93m+%s+\033[0m", strings.Repeat("-", 40))
|
||||
lines = append(lines, textbar)
|
||||
for i, obj := range options {
|
||||
key := obj[0]
|
||||
label := obj[1]
|
||||
@@ -42,13 +45,14 @@ func PromptListOfOptions(messages []string, options [][2]string, breaks []int, d
|
||||
lines = append(lines, fmt.Sprintf(" \033[93;1m%v)\033[0m %v", key, label))
|
||||
}
|
||||
if i < n-1 && utils.ArrayContains(breaks, i) {
|
||||
lines = append(lines, " \033[93m--------\033[0m")
|
||||
lines = append(lines, " \033[93m+----\033[0m")
|
||||
}
|
||||
i++
|
||||
}
|
||||
if !(defaultChoice == "" || defaultChoice == "-1") {
|
||||
lines = append(lines, textbar)
|
||||
if !(defaultChoice == "") {
|
||||
lines = append(lines, "")
|
||||
lines = append(lines, "\033[91;2m*\033[0m\033[2m = Default\033[0m")
|
||||
lines = append(lines, " \033[91;2m*\033[0m\033[2m = Default\033[0m")
|
||||
}
|
||||
|
||||
// Wiederhole Prompt, bis gültige Eingabe erreicht
|
||||
|
||||
@@ -19,10 +19,11 @@ type MenuOption struct {
|
||||
|
||||
type Menu struct {
|
||||
IsRoot bool
|
||||
ForceReturn bool
|
||||
Path []string
|
||||
PromptMessages []string
|
||||
Options []MenuOption
|
||||
DefaultOption int
|
||||
Options [][]MenuOption
|
||||
Default int
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------- *
|
||||
|
||||
Reference in New Issue
Block a user