diff --git a/dialog/dialog.go b/dialog/dialog.go new file mode 100644 index 0000000..c3ee92c --- /dev/null +++ b/dialog/dialog.go @@ -0,0 +1,6 @@ +package dialog + +type FileFilter struct { + Name string + Exts []string +} diff --git a/dialog/dialog_darwin.go b/dialog/dialog_darwin.go index 9a2780e..ca79d11 100644 --- a/dialog/dialog_darwin.go +++ b/dialog/dialog_darwin.go @@ -14,7 +14,7 @@ func OpenFile(title, defaultPath string, filters []FileFilter) (string, error) { Operation: "chooseFile", Title: title, DefaultPath: defaultPath, - Filter: toFilter(filters), + Filter: appleFilters(filters), }) out, err := cmd.Output() if err != nil { @@ -33,7 +33,7 @@ func OpenFiles(title, defaultPath string, filters []FileFilter) ([]string, error Multiple: true, Title: title, DefaultPath: defaultPath, - Filter: toFilter(filters), + Filter: appleFilters(filters), }) out, err := cmd.Output() if err != nil { @@ -45,7 +45,7 @@ func OpenFiles(title, defaultPath string, filters []FileFilter) ([]string, error return strings.Split(string(out), "\x00"), nil } -func SaveFile(title, defaultPath string, filters []FileFilter) (string, error) { +func SaveFile(title, defaultPath string, confirmOverwrite bool, filters []FileFilter) (string, error) { cmd := exec.Command("osascript", "-l", "JavaScript") cmd.Stdin = scriptExpand(scriptData{ Operation: "chooseFileName", @@ -79,12 +79,7 @@ func PickFolder(title, defaultPath string) (string, error) { return string(out), nil } -type FileFilter struct { - Name string - Exts []string -} - -func toFilter(filters []FileFilter) []string { +func appleFilters(filters []FileFilter) []string { var filter []string for _, f := range filters { for _, e := range f.Exts { diff --git a/dialog/dialog_linux.go b/dialog/dialog_linux.go new file mode 100644 index 0000000..5b8a1bc --- /dev/null +++ b/dialog/dialog_linux.go @@ -0,0 +1,107 @@ +package dialog + +import ( + "os/exec" + "strings" +) + +func OpenFile(title, defaultPath string, filters []FileFilter) (string, error) { + args := []string{"--file-selection"} + if title != "" { + args = append(args, "--title="+title) + } + if defaultPath != "" { + args = append(args, "--filename="+defaultPath) + } + args = append(args, zenityFilters(filters)...) + cmd := exec.Command("zenity", args...) + out, err := cmd.Output() + if err != nil { + return "", err + } + if len(out) > 0 { + out = out[:len(out)-1] + } + return string(out), nil +} + +func OpenFiles(title, defaultPath string, filters []FileFilter) ([]string, error) { + args := []string{"--file-selection", "--multiple", "--separator=\x1e"} + if title != "" { + args = append(args, "--title="+title) + } + if defaultPath != "" { + args = append(args, "--filename="+defaultPath) + } + args = append(args, zenityFilters(filters)...) + cmd := exec.Command("zenity", args...) + out, err := cmd.Output() + if err != nil { + return nil, err + } + if len(out) > 0 { + out = out[:len(out)-1] + } + return strings.Split(string(out), "\x1e"), nil +} + +func SaveFile(title, defaultPath string, confirmOverwrite bool, filters []FileFilter) (string, error) { + args := []string{"--file-selection", "--save"} + if title != "" { + args = append(args, "--title="+title) + } + if defaultPath != "" { + args = append(args, "--filename="+defaultPath) + } + if confirmOverwrite { + args = append(args, "--confirm-overwrite") + } + args = append(args, zenityFilters(filters)...) + cmd := exec.Command("zenity", args...) + out, err := cmd.Output() + if err != nil { + return "", err + } + if len(out) > 0 { + out = out[:len(out)-1] + } + return string(out), nil +} + +func PickFolder(title, defaultPath string) (string, error) { + args := []string{"--file-selection", "--directory"} + if title != "" { + args = append(args, "--title="+title) + } + if defaultPath != "" { + args = append(args, "--filename="+defaultPath) + } + cmd := exec.Command("zenity", args...) + out, err := cmd.Output() + if err != nil { + return "", err + } + if len(out) > 0 { + out = out[:len(out)-1] + } + return string(out), nil +} + +func zenityFilters(filters []FileFilter) []string { + var res []string + for _, f := range filters { + var buf strings.Builder + buf.WriteString("--file-filter=") + if f.Name != "" { + buf.WriteString(f.Name) + buf.WriteRune('|') + } + for _, e := range f.Exts { + buf.WriteRune('*') + buf.WriteString(e) + buf.WriteRune(' ') + } + res = append(res, buf.String()) + } + return res +} diff --git a/dialog/dialog_test.go b/dialog/dialog_test.go index 211fdaa..62860a2 100644 --- a/dialog/dialog_test.go +++ b/dialog/dialog_test.go @@ -31,7 +31,7 @@ func TestOpenFiles(t *testing.T) { } func TestSaveFile(t *testing.T) { - ret, err := SaveFile("", "", []FileFilter{ + ret, err := SaveFile("", "", true, []FileFilter{ {"Go files", []string{".go"}}, {"Web files", []string{".html", ".js", ".css"}}, {"Image files", []string{".png", ".ico"}},