Attach, modal (unix).

This commit is contained in:
Nuno Cruces 2022-06-02 11:24:24 +00:00
parent ab7621bec9
commit 69c05cdd0d
21 changed files with 65 additions and 36 deletions

View file

@ -4,7 +4,7 @@ import "image/color"
// SelectColor displays the color selection dialog. // SelectColor displays the color selection dialog.
// //
// Valid options: Title, Color, ShowPalette. // Valid options: Title, WindowIcon, Attach, Modal, Color, ShowPalette.
// //
// May return: ErrCanceled. // May return: ErrCanceled.
func SelectColor(options ...Option) (color.Color, error) { func SelectColor(options ...Option) (color.Color, error) {

View file

@ -11,7 +11,7 @@ import (
func selectColor(opts options) (color.Color, error) { func selectColor(opts options) (color.Color, error) {
args := []string{"--color-selection"} args := []string{"--color-selection"}
args = appendTitle(args, opts) args = appendGeneral(args, opts)
if opts.color != nil { if opts.color != nil {
args = append(args, "--color", zenutil.UnparseColor(opts.color)) args = append(args, "--color", zenutil.UnparseColor(opts.color))
} }

View file

@ -5,7 +5,7 @@ import "time"
// Calendar displays the calendar dialog. // Calendar displays the calendar dialog.
// //
// Valid options: Title, Width, Height, OKLabel, CancelLabel, ExtraButton, // Valid options: Title, Width, Height, OKLabel, CancelLabel, ExtraButton,
// Icon, DefaultDate. // WindowIcon, Attach, Modal, DefaultDate.
// //
// May return: ErrCanceled, ErrExtraButton. // May return: ErrCanceled, ErrExtraButton.
func Calendar(text string, options ...Option) (time.Time, error) { func Calendar(text string, options ...Option) (time.Time, error) {

View file

@ -11,7 +11,7 @@ import (
func calendar(text string, opts options) (time.Time, error) { func calendar(text string, opts options) (time.Time, error) {
args := []string{"--calendar", "--text", text, "--date-format", zenutil.DateFormat} args := []string{"--calendar", "--text", text, "--date-format", zenutil.DateFormat}
args = appendTitle(args, opts) args = appendGeneral(args, opts)
args = appendButtons(args, opts) args = appendButtons(args, opts)
args = appendWidthHeight(args, opts) args = appendWidthHeight(args, opts)
args = appendWindowIcon(args, opts) args = appendWindowIcon(args, opts)

View file

@ -3,7 +3,7 @@ package zenity
// Entry displays the text entry dialog. // Entry displays the text entry dialog.
// //
// Valid options: Title, Width, Height, OKLabel, CancelLabel, ExtraButton, // Valid options: Title, Width, Height, OKLabel, CancelLabel, ExtraButton,
// Icon, EntryText, HideText. // WindowIcon, Attach, Modal, EntryText, HideText.
// //
// May return: ErrCanceled, ErrExtraButton. // May return: ErrCanceled, ErrExtraButton.
func Entry(text string, options ...Option) (string, error) { func Entry(text string, options ...Option) (string, error) {

View file

@ -8,7 +8,7 @@ import (
func entry(text string, opts options) (string, error) { func entry(text string, opts options) (string, error) {
args := []string{"--entry", "--text", text} args := []string{"--entry", "--text", text}
args = appendTitle(args, opts) args = appendGeneral(args, opts)
args = appendButtons(args, opts) args = appendButtons(args, opts)
args = appendWidthHeight(args, opts) args = appendWidthHeight(args, opts)
args = appendWindowIcon(args, opts) args = appendWindowIcon(args, opts)

10
file.go
View file

@ -8,7 +8,8 @@ import (
// SelectFile displays the file selection dialog. // SelectFile displays the file selection dialog.
// //
// Valid options: Title, Directory, Filename, ShowHidden, FileFilter(s). // Valid options: Title, WindowIcon, Attach, Modal, Directory, Filename,
// ShowHidden, FileFilter(s).
// //
// May return: ErrCanceled. // May return: ErrCanceled.
func SelectFile(options ...Option) (string, error) { func SelectFile(options ...Option) (string, error) {
@ -17,7 +18,8 @@ func SelectFile(options ...Option) (string, error) {
// SelectFileMultiple displays the multiple file selection dialog. // SelectFileMultiple displays the multiple file selection dialog.
// //
// Valid options: Title, Directory, Filename, ShowHidden, FileFilter(s). // Valid options: Title, WindowIcon, Attach, Modal, Directory, Filename,
// ShowHidden, FileFilter(s).
// //
// May return: ErrCanceled, ErrUnsupported. // May return: ErrCanceled, ErrUnsupported.
func SelectFileMultiple(options ...Option) ([]string, error) { func SelectFileMultiple(options ...Option) ([]string, error) {
@ -31,8 +33,8 @@ func SelectFileMutiple(options ...Option) ([]string, error) {
// SelectFileSave displays the save file selection dialog. // SelectFileSave displays the save file selection dialog.
// //
// Valid options: Title, Filename, ConfirmOverwrite, ConfirmCreate, ShowHidden, // Valid options: Title, WindowIcon, Attach, Modal, Filename,
// FileFilter(s). // ConfirmOverwrite, ConfirmCreate, ShowHidden, FileFilter(s).
// //
// May return: ErrCanceled. // May return: ErrCanceled.
func SelectFileSave(options ...Option) (string, error) { func SelectFileSave(options ...Option) (string, error) {

View file

@ -10,7 +10,7 @@ import (
func selectFile(opts options) (string, error) { func selectFile(opts options) (string, error) {
args := []string{"--file-selection"} args := []string{"--file-selection"}
args = appendTitle(args, opts) args = appendGeneral(args, opts)
args = appendFileArgs(args, opts) args = appendFileArgs(args, opts)
out, err := zenutil.Run(opts.ctx, args) out, err := zenutil.Run(opts.ctx, args)
@ -19,7 +19,7 @@ func selectFile(opts options) (string, error) {
func selectFileMultiple(opts options) ([]string, error) { func selectFileMultiple(opts options) ([]string, error) {
args := []string{"--file-selection", "--multiple", "--separator", zenutil.Separator} args := []string{"--file-selection", "--multiple", "--separator", zenutil.Separator}
args = appendTitle(args, opts) args = appendGeneral(args, opts)
args = appendFileArgs(args, opts) args = appendFileArgs(args, opts)
out, err := zenutil.Run(opts.ctx, args) out, err := zenutil.Run(opts.ctx, args)
@ -28,7 +28,7 @@ func selectFileMultiple(opts options) ([]string, error) {
func selectFileSave(opts options) (string, error) { func selectFileSave(opts options) (string, error) {
args := []string{"--file-selection", "--save"} args := []string{"--file-selection", "--save"}
args = appendTitle(args, opts) args = appendGeneral(args, opts)
args = appendFileArgs(args, opts) args = appendFileArgs(args, opts)
out, err := zenutil.Run(opts.ctx, args) out, err := zenutil.Run(opts.ctx, args)

View file

@ -3,7 +3,7 @@ package zenity
// List displays the list dialog. // List displays the list dialog.
// //
// Valid options: Title, Width, Height, OKLabel, CancelLabel, ExtraButton, // Valid options: Title, Width, Height, OKLabel, CancelLabel, ExtraButton,
// Icon, DefaultItems, DisallowEmpty. // WindowIcon, Attach, Modal, DefaultItems, DisallowEmpty.
// //
// May return: ErrCanceled, ErrExtraButton, ErrUnsupported. // May return: ErrCanceled, ErrExtraButton, ErrUnsupported.
func List(text string, items []string, options ...Option) (string, error) { func List(text string, items []string, options ...Option) (string, error) {
@ -20,7 +20,7 @@ func ListItems(text string, items ...string) (string, error) {
// ListMultiple displays the list dialog, allowing multiple items to be selected. // ListMultiple displays the list dialog, allowing multiple items to be selected.
// //
// Valid options: Title, Width, Height, OKLabel, CancelLabel, ExtraButton, // Valid options: Title, Width, Height, OKLabel, CancelLabel, ExtraButton,
// Icon, DefaultItems, DisallowEmpty. // WindowIcon, Attach, Modal, DefaultItems, DisallowEmpty.
// //
// May return: ErrCanceled, ErrExtraButton, ErrUnsupported. // May return: ErrCanceled, ErrExtraButton, ErrUnsupported.
func ListMultiple(text string, items []string, options ...Option) ([]string, error) { func ListMultiple(text string, items []string, options ...Option) ([]string, error) {

View file

@ -6,7 +6,7 @@ import "github.com/ncruces/zenity/internal/zenutil"
func list(text string, items []string, opts options) (string, error) { func list(text string, items []string, opts options) (string, error) {
args := []string{"--list", "--column=", "--hide-header", "--text", text} args := []string{"--list", "--column=", "--hide-header", "--text", text}
args = appendTitle(args, opts) args = appendGeneral(args, opts)
args = appendButtons(args, opts) args = appendButtons(args, opts)
args = appendWidthHeight(args, opts) args = appendWidthHeight(args, opts)
args = appendWindowIcon(args, opts) args = appendWindowIcon(args, opts)
@ -18,7 +18,7 @@ func list(text string, items []string, opts options) (string, error) {
func listMultiple(text string, items []string, opts options) ([]string, error) { func listMultiple(text string, items []string, opts options) ([]string, error) {
args := []string{"--list", "--column=", "--hide-header", "--text", text, "--multiple", "--separator", zenutil.Separator} args := []string{"--list", "--column=", "--hide-header", "--text", text, "--multiple", "--separator", zenutil.Separator}
args = appendTitle(args, opts) args = appendGeneral(args, opts)
args = appendButtons(args, opts) args = appendButtons(args, opts)
args = appendWidthHeight(args, opts) args = appendWidthHeight(args, opts)
args = appendWindowIcon(args, opts) args = appendWindowIcon(args, opts)

14
msg.go
View file

@ -3,7 +3,7 @@ package zenity
// Question displays the question dialog. // Question displays the question dialog.
// //
// Valid options: Title, Width, Height, OKLabel, CancelLabel, ExtraButton, // Valid options: Title, Width, Height, OKLabel, CancelLabel, ExtraButton,
// Icon, NoWrap, Ellipsize, DefaultCancel. // Icon, WindowIcon, Attach, Modal, NoWrap, Ellipsize, DefaultCancel.
// //
// May return: ErrCanceled, ErrExtraButton. // May return: ErrCanceled, ErrExtraButton.
func Question(text string, options ...Option) error { func Question(text string, options ...Option) error {
@ -12,8 +12,8 @@ func Question(text string, options ...Option) error {
// Info displays the info dialog. // Info displays the info dialog.
// //
// Valid options: Title, Width, Height, OKLabel, ExtraButton, Icon, // Valid options: Title, Width, Height, OKLabel, ExtraButton,
// NoWrap, Ellipsize. // Icon, WindowIcon, Attach, Modal, NoWrap, Ellipsize.
// //
// May return: ErrCanceled, ErrExtraButton. // May return: ErrCanceled, ErrExtraButton.
func Info(text string, options ...Option) error { func Info(text string, options ...Option) error {
@ -22,8 +22,8 @@ func Info(text string, options ...Option) error {
// Warning displays the warning dialog. // Warning displays the warning dialog.
// //
// Valid options: Title, Width, Height, OKLabel, ExtraButton, Icon, // Valid options: Title, Width, Height, OKLabel, ExtraButton,
// NoWrap, Ellipsize. // Icon, WindowIcon, Attach, Modal, NoWrap, Ellipsize.
// //
// May return: ErrCanceled, ErrExtraButton. // May return: ErrCanceled, ErrExtraButton.
func Warning(text string, options ...Option) error { func Warning(text string, options ...Option) error {
@ -32,8 +32,8 @@ func Warning(text string, options ...Option) error {
// Error displays the error dialog. // Error displays the error dialog.
// //
// Valid options: Title, Width, Height, OKLabel, ExtraButton, Icon, // Valid options: Title, Width, Height, OKLabel, ExtraButton,
// NoWrap, Ellipsize. // Icon, WindowIcon, Attach, Modal, NoWrap, Ellipsize.
// //
// May return: ErrCanceled, ErrExtraButton. // May return: ErrCanceled, ErrExtraButton.
func Error(text string, options ...Option) error { func Error(text string, options ...Option) error {

View file

@ -16,7 +16,7 @@ func message(kind messageKind, text string, opts options) error {
case errorKind: case errorKind:
args = append(args, "--error") args = append(args, "--error")
} }
args = appendTitle(args, opts) args = appendGeneral(args, opts)
args = appendButtons(args, opts) args = appendButtons(args, opts)
args = appendWidthHeight(args, opts) args = appendWidthHeight(args, opts)
args = appendWindowIcon(args, opts) args = appendWindowIcon(args, opts)

View file

@ -6,7 +6,7 @@ import "github.com/ncruces/zenity/internal/zenutil"
func notify(text string, opts options) error { func notify(text string, opts options) error {
args := []string{"--notification", "--text", text} args := []string{"--notification", "--text", text}
args = appendTitle(args, opts) args = appendGeneral(args, opts)
switch opts.icon { switch opts.icon {
case ErrorIcon: case ErrorIcon:
args = append(args, "--window-icon=dialog-error") args = append(args, "--window-icon=dialog-error")

View file

@ -3,7 +3,7 @@ package zenity
// Progress displays the progress indication dialog. // Progress displays the progress indication dialog.
// //
// Valid options: Title, Width, Height, OKLabel, CancelLabel, ExtraButton, // Valid options: Title, Width, Height, OKLabel, CancelLabel, ExtraButton,
// Icon, MaxValue, Pulsate, NoCancel, TimeRemaining. // Icon, WindowIcon, Attach, Modal, MaxValue, Pulsate, NoCancel, TimeRemaining.
// //
// May return: ErrUnsupported. // May return: ErrUnsupported.
func Progress(options ...Option) (ProgressDialog, error) { func Progress(options ...Option) (ProgressDialog, error) {

View file

@ -6,7 +6,7 @@ import "github.com/ncruces/zenity/internal/zenutil"
func progress(opts options) (ProgressDialog, error) { func progress(opts options) (ProgressDialog, error) {
args := []string{"--progress"} args := []string{"--progress"}
args = appendTitle(args, opts) args = appendGeneral(args, opts)
args = appendButtons(args, opts) args = appendButtons(args, opts)
args = appendWidthHeight(args, opts) args = appendWidthHeight(args, opts)
args = appendWindowIcon(args, opts) args = appendWindowIcon(args, opts)

3
pwd.go
View file

@ -2,7 +2,8 @@ package zenity
// Password displays the password dialog. // Password displays the password dialog.
// //
// Valid options: Title, OKLabel, CancelLabel, ExtraButton, Icon, Username. // Valid options: Title, OKLabel, CancelLabel, ExtraButton,
// WindowIcon, Attach, Modal, Username.
// //
// May return: ErrCanceled, ErrExtraButton. // May return: ErrCanceled, ErrExtraButton.
func Password(options ...Option) (usr string, pwd string, err error) { func Password(options ...Option) (usr string, pwd string, err error) {

View file

@ -6,7 +6,7 @@ import "github.com/ncruces/zenity/internal/zenutil"
func password(opts options) (string, string, error) { func password(opts options) (string, string, error) {
args := []string{"--password"} args := []string{"--password"}
args = appendTitle(args, opts) args = appendGeneral(args, opts)
args = appendButtons(args, opts) args = appendButtons(args, opts)
if opts.username { if opts.username {
args = append(args, "--username") args = append(args, "--username")

View file

@ -4,6 +4,7 @@ package zenity
import ( import (
"bytes" "bytes"
"fmt"
"os/exec" "os/exec"
"strconv" "strconv"
"strings" "strings"
@ -11,10 +12,16 @@ import (
"github.com/ncruces/zenity/internal/zenutil" "github.com/ncruces/zenity/internal/zenutil"
) )
func appendTitle(args []string, opts options) []string { func appendGeneral(args []string, opts options) []string {
if opts.title != nil { if opts.title != nil {
args = append(args, "--title", *opts.title) args = append(args, "--title", *opts.title)
} }
if opts.attach != nil {
args = append(args, "--attach", fmt.Sprint(opts.attach))
}
if opts.modal {
args = append(args, "--modal")
}
return args return args
} }

View file

@ -11,9 +11,13 @@ import (
"github.com/ncruces/zenity/internal/zenutil" "github.com/ncruces/zenity/internal/zenutil"
) )
func Test_appendTitle(t *testing.T) { func Test_appendGeneral(t *testing.T) {
got := appendTitle(nil, options{title: stringPtr("Title")}) got := appendGeneral(nil, options{
want := []string{"--title", "Title"} title: stringPtr("Title"),
attach: 12345,
modal: true,
})
want := []string{"--title", "Title", "--attach", "12345", "--modal"}
if !reflect.DeepEqual(got, want) { if !reflect.DeepEqual(got, want) {
t.Errorf("appendTitle() = %v; want %v", got, want) t.Errorf("appendTitle() = %v; want %v", got, want)
} }

View file

@ -44,6 +44,8 @@ type options struct {
defaultCancel bool defaultCancel bool
icon any icon any
windowIcon any windowIcon any
attach any
modal bool
// Message options // Message options
noWrap bool noWrap bool
@ -169,7 +171,7 @@ func Icon(icon any) Option {
return funcOption(func(o *options) { o.icon = icon }) return funcOption(func(o *options) { o.icon = icon })
} }
// WindowIcon returns an Option to set the dialog icon (macOS and Unix only). // WindowIcon returns an Option to set the window icon.
// //
// WindowIcon accepts a DialogIcon, or a string path. // WindowIcon accepts a DialogIcon, or a string path.
func WindowIcon(icon any) Option { func WindowIcon(icon any) Option {
@ -182,13 +184,23 @@ func WindowIcon(icon any) Option {
return funcOption(func(o *options) { o.windowIcon = icon }) return funcOption(func(o *options) { o.windowIcon = icon })
} }
// CustomIcon returns an Option to set a custom dialog icon, loaded from a file. // CustomIcon returns an Option to set a custom dialog icon.
// //
// Deprecated: use Icon instead. // Deprecated: use Icon instead.
func CustomIcon(path string) Option { func CustomIcon(path string) Option {
return Icon(path) return Icon(path)
} }
// Attach returns an Option to set the parent window to attach to.
func Attach(id any) Option {
return funcOption(func(o *options) { o.attach = id })
}
// Modal returns an Option to set the modal hint.
func Modal() Option {
return funcOption(func(o *options) { o.modal = true })
}
// Context returns an Option to set a Context that can dismiss the dialog. // Context returns an Option to set a Context that can dismiss the dialog.
// //
// Dialogs dismissed by ctx return ctx.Err(). // Dialogs dismissed by ctx return ctx.Err().

View file

@ -27,6 +27,9 @@ func Test_applyOptions(t *testing.T) {
{name: "WindowIcon", args: WindowIcon("error"), want: options{windowIcon: "error"}}, {name: "WindowIcon", args: WindowIcon("error"), want: options{windowIcon: "error"}},
{name: "Icon", args: Icon(ErrorIcon), want: options{icon: ErrorIcon}}, {name: "Icon", args: Icon(ErrorIcon), want: options{icon: ErrorIcon}},
{name: "Icon", args: Icon("error"), want: options{icon: "error"}}, {name: "Icon", args: Icon("error"), want: options{icon: "error"}},
{name: "Attach", args: Attach(12345), want: options{attach: 12345}},
{name: "Attach", args: Attach("Terminal"), want: options{attach: "Terminal"}},
{name: "Modal", args: Modal(), want: options{modal: true}},
// Message options // Message options
{name: "NoWrap", args: NoWrap(), want: options{noWrap: true}}, {name: "NoWrap", args: NoWrap(), want: options{noWrap: true}},