github.com/secoba/wails/v2@v2.6.4/internal/frontend/desktop/linux/dialog.go (about) 1 //go:build linux 2 // +build linux 3 4 package linux 5 6 import ( 7 "github.com/secoba/wails/v2/internal/frontend" 8 "unsafe" 9 ) 10 11 /* 12 #include <stdlib.h> 13 #include "gtk/gtk.h" 14 */ 15 import "C" 16 17 const ( 18 GTK_FILE_CHOOSER_ACTION_OPEN C.GtkFileChooserAction = C.GTK_FILE_CHOOSER_ACTION_OPEN 19 GTK_FILE_CHOOSER_ACTION_SAVE C.GtkFileChooserAction = C.GTK_FILE_CHOOSER_ACTION_SAVE 20 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER C.GtkFileChooserAction = C.GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER 21 ) 22 23 var openFileResults = make(chan []string) 24 var messageDialogResult = make(chan string) 25 26 func (f *Frontend) OpenFileDialog(dialogOptions frontend.OpenDialogOptions) (result string, err error) { 27 f.mainWindow.OpenFileDialog(dialogOptions, 0, GTK_FILE_CHOOSER_ACTION_OPEN) 28 results := <-openFileResults 29 if len(results) == 1 { 30 return results[0], nil 31 } 32 return "", nil 33 } 34 35 func (f *Frontend) OpenMultipleFilesDialog(dialogOptions frontend.OpenDialogOptions) ([]string, error) { 36 f.mainWindow.OpenFileDialog(dialogOptions, 1, GTK_FILE_CHOOSER_ACTION_OPEN) 37 result := <-openFileResults 38 return result, nil 39 } 40 41 func (f *Frontend) OpenDirectoryDialog(dialogOptions frontend.OpenDialogOptions) (string, error) { 42 f.mainWindow.OpenFileDialog(dialogOptions, 0, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER) 43 result := <-openFileResults 44 if len(result) == 1 { 45 return result[0], nil 46 } 47 return "", nil 48 } 49 50 func (f *Frontend) SaveFileDialog(dialogOptions frontend.SaveDialogOptions) (string, error) { 51 options := frontend.OpenDialogOptions{ 52 DefaultDirectory: dialogOptions.DefaultDirectory, 53 DefaultFilename: dialogOptions.DefaultFilename, 54 Title: dialogOptions.Title, 55 Filters: dialogOptions.Filters, 56 ShowHiddenFiles: dialogOptions.ShowHiddenFiles, 57 CanCreateDirectories: dialogOptions.CanCreateDirectories, 58 } 59 f.mainWindow.OpenFileDialog(options, 0, GTK_FILE_CHOOSER_ACTION_SAVE) 60 results := <-openFileResults 61 if len(results) == 1 { 62 return results[0], nil 63 } 64 return "", nil 65 } 66 67 func (f *Frontend) MessageDialog(dialogOptions frontend.MessageDialogOptions) (string, error) { 68 f.mainWindow.MessageDialog(dialogOptions) 69 return <-messageDialogResult, nil 70 } 71 72 //export processOpenFileResult 73 func processOpenFileResult(carray **C.char) { 74 // Create a Go slice from the C array 75 var result []string 76 goArray := (*[1024]*C.char)(unsafe.Pointer(carray))[:1024:1024] 77 for _, s := range goArray { 78 if s == nil { 79 break 80 } 81 result = append(result, C.GoString(s)) 82 } 83 openFileResults <- result 84 } 85 86 //export processMessageDialogResult 87 func processMessageDialogResult(result *C.char) { 88 messageDialogResult <- C.GoString(result) 89 }