github.com/AlpineAIO/wails/v2@v2.0.0-beta.32.0.20240505041856-1047a8fa5fef/internal/go-common-file-dialog/cfd/iFileSaveDialog.go (about)

     1  //go:build windows
     2  // +build windows
     3  
     4  package cfd
     5  
     6  import (
     7  	"github.com/AlpineAIO/wails/v2/internal/go-common-file-dialog/util"
     8  	"github.com/go-ole/go-ole"
     9  	"unsafe"
    10  )
    11  
    12  var (
    13  	saveFileDialogCLSID = ole.NewGUID("{C0B4E2F3-BA21-4773-8DBA-335EC946EB8B}")
    14  	saveFileDialogIID   = ole.NewGUID("{84bccd23-5fde-4cdb-aea4-af64b83d78ab}")
    15  )
    16  
    17  type iFileSaveDialog struct {
    18  	vtbl               *iFileSaveDialogVtbl
    19  	parentWindowHandle uintptr
    20  }
    21  
    22  type iFileSaveDialogVtbl struct {
    23  	iFileDialogVtbl
    24  
    25  	SetSaveAsItem          uintptr
    26  	SetProperties          uintptr
    27  	SetCollectedProperties uintptr
    28  	GetProperties          uintptr
    29  	ApplyProperties        uintptr
    30  }
    31  
    32  func newIFileSaveDialog() (*iFileSaveDialog, error) {
    33  	if unknown, err := ole.CreateInstance(saveFileDialogCLSID, saveFileDialogIID); err == nil {
    34  		return (*iFileSaveDialog)(unsafe.Pointer(unknown)), nil
    35  	} else {
    36  		return nil, err
    37  	}
    38  }
    39  
    40  func (fileSaveDialog *iFileSaveDialog) Show() error {
    41  	return fileSaveDialog.vtbl.show(unsafe.Pointer(fileSaveDialog), fileSaveDialog.parentWindowHandle)
    42  }
    43  
    44  func (fileSaveDialog *iFileSaveDialog) SetParentWindowHandle(hwnd uintptr) {
    45  	fileSaveDialog.parentWindowHandle = hwnd
    46  }
    47  
    48  func (fileSaveDialog *iFileSaveDialog) ShowAndGetResult() (string, error) {
    49  	if err := fileSaveDialog.Show(); err != nil {
    50  		return "", err
    51  	}
    52  	return fileSaveDialog.GetResult()
    53  }
    54  
    55  func (fileSaveDialog *iFileSaveDialog) SetTitle(title string) error {
    56  	return fileSaveDialog.vtbl.setTitle(unsafe.Pointer(fileSaveDialog), title)
    57  }
    58  
    59  func (fileSaveDialog *iFileSaveDialog) GetResult() (string, error) {
    60  	return fileSaveDialog.vtbl.getResultString(unsafe.Pointer(fileSaveDialog))
    61  }
    62  
    63  func (fileSaveDialog *iFileSaveDialog) Release() error {
    64  	return fileSaveDialog.vtbl.release(unsafe.Pointer(fileSaveDialog))
    65  }
    66  
    67  func (fileSaveDialog *iFileSaveDialog) SetDefaultFolder(defaultFolderPath string) error {
    68  	return fileSaveDialog.vtbl.setDefaultFolder(unsafe.Pointer(fileSaveDialog), defaultFolderPath)
    69  }
    70  
    71  func (fileSaveDialog *iFileSaveDialog) SetFolder(defaultFolderPath string) error {
    72  	return fileSaveDialog.vtbl.setFolder(unsafe.Pointer(fileSaveDialog), defaultFolderPath)
    73  }
    74  
    75  func (fileSaveDialog *iFileSaveDialog) SetFileFilters(filter []FileFilter) error {
    76  	return fileSaveDialog.vtbl.setFileTypes(unsafe.Pointer(fileSaveDialog), filter)
    77  }
    78  
    79  func (fileSaveDialog *iFileSaveDialog) SetRole(role string) error {
    80  	return fileSaveDialog.vtbl.setClientGuid(unsafe.Pointer(fileSaveDialog), util.StringToUUID(role))
    81  }
    82  
    83  func (fileSaveDialog *iFileSaveDialog) SetDefaultExtension(defaultExtension string) error {
    84  	return fileSaveDialog.vtbl.setDefaultExtension(unsafe.Pointer(fileSaveDialog), defaultExtension)
    85  }
    86  
    87  func (fileSaveDialog *iFileSaveDialog) SetFileName(initialFileName string) error {
    88  	return fileSaveDialog.vtbl.setFileName(unsafe.Pointer(fileSaveDialog), initialFileName)
    89  }
    90  
    91  func (fileSaveDialog *iFileSaveDialog) SetSelectedFileFilterIndex(index uint) error {
    92  	return fileSaveDialog.vtbl.setSelectedFileFilterIndex(unsafe.Pointer(fileSaveDialog), index)
    93  }