Dialog Pesan
Dialog info, peringatan, dan error.
Wails menyediakan dialog file native dengan tampilan sesuai platform untuk membuka file, menyimpan file, dan memilih folder. API sederhana dengan filter tipe file, dukungan pemilihan ganda, dan lokasi default.
Dialog file diakses melalui manager app.Dialog:
app.Dialog.OpenFile()app.Dialog.SaveFile()Pilih file untuk dibuka:
path, err := app.Dialog.OpenFile(). SetTitle("Select Image"). AddFilter("Images", "*.png;*.jpg;*.gif"). AddFilter("All Files", "*.*"). PromptForSingleSelection()
if err != nil || path == "" { return}
openFile(path)Kasus penggunaan:
path, err := app.Dialog.OpenFile(). SetTitle("Open Document"). AddFilter("Text Files", "*.txt"). AddFilter("All Files", "*.*"). PromptForSingleSelection()
if err != nil || path == "" { // User cancelled or error occurred return}
// Use selected filedata, _ := os.ReadFile(path)paths, err := app.Dialog.OpenFile(). SetTitle("Select Images"). AddFilter("Images", "*.png;*.jpg;*.jpeg;*.gif"). PromptForMultipleSelection()
if err != nil { return}
// Process all selected filesfor _, path := range paths { processFile(path)}path, err := app.Dialog.OpenFile(). SetTitle("Open File"). SetDirectory("/Users/me/Documents"). PromptForSingleSelection()Pilih lokasi penyimpanan:
path, err := app.Dialog.SaveFile(). SetFilename("document.txt"). AddFilter("Text Files", "*.txt"). AddFilter("All Files", "*.*"). PromptForSingleSelection()
if err != nil || path == "" { return}
saveFile(path, data)Kasus penggunaan:
path, err := app.Dialog.SaveFile(). SetFilename("export.csv"). AddFilter("CSV Files", "*.csv"). PromptForSingleSelection()path, err := app.Dialog.SaveFile(). SetDirectory("/Users/me/Documents"). SetFilename("untitled.txt"). PromptForSingleSelection()path, err := app.Dialog.SaveFile(). SetFilename("document.txt"). PromptForSingleSelection()
if err != nil || path == "" { return}
// Check if file existsif _, err := os.Stat(path); err == nil { dialog := app.Dialog.Question(). SetTitle("Confirm Overwrite"). SetMessage("File already exists. Overwrite?")
overwriteBtn := dialog.AddButton("Overwrite") overwriteBtn.OnClick(func() { saveFile(path, data) })
cancelBtn := dialog.AddButton("Cancel") dialog.SetDefaultButton(cancelBtn) dialog.SetCancelButton(cancelBtn) dialog.Show() return}
saveFile(path, data)Pilih direktori menggunakan dialog buka file dengan pemilihan direktori diaktifkan:
path, err := app.Dialog.OpenFile(). SetTitle("Select Output Folder"). CanChooseDirectories(true). CanChooseFiles(false). PromptForSingleSelection()
if err != nil || path == "" { return}
exportToFolder(path)Kasus penggunaan:
path, err := app.Dialog.OpenFile(). SetTitle("Select Folder"). SetDirectory("/Users/me/Documents"). CanChooseDirectories(true). CanChooseFiles(false). PromptForSingleSelection()Gunakan metode AddFilter() untuk menambahkan filter tipe file ke dialog. Setiap panggilan menambahkan opsi filter baru.
path, _ := app.Dialog.OpenFile(). AddFilter("Text Files", "*.txt"). AddFilter("All Files", "*.*"). PromptForSingleSelection()Gunakan titik koma untuk menentukan beberapa ekstensi dalam satu filter:
dialog := app.Dialog.OpenFile(). AddFilter("Images", "*.png;*.jpg;*.jpeg;*.gif;*.bmp"). AddFilter("Documents", "*.txt;*.doc;*.docx;*.pdf"). AddFilter("All Files", "*.*")Gunakan titik koma untuk memisahkan beberapa ekstensi dalam satu filter:
// Multiple extensions separated by semicolonsAddFilter("Images", "*.png;*.jpg;*.gif")func openImage(app *application.App) (image.Image, error) { path, err := app.Dialog.OpenFile(). SetTitle("Select Image"). AddFilter("Images", "*.png;*.jpg;*.jpeg;*.gif;*.bmp"). PromptForSingleSelection()
if err != nil { return nil, err }
if path == "" { return nil, errors.New("no file selected") }
// Open and decode image file, err := os.Open(path) if err != nil { app.Dialog.Error(). SetTitle("Open Failed"). SetMessage(err.Error()). Show() return nil, err } defer file.Close()
img, _, err := image.Decode(file) if err != nil { app.Dialog.Error(). SetTitle("Invalid Image"). SetMessage("Could not decode image file."). Show() return nil, err }
return img, nil}func saveDocument(app *application.App, content string) { path, err := app.Dialog.SaveFile(). SetFilename("document.txt"). AddFilter("Text Files", "*.txt"). AddFilter("Markdown Files", "*.md"). AddFilter("All Files", "*.*"). PromptForSingleSelection()
if err != nil || path == "" { return }
// Validate extension ext := filepath.Ext(path) if ext != ".txt" && ext != ".md" { dialog := app.Dialog.Question(). SetTitle("Confirm Extension"). SetMessage(fmt.Sprintf("Save as %s file?", ext))
saveBtn := dialog.AddButton("Save") saveBtn.OnClick(func() { doSave(app, path, content) })
cancelBtn := dialog.AddButton("Cancel") dialog.SetDefaultButton(cancelBtn) dialog.SetCancelButton(cancelBtn) dialog.Show() return }
doSave(app, path, content)}
func doSave(app *application.App, path, content string) { if err := os.WriteFile(path, []byte(content), 0644); err != nil { app.Dialog.Error(). SetTitle("Save Failed"). SetMessage(err.Error()). Show() return }
app.Dialog.Info(). SetTitle("Saved"). SetMessage("Document saved successfully!"). Show()}func processMultipleFiles(app *application.App) { paths, err := app.Dialog.OpenFile(). SetTitle("Select Files to Process"). AddFilter("Images", "*.png;*.jpg"). PromptForMultipleSelection()
if err != nil || len(paths) == 0 { return }
// Confirm processing dialog := app.Dialog.Question(). SetTitle("Confirm Processing"). SetMessage(fmt.Sprintf("Process %d file(s)?", len(paths)))
processBtn := dialog.AddButton("Process") processBtn.OnClick(func() { // Process files var errs []error for i, path := range paths { if err := processFile(path); err != nil { errs = append(errs, err) }
// Update progress // app.Event.Emit("progress", map[string]interface{}{ // "current": i + 1, // "total": len(paths), // }) _ = i // suppress unused variable warning in example }
// Show results if len(errs) > 0 { app.Dialog.Warning(). SetTitle("Processing Complete"). SetMessage(fmt.Sprintf("Processed %d files with %d errors.", len(paths), len(errs))). Show() } else { app.Dialog.Info(). SetTitle("Success"). SetMessage(fmt.Sprintf("Processed %d files successfully!", len(paths))). Show() } })
cancelBtn := dialog.AddButton("Cancel") dialog.SetCancelButton(cancelBtn) dialog.Show()}func exportData(app *application.App, data []byte) { // Select output folder folder, err := app.Dialog.OpenFile(). SetTitle("Select Export Folder"). SetDirectory(getDefaultExportFolder()). CanChooseDirectories(true). CanChooseFiles(false). PromptForSingleSelection()
if err != nil || folder == "" { return }
// Generate filename filename := fmt.Sprintf("export_%s.csv", time.Now().Format("2006-01-02_15-04-05")) path := filepath.Join(folder, filename)
// Save file if err := os.WriteFile(path, data, 0644); err != nil { app.Dialog.Error(). SetTitle("Export Failed"). SetMessage(err.Error()). Show() return }
// Show success with option to open folder dialog := app.Dialog.Question(). SetTitle("Export Complete"). SetMessage(fmt.Sprintf("Exported to %s", filename))
openBtn := dialog.AddButton("Open Folder") openBtn.OnClick(func() { openFolder(folder) })
dialog.AddButton("OK") dialog.Show()}func importConfiguration(app *application.App) { path, err := app.Dialog.OpenFile(). SetTitle("Import Configuration"). AddFilter("JSON Files", "*.json"). AddFilter("YAML Files", "*.yaml;*.yml"). PromptForSingleSelection()
if err != nil || path == "" { return }
// Read file data, err := os.ReadFile(path) if err != nil { app.Dialog.Error(). SetTitle("Read Failed"). SetMessage(err.Error()). Show() return }
// Validate configuration config, err := parseConfig(data) if err != nil { app.Dialog.Error(). SetTitle("Invalid Configuration"). SetMessage("File is not a valid configuration."). Show() return }
// Confirm import dialog := app.Dialog.Question(). SetTitle("Confirm Import"). SetMessage("Import this configuration?")
importBtn := dialog.AddButton("Import") importBtn.OnClick(func() { // Apply configuration if err := applyConfig(config); err != nil { app.Dialog.Error(). SetTitle("Import Failed"). SetMessage(err.Error()). Show() return }
app.Dialog.Info(). SetTitle("Success"). SetMessage("Configuration imported successfully!"). Show() })
cancelBtn := dialog.AddButton("Cancel") dialog.SetCancelButton(cancelBtn) dialog.Show()}Dialog Pesan
Dialog info, peringatan, dan error.
Dialog Kustom
Buat window dialog kustom.
Binding
Panggil fungsi Go dari JavaScript.
Event
Gunakan event untuk pembaruan progress.
Pertanyaan? Tanyakan di Discord atau lihat contoh dialog file.