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  }