WIP: zenity command.

This commit is contained in:
Nuno Cruces 2020-01-08 18:12:29 +00:00
parent fd22f9bf8e
commit 7f608be6c2
7 changed files with 200 additions and 8 deletions

View file

@ -1,24 +1,200 @@
package main package main
import ( import (
"flag"
"os" "os"
"strings"
"rsc.io/getopt"
"github.com/ncruces/zenity" "github.com/ncruces/zenity"
"github.com/ncruces/zenity/internal/cmd" "github.com/ncruces/zenity/internal/cmd"
) )
var (
// Application Options
errorDlg bool
infoDlg bool
warningDlg bool
questionDlg bool
fileSelectionDlg bool
// General options
title string
// Message options
text string
iconName string
okLabel string
cancelLabel string
extraButton string
noWrap bool
ellipsize bool
defaultCancel bool
// File selection options
save bool
multiple bool
directory bool
confirmOverwrite bool
filename string
separator string
fileFilters FileFilters
)
func main() { func main() {
setupFlags()
getopt.Parse()
validateFlags()
opts := loadFlags()
cmd.Command = true cmd.Command = true
file, err := zenity.SelectFile() switch {
if err != nil { case errorDlg:
os.Stderr.WriteString(err.Error()) msgResult(zenity.Error(text, opts...))
os.Stderr.WriteString("\n") case infoDlg:
os.Exit(255) msgResult(zenity.Info(text, opts...))
case warningDlg:
msgResult(zenity.Warning(text, opts...))
case questionDlg:
msgResult(zenity.Question(text, opts...))
} }
if file == "" {
flag.Usage()
os.Exit(-1)
}
func setupFlags() {
// Application Options
flag.BoolVar(&errorDlg, "error", false, "Display error dialog")
flag.BoolVar(&infoDlg, "info", false, "Display info dialog")
flag.BoolVar(&warningDlg, "warning", false, "Display warning dialog")
flag.BoolVar(&questionDlg, "question", false, "Display question dialog")
flag.BoolVar(&fileSelectionDlg, "file-selection", false, "Display file selection dialog")
// General options
flag.StringVar(&title, "title", "", "Set the dialog title")
// Message options
flag.StringVar(&text, "text", "", "Set the dialog text")
flag.StringVar(&iconName, "icon-name", "", "Set the dialog icon (error, information, question, warning)")
flag.StringVar(&okLabel, "ok-label", "", "Set the label of the OK button")
flag.StringVar(&cancelLabel, "cancel-label", "", "Set the label of the Cancel button")
flag.StringVar(&extraButton, "extra-button", "", "Add an extra button")
flag.BoolVar(&noWrap, "no-wrap", false, "Do not enable text wrapping")
flag.BoolVar(&ellipsize, "ellipsize", false, "Enable ellipsizing in the dialog text")
flag.BoolVar(&defaultCancel, "default-cancel", false, "Give Cancel button focus by default")
// File selection options
flag.BoolVar(&save, "save", false, "Activate save mode")
flag.BoolVar(&multiple, "multiple", false, "Allow multiple files to be selected")
flag.BoolVar(&directory, "directory", false, "Activate directory-only selection")
flag.BoolVar(&confirmOverwrite, "confirm-overwrite", false, "Confirm file selection if filename already exists")
flag.StringVar(&filename, "filename", "", "Set the filename")
flag.StringVar(&separator, "separator", "", "Set output separator character")
flag.Var(&fileFilters, "file-filter", "Set a filename filter (NAME | PATTERN1 PATTERN2 ...)")
}
func validateFlags() {
var n int
if errorDlg {
n++
}
if infoDlg {
n++
}
if warningDlg {
n++
}
if questionDlg {
n++
}
if fileSelectionDlg {
n++
}
if n != 1 {
flag.Usage()
os.Exit(-1)
}
}
func loadFlags() []zenity.Option {
var options []zenity.Option
// General options
options = append(options, zenity.Title(title))
// Message options
var icon zenity.MessageIcon
switch iconName {
case "error", "dialog-error":
icon = zenity.ErrorIcon
case "info", "dialog-information":
icon = zenity.InfoIcon
case "question", "dialog-question":
icon = zenity.QuestionIcon
case "warning", "dialog-warning":
icon = zenity.WarningIcon
}
options = append(options, zenity.Icon(icon))
options = append(options, zenity.OKLabel(okLabel))
options = append(options, zenity.CancelLabel(cancelLabel))
options = append(options, zenity.ExtraButton(extraButton))
if noWrap {
options = append(options, zenity.NoWrap)
}
if ellipsize {
options = append(options, zenity.Ellipsize)
}
if defaultCancel {
options = append(options, zenity.DefaultCancel)
}
return options
}
func msgResult(ok bool, err error) {
if err == zenity.ErrExtraButton {
os.Stdout.WriteString(extraButton)
os.Stdout.WriteString(cmd.LineBreak)
os.Exit(1) os.Exit(1)
} }
os.Stdout.WriteString(file) if err != nil {
os.Stdout.WriteString("\n") os.Stderr.WriteString(err.Error())
os.Stderr.WriteString(cmd.LineBreak)
os.Exit(-1)
}
if ok {
os.Exit(0)
}
os.Exit(1)
}
type FileFilters struct {
list []zenity.FileFilter
}
func (f *FileFilters) String() string {
return "filename filter"
}
func (f *FileFilters) Set(s string) error {
var filter zenity.FileFilter
if split := strings.SplitN(s, "|", 2); len(split) > 0 {
filter.Name = split[0]
s = split[1]
}
filter.Exts = strings.Split(s, " ")
f.list = append(f.list, filter)
return nil
} }

View file

@ -1,3 +1,5 @@
// +build !windows,!darwin
package zenity package zenity
import ( import (

2
go.mod
View file

@ -1,3 +1,5 @@
module github.com/ncruces/zenity module github.com/ncruces/zenity
go 1.13 go 1.13
require rsc.io/getopt v0.0.0-20170811000552-20be20937449

2
go.sum Normal file
View file

@ -0,0 +1,2 @@
rsc.io/getopt v0.0.0-20170811000552-20be20937449 h1:UukjJOsjQH0DIuyyrcod6CXHS6cdaMMuJmrt+SN1j4A=
rsc.io/getopt v0.0.0-20170811000552-20be20937449/go.mod h1:dhCdeqAxkyt5u3/sKRkUXuHaMXUu1Pt13GTQAM2xnig=

5
internal/cmd/cmd_unix.go Normal file
View file

@ -0,0 +1,5 @@
// +build !windows
package cmd
const LineBreak = "\n"

View file

@ -0,0 +1,3 @@
package cmd
const LineBreak = "\r\n"

View file

@ -1,3 +1,5 @@
// +build !windows,!darwin
package zenity package zenity
import "os/exec" import "os/exec"