mirror of
https://github.com/wailsapp/wails.git
synced 2026-03-14 14:45:49 +01:00
* All the documentation files have been updated. Here's a summary of the changes I made:
## Summary of Documentation Updates
### Key API Corrections Made:
1. **Dialog Creation**:
- Changed `app.InfoDialog()` → `application.InfoDialog()` (package-level functions)
- Also documented `app.Dialog.Info()` via DialogManager
2. **Question Dialog Buttons**:
- Removed non-existent `SetButtons("Save", "Don't Save", "Cancel")` method
- Now uses `AddButton("label")` which returns a `*Button`
- Button callbacks via `button.OnClick(func() { ... })`
3. **Default/Cancel Buttons**:
- Changed `SetDefaultButton("Cancel")` (string) → `SetDefaultButton(cancelBtn)` (`*Button`)
- Changed `SetCancelButton("Cancel")` (string) → `SetCancelButton(cancelBtn)` (`*Button`)
- Also documented fluent `SetAsDefault()` and `SetAsCancel()` methods on Button
4. **File Dialog Filters**:
- Changed `SetFilters([]application.FileFilter{...})` → `AddFilter("Display Name", "*.ext;*.ext2")`
5. **Save Dialog Filename**:
- Changed `SetDefaultFilename()` → `SetFilename()`
6. **Folder Selection**:
- Removed non-existent `app.SelectFolderDialog()`
- Now uses `application.OpenFileDialog().CanChooseDirectories(true).CanChooseFiles(false)`
7. **Show() Return Value**:
- Removed incorrect `result, err := dialog.Show()` pattern
- `Show()` returns nothing - responses are handled via button callbacks
### Files Modified:
- `docs/src/content/docs/features/dialogs/message.mdx` - Complete rewrite of question dialog examples
- `docs/src/content/docs/features/dialogs/overview.mdx` - Updated all code examples
- `docs/src/content/docs/features/dialogs/file.mdx` - Updated file dialog examples
- `v3/UNRELEASED_CHANGELOG.md` - Added changelog entry
* All changes are complete. Here's a summary of what was updated:
## Summary
I've updated the Wails v3 dialogs documentation to match the actual API. The documentation now consistently uses:
### DialogManager Pattern (Recommended)
- `app.Dialog.Info()`, `app.Dialog.Question()`, `app.Dialog.Warning()`, `app.Dialog.Error()`
- `app.Dialog.OpenFile()`, `app.Dialog.SaveFile()`
This is consistent with other runtime features like `app.Window`, `app.Event`, etc.
### Key API Corrections
1. **Dialog Creation**: Both `app.Dialog.*()` (DialogManager) and `application.*Dialog()` (package-level) are documented
2. **Question Dialog Buttons**: Use `AddButton("label")` which returns `*Button`, then `button.OnClick(callback)`
3. **Default/Cancel Buttons**: `SetDefaultButton(button)` and `SetCancelButton(button)` take `*Button` pointers
4. **File Filters**: Use `AddFilter("Display Name", "*.ext")` instead of `SetFilters()`
5. **Save Dialog Filename**: Use `SetFilename()` instead of `SetDefaultFilename()`
6. **Folder Selection**: Use `app.Dialog.OpenFile().CanChooseDirectories(true).CanChooseFiles(false)`
### Files Modified
- `docs/src/content/docs/features/dialogs/overview.mdx`
- `docs/src/content/docs/features/dialogs/message.mdx`
- `docs/src/content/docs/features/dialogs/file.mdx`
- `v3/UNRELEASED_CHANGELOG.md`
* Audit complete! All documentation files now consistently use `app.Dialog.*` for all code examples. Here's the summary:
## Audit Complete
All dialog documentation has been updated to consistently use the `app.Dialog.*` pattern:
### Changes Made:
**message.mdx:**
- All examples now use `app.Dialog.Info()`, `app.Dialog.Question()`, `app.Dialog.Warning()`, `app.Dialog.Error()`
- Function signatures updated to accept `app *application.App` parameter
- Nested dialog calls within callbacks also updated
**file.mdx:**
- All examples now use `app.Dialog.OpenFile()`, `app.Dialog.SaveFile()`
- Function signatures updated to accept `app *application.App` parameter
- All error/info dialogs within file operations also updated
**overview.mdx:**
- Already consistent from earlier edits
### Documentation Structure:
Each file now properly documents both approaches in a dedicated section:
```go
// Via DialogManager (recommended when you have an app instance):
app.Dialog.Info()
app.Dialog.OpenFile()
// Package-level functions (useful in callbacks or when app isn't in scope):
application.InfoDialog()
application.OpenFileDialog()
```
But all code examples use the `app.Dialog.*` pattern for consistency with other runtime features like `app.Window`, `app.Event`, etc.
* docs: Fix reference/dialogs.mdx and reference/application.mdx API documentation
Updated docs to match actual Wails v3 Dialogs API:
- reference/dialogs.mdx: Complete rewrite with correct API
- Use `app.Dialog.OpenFile()` and `app.Dialog.SaveFile()` instead of `app.OpenFileDialog()`
- Use `AddFilter("name", "pattern")` instead of `SetFilters([]FileFilter{...})`
- Use `SetFilename()` instead of `SetDefaultFilename()`
- Use `SetDirectory()` instead of `SetDefaultDirectory()`
- Remove non-existent `SelectFolderDialog()` - use `OpenFile().CanChooseDirectories(true).CanChooseFiles(false)`
- Use `AddButton()` with callbacks instead of `SetButtons()`
- Use `SetDefaultButton(*Button)` instead of `SetDefaultButton(int)`
- Document that `Show()` returns nothing, use callbacks
- reference/application.mdx: Fix Dialog Methods section
- Use `app.Dialog.*` manager pattern
- Show correct Question dialog with button callbacks
- Fix file dialog examples with `AddFilter()`
- Remove `SelectFolderDialog()` reference
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* docs: Remove package-level dialog function references
Remove all references to package-level dialog functions
(application.InfoDialog(), application.OpenFileDialog(), etc.)
from documentation. Only the app.Dialog manager pattern
should be used.
Updated files:
- reference/dialogs.mdx
- features/dialogs/overview.mdx
- features/dialogs/message.mdx
- features/dialogs/file.mdx
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* refactor: Remove package-level dialog functions in favor of app.Dialog manager
BREAKING CHANGE: Remove package-level dialog functions. Use app.Dialog manager instead.
Removed functions:
- application.InfoDialog()
- application.QuestionDialog()
- application.WarningDialog()
- application.ErrorDialog()
- application.OpenFileDialog()
- application.SaveFileDialog()
Use the Dialog manager pattern instead:
- app.Dialog.Info()
- app.Dialog.Question()
- app.Dialog.Warning()
- app.Dialog.Error()
- app.Dialog.OpenFile()
- app.Dialog.SaveFile()
This aligns dialogs with other runtime managers like app.Window and app.Event.
Updated files:
- v3/pkg/application/application.go - Remove exported dialog functions
- v3/pkg/application/dialog_manager.go - Use internal newMessageDialog/newOpenFileDialog
- v3/pkg/application/messageprocessor_dialog.go - Use internal dialog constructors
- v3/examples/* - Update all examples to use app.Dialog pattern
- v3/internal/commands/appimage_testfiles/main.go - Update test file
- v3/UNRELEASED_CHANGELOG.md - Document breaking change
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix: Use application.Get() in dialogs-basic example and correct filter docs
- Update dialogs-basic helper functions to use application.Get() instead
of passing app through function parameters
- Fix incorrect documentation claiming space/comma delimiters work for
filter patterns (only semicolons are supported)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
257 lines
7 KiB
Go
257 lines
7 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"log/slog"
|
|
"os"
|
|
"path/filepath"
|
|
"runtime"
|
|
"strings"
|
|
|
|
"github.com/wailsapp/wails/v3/pkg/application"
|
|
)
|
|
|
|
func main() {
|
|
app := application.New(application.Options{
|
|
Name: "Dialog Test",
|
|
Description: "Test application for macOS dialogs",
|
|
Logger: application.DefaultLogger(slog.LevelDebug),
|
|
Mac: application.MacOptions{
|
|
ApplicationShouldTerminateAfterLastWindowClosed: true,
|
|
},
|
|
})
|
|
|
|
// Create main window
|
|
mainWindow := app.Window.NewWithOptions(application.WebviewWindowOptions{
|
|
Title: "Dialog Tests",
|
|
Width: 800,
|
|
Height: 600,
|
|
MinWidth: 800,
|
|
MinHeight: 600,
|
|
})
|
|
mainWindow.SetAlwaysOnTop(true)
|
|
|
|
// Create main menu
|
|
menu := app.NewMenu()
|
|
app.Menu.Set(menu)
|
|
menu.AddRole(application.AppMenu)
|
|
menu.AddRole(application.EditMenu)
|
|
menu.AddRole(application.WindowMenu)
|
|
|
|
// Add test menu
|
|
testMenu := menu.AddSubmenu("Tests")
|
|
|
|
// Test 1: Basic file open with no filters (no window)
|
|
testMenu.Add("1. Basic Open (No Window)").OnClick(func(ctx *application.Context) {
|
|
result, err := app.Dialog.OpenFile().
|
|
CanChooseFiles(true).
|
|
PromptForSingleSelection()
|
|
showResult("Basic Open", result, err, nil)
|
|
})
|
|
|
|
// Test 1b: Basic file open with window
|
|
testMenu.Add("1b. Basic Open (With Window)").OnClick(func(ctx *application.Context) {
|
|
result, err := app.Dialog.OpenFile().
|
|
CanChooseFiles(true).
|
|
AttachToWindow(mainWindow).
|
|
PromptForSingleSelection()
|
|
showResult("Basic Open", result, err, mainWindow)
|
|
})
|
|
|
|
// Test 2: Open with single extension filter
|
|
testMenu.Add("2. Single Filter").OnClick(func(ctx *application.Context) {
|
|
result, err := app.Dialog.OpenFile().
|
|
CanChooseFiles(true).
|
|
AddFilter("Text Files", "*.txt").
|
|
AttachToWindow(mainWindow).
|
|
PromptForSingleSelection()
|
|
showResult("Single Filter", result, err, mainWindow)
|
|
})
|
|
|
|
// Test 3: Open with multiple extension filter
|
|
testMenu.Add("3. Multiple Filter").OnClick(func(ctx *application.Context) {
|
|
result, err := app.Dialog.OpenFile().
|
|
CanChooseFiles(true).
|
|
AddFilter("Documents", "*.txt;*.md;*.doc;*.docx").
|
|
AttachToWindow(mainWindow).
|
|
PromptForSingleSelection()
|
|
showResult("Multiple Filter", result, err, mainWindow)
|
|
})
|
|
|
|
// Test 4: Multiple file selection
|
|
testMenu.Add("4. Multiple Selection").OnClick(func(ctx *application.Context) {
|
|
results, err := app.Dialog.OpenFile().
|
|
CanChooseFiles(true).
|
|
AddFilter("Images", "*.png;*.jpg;*.jpeg").
|
|
AttachToWindow(mainWindow).
|
|
PromptForMultipleSelection()
|
|
if err != nil {
|
|
showError("Multiple Selection", err, mainWindow)
|
|
return
|
|
}
|
|
showResults("Multiple Selection", results, mainWindow)
|
|
})
|
|
|
|
// Test 5: Directory selection
|
|
testMenu.Add("5. Directory Selection").OnClick(func(ctx *application.Context) {
|
|
result, err := app.Dialog.OpenFile().
|
|
CanChooseDirectories(true).
|
|
CanChooseFiles(false).
|
|
AttachToWindow(mainWindow).
|
|
PromptForSingleSelection()
|
|
showResult("Directory Selection", result, err, mainWindow)
|
|
})
|
|
|
|
// Test 6: Save dialog with extension
|
|
testMenu.Add("6. Save Dialog").OnClick(func(ctx *application.Context) {
|
|
result, err := app.Dialog.SaveFile().
|
|
SetFilename("test.txt").
|
|
AddFilter("Text Files", "*.txt").
|
|
AttachToWindow(mainWindow).
|
|
PromptForSingleSelection()
|
|
showResult("Save Dialog", result, err, mainWindow)
|
|
})
|
|
|
|
// Test 7: Complex filters
|
|
testMenu.Add("7. Complex Filters").OnClick(func(ctx *application.Context) {
|
|
result, err := app.Dialog.OpenFile().
|
|
CanChooseFiles(true).
|
|
AddFilter("All Documents", "*.txt;*.md;*.doc;*.docx;*.pdf").
|
|
AddFilter("Text Files", "*.txt").
|
|
AddFilter("Markdown", "*.md").
|
|
AddFilter("Word Documents", "*.doc;*.docx").
|
|
AddFilter("PDF Files", "*.pdf").
|
|
AttachToWindow(mainWindow).
|
|
PromptForSingleSelection()
|
|
showResult("Complex Filters", result, err, mainWindow)
|
|
})
|
|
|
|
// Test 8: Hidden files
|
|
testMenu.Add("8. Show Hidden").OnClick(func(ctx *application.Context) {
|
|
result, err := app.Dialog.OpenFile().
|
|
CanChooseFiles(true).
|
|
ShowHiddenFiles(true).
|
|
AttachToWindow(mainWindow).
|
|
PromptForSingleSelection()
|
|
showResult("Show Hidden", result, err, mainWindow)
|
|
})
|
|
|
|
// Test 9: Default directory
|
|
testMenu.Add("9. Default Directory").OnClick(func(ctx *application.Context) {
|
|
home, _ := os.UserHomeDir()
|
|
result, err := app.Dialog.OpenFile().
|
|
CanChooseFiles(true).
|
|
SetDirectory(home).
|
|
AttachToWindow(mainWindow).
|
|
PromptForSingleSelection()
|
|
showResult("Default Directory", result, err, mainWindow)
|
|
})
|
|
|
|
// Test 10: Full featured dialog
|
|
testMenu.Add("10. Full Featured").OnClick(func(ctx *application.Context) {
|
|
home, _ := os.UserHomeDir()
|
|
dialog := app.Dialog.OpenFile().
|
|
SetTitle("Full Featured Dialog").
|
|
SetDirectory(home).
|
|
CanChooseFiles(true).
|
|
CanCreateDirectories(true).
|
|
ShowHiddenFiles(true).
|
|
ResolvesAliases(true).
|
|
AllowsOtherFileTypes(true).
|
|
AttachToWindow(mainWindow)
|
|
|
|
if runtime.GOOS == "darwin" {
|
|
dialog.SetMessage("Please select files")
|
|
}
|
|
|
|
dialog.AddFilter("All Supported", "*.txt;*.md;*.pdf;*.png;*.jpg")
|
|
dialog.AddFilter("Documents", "*.txt;*.md;*.pdf")
|
|
dialog.AddFilter("Images", "*.png;*.jpg;*.jpeg")
|
|
|
|
results, err := dialog.PromptForMultipleSelection()
|
|
if err != nil {
|
|
showError("Full Featured", err, mainWindow)
|
|
return
|
|
}
|
|
showResults("Full Featured", results, mainWindow)
|
|
})
|
|
|
|
// Show the window
|
|
mainWindow.Show()
|
|
|
|
// Run the app
|
|
if err := app.Run(); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func showResult(test string, result string, err error, window *application.WebviewWindow) {
|
|
if err != nil {
|
|
showError(test, err, window)
|
|
return
|
|
}
|
|
if result == "" {
|
|
dialog := application.Get().Dialog.Info().
|
|
SetTitle(test).
|
|
SetMessage("No file selected")
|
|
if window != nil {
|
|
dialog.AttachToWindow(window)
|
|
}
|
|
dialog.Show()
|
|
return
|
|
}
|
|
dialog := application.Get().Dialog.Info().
|
|
SetTitle(test).
|
|
SetMessage(fmt.Sprintf("Selected: %s\nType: %s", result, getFileType(result)))
|
|
if window != nil {
|
|
dialog.AttachToWindow(window)
|
|
}
|
|
dialog.Show()
|
|
}
|
|
|
|
func showResults(test string, results []string, window *application.WebviewWindow) {
|
|
if len(results) == 0 {
|
|
dialog := application.Get().Dialog.Info().
|
|
SetTitle(test).
|
|
SetMessage("No files selected")
|
|
if window != nil {
|
|
dialog.AttachToWindow(window)
|
|
}
|
|
dialog.Show()
|
|
return
|
|
}
|
|
var message strings.Builder
|
|
message.WriteString(fmt.Sprintf("Selected %d files:\n\n", len(results)))
|
|
for _, result := range results {
|
|
message.WriteString(fmt.Sprintf("%s (%s)\n", result, getFileType(result)))
|
|
}
|
|
dialog := application.Get().Dialog.Info().
|
|
SetTitle(test).
|
|
SetMessage(message.String())
|
|
if window != nil {
|
|
dialog.AttachToWindow(window)
|
|
}
|
|
dialog.Show()
|
|
}
|
|
|
|
func showError(test string, err error, window *application.WebviewWindow) {
|
|
dialog := application.Get().Dialog.Error().
|
|
SetTitle(test).
|
|
SetMessage(fmt.Sprintf("Error: %v", err))
|
|
if window != nil {
|
|
dialog.AttachToWindow(window)
|
|
}
|
|
dialog.Show()
|
|
}
|
|
|
|
func getFileType(path string) string {
|
|
if path == "" {
|
|
return "unknown"
|
|
}
|
|
ext := filepath.Ext(path)
|
|
if ext == "" {
|
|
return "no extension"
|
|
}
|
|
return ext
|
|
}
|