Boîtes de dialogue de message
Afficher des informations, des avertissements, des erreurs et des questions
Boîtes de dialogue de message
Wails fournit des boîtes de dialogue de message natives à l’apparence adaptée à chaque plateforme : boîtes de dialogue d’information, d’avertissement, d’erreur et de question, avec des titres, des messages et des boutons personnalisables. API simple, comportement natif et accessibilité par défaut.
Créer des boîtes de dialogue
Les boîtes de dialogue de message sont accessibles par l’intermédiaire du gestionnaire app.Dialog :
app.Dialog.Info()
app.Dialog.Question()
app.Dialog.Warning()
app.Dialog.Error()Toutes les méthodes renvoient un objet *MessageDialog qui peut être configuré par chaînage de méthodes.
Boîte de dialogue d’information
Affichez des messages d’information :
app.Dialog.Info().
SetTitle("Success").
SetMessage("File saved successfully!").
Show()Cas d’utilisation :
- Confirmations de réussite
- Notifications d’achèvement
- Messages d’information
- Mises à jour d’état
Exemple — Confirmation d’enregistrement :
func saveFile(app *application.App, path string, data []byte) error {
if err := os.WriteFile(path, data, 0644); err != nil {
return err
}
app.Dialog.Info().
SetTitle("File Saved").
SetMessage(fmt.Sprintf("Saved to %s", filepath.Base(path))).
Show()
return nil
}Boîte de dialogue d’avertissement
Affichez des avertissements :
app.Dialog.Warning().
SetTitle("Warning").
SetMessage("This action cannot be undone.").
Show()Cas d’utilisation :
- Avertissements non critiques
- Avis d’obsolescence
- Messages de mise en garde
- Problèmes potentiels
Exemple — Avertissement relatif à l’espace disque :
func checkDiskSpace(app *application.App) {
available := getDiskSpace()
if available < 100*1024*1024 { // Less than 100MB
app.Dialog.Warning().
SetTitle("Low Disk Space").
SetMessage(fmt.Sprintf("Only %d MB available.", available/(1024*1024))).
Show()
}
}Boîte de dialogue d’erreur
Affichez des erreurs :
app.Dialog.Error().
SetTitle("Error").
SetMessage("Failed to connect to server.").
Show()Cas d’utilisation :
- Messages d’erreur
- Notifications d’échec
- Gestion des exceptions
- Problèmes critiques
Exemple — Erreur réseau :
func fetchData(app *application.App, url string) ([]byte, error) {
resp, err := http.Get(url)
if err != nil {
app.Dialog.Error().
SetTitle("Network Error").
SetMessage(fmt.Sprintf("Failed to connect: %v", err)).
Show()
return nil, err
}
defer resp.Body.Close()
return io.ReadAll(resp.Body)
}Boîte de dialogue de question
Posez des questions aux utilisateurs et traitez leurs réponses à l’aide de fonctions de rappel associées aux boutons :
dialog := app.Dialog.Question().
SetTitle("Confirm").
SetMessage("Save changes before closing?")
save := dialog.AddButton("Save")
save.OnClick(func() {
saveChanges()
})
dontSave := dialog.AddButton("Don't Save")
dontSave.OnClick(func() {
// Continue without saving
})
cancel := dialog.AddButton("Cancel")
cancel.OnClick(func() {
// Don't close
})
dialog.SetDefaultButton(save)
dialog.SetCancelButton(cancel)
dialog.Show()Cas d’utilisation :
- Confirmation d’actions
- Questions Oui/Non
- Choix multiple
- Décisions de l’utilisateur
Exemple — Modifications non enregistrées :
func closeDocument(app *application.App) {
if !hasUnsavedChanges() {
doClose()
return
}
dialog := app.Dialog.Question().
SetTitle("Unsaved Changes").
SetMessage("Do you want to save your changes?")
save := dialog.AddButton("Save")
save.OnClick(func() {
if saveDocument() {
doClose()
}
})
dontSave := dialog.AddButton("Don't Save")
dontSave.OnClick(func() {
doClose()
})
cancel := dialog.AddButton("Cancel")
// Cancel button has no callback - just closes the dialog
dialog.SetDefaultButton(save)
dialog.SetCancelButton(cancel)
dialog.Show()
}Options de la boîte de dialogue
Titre et message
dialog := app.Dialog.Info().
SetTitle("Operation Complete").
SetMessage("All files have been processed successfully.")Bonnes pratiques :
- Titre : court et descriptif (2-5 mots)
- Message : clair, précis et exploitable
- Évitez le jargon : employez un langage simple
Boutons
Bouton unique (information/avertissement/erreur) :
Les boîtes de dialogue d’information, d’avertissement et d’erreur affichent par défaut un bouton « OK » :
app.Dialog.Info().
SetMessage("Done!").
Show()Vous pouvez également ajouter des boutons personnalisés :
dialog := app.Dialog.Info().
SetMessage("Done!")
ok := dialog.AddButton("Got it!")
dialog.SetDefaultButton(ok)
dialog.Show()Plusieurs boutons (question) :
Utilisez AddButton() pour ajouter des boutons. Cette méthode renvoie un objet *Button que vous pouvez configurer :
dialog := app.Dialog.Question().
SetMessage("Choose an action")
option1 := dialog.AddButton("Option 1")
option1.OnClick(func() {
handleOption1()
})
option2 := dialog.AddButton("Option 2")
option2.OnClick(func() {
handleOption2()
})
option3 := dialog.AddButton("Option 3")
option3.OnClick(func() {
handleOption3()
})
dialog.Show()Boutons par défaut et d’annulation :
Utilisez SetDefaultButton() pour indiquer le bouton mis en évidence et activé par Entrée. Utilisez SetCancelButton() pour indiquer le bouton activé par Échap.
dialog := app.Dialog.Question().
SetMessage("Delete file?")
deleteBtn := dialog.AddButton("Delete")
deleteBtn.OnClick(func() {
performDelete()
})
cancelBtn := dialog.AddButton("Cancel")
// No callback needed - just dismisses dialog
dialog.SetDefaultButton(cancelBtn) // Safe option as default
dialog.SetCancelButton(cancelBtn) // Escape triggers Cancel
dialog.Show()Vous pouvez également utiliser les méthodes fluides SetAsDefault() et SetAsCancel() sur les boutons :
dialog := app.Dialog.Question().
SetMessage("Delete file?")
dialog.AddButton("Delete").OnClick(func() {
performDelete()
})
dialog.AddButton("Cancel").SetAsDefault().SetAsCancel()
dialog.Show()Bonnes pratiques :
- 1-3 boutons : ne submergez pas les utilisateurs
- Libellés explicites : « Enregistrer » plutôt que « OK »
- Choix par défaut sûr : une action non destructive
- L’ordre est important : placez l’action la plus probable en premier (sauf Annuler)
Icône personnalisée
Définissez une icône personnalisée pour la boîte de dialogue :
app.Dialog.Info().
SetTitle("Custom Icon Example").
SetMessage("Using a custom icon").
SetIcon(myIconBytes).
Show()Association à une fenêtre
Associez la boîte de dialogue à une fenêtre précise :
dialog := app.Dialog.Question().
SetMessage("Window-specific question").
AttachToWindow(window)
dialog.AddButton("OK")
dialog.Show()Avantages :
- La boîte de dialogue apparaît dans la fenêtre appropriée
- La fenêtre parente est désactivée tant que la boîte de dialogue est affichée
- Meilleure expérience utilisateur avec plusieurs fenêtres
Exemples complets
Confirmer une action destructive
func deleteFiles(app *application.App, paths []string) {
// Confirm deletion
message := fmt.Sprintf("Delete %d file(s)?", len(paths))
if len(paths) == 1 {
message = fmt.Sprintf("Delete %s?", filepath.Base(paths[0]))
}
dialog := app.Dialog.Question().
SetTitle("Confirm Delete").
SetMessage(message)
deleteBtn := dialog.AddButton("Delete")
deleteBtn.OnClick(func() {
// Perform deletion
var errs []error
for _, path := range paths {
if err := os.Remove(path); err != nil {
errs = append(errs, err)
}
}
// Show result
if len(errs) > 0 {
app.Dialog.Error().
SetTitle("Delete Failed").
SetMessage(fmt.Sprintf("Failed to delete %d file(s)", len(errs))).
Show()
} else {
app.Dialog.Info().
SetTitle("Delete Complete").
SetMessage(fmt.Sprintf("Deleted %d file(s)", len(paths))).
Show()
}
})
cancelBtn := dialog.AddButton("Cancel")
dialog.SetDefaultButton(cancelBtn)
dialog.SetCancelButton(cancelBtn)
dialog.Show()
}Confirmation avant de quitter
func confirmQuit(app *application.App) {
dialog := app.Dialog.Question().
SetTitle("Quit").
SetMessage("You have unsaved work. Are you sure you want to quit?")
yes := dialog.AddButton("Yes")
yes.OnClick(func() {
app.Quit()
})
no := dialog.AddButton("No")
dialog.SetDefaultButton(no)
dialog.Show()
}Boîte de dialogue de mise à jour avec option de téléchargement
func showUpdateDialog(app *application.App) {
dialog := app.Dialog.Question().
SetTitle("Update").
SetMessage("A new version is available. The cancel button is selected when pressing escape.")
download := dialog.AddButton("📥 Download")
download.OnClick(func() {
app.Dialog.Info().SetMessage("Downloading...").Show()
})
cancel := dialog.AddButton("Cancel")
dialog.SetDefaultButton(download)
dialog.SetCancelButton(cancel)
dialog.Show()
}Question avec une icône personnalisée
func showCustomIconQuestion(app *application.App, iconBytes []byte) {
dialog := app.Dialog.Question().
SetTitle("Custom Icon Example").
SetMessage("Using a custom icon").
SetIcon(iconBytes)
likeIt := dialog.AddButton("I like it!")
likeIt.OnClick(func() {
app.Dialog.Info().SetMessage("Thanks!").Show()
})
notKeen := dialog.AddButton("Not so keen...")
notKeen.OnClick(func() {
app.Dialog.Info().SetMessage("Too bad!").Show()
})
dialog.SetDefaultButton(likeIt)
dialog.Show()
}Bonnes pratiques
✅ À faire
- Soyez précis — « Fichier enregistré dans Documents » plutôt que « Réussite »
- Utilisez le type approprié — Error pour les erreurs, Warning pour les avertissements
- Fournissez le contexte — Incluez les détails pertinents
- Utilisez des libellés de boutons explicites — « Supprimer » plutôt que « OK »
- Définissez des choix par défaut sûrs — Choisissez une action non destructive
- Gérez l’annulation — L’utilisateur peut fermer la boîte de dialogue
❌ À éviter
- N’en abusez pas — Cela interrompt le flux de travail
- Ne les utilisez pas pour les mises à jour fréquentes — Utilisez plutôt des notifications
- N’utilisez pas de messages génériques — « Erreur » n’apporte aucune information
- N’ignorez pas les erreurs — Gérez les erreurs de dialog.Show()
- Ne bloquez pas inutilement — Envisagez des solutions asynchrones
- N’utilisez pas de jargon technique — Employez un langage clair
Différences entre les plateformes
macOS
- Présentation sous forme de feuille lorsque la boîte de dialogue est attachée à une fenêtre
- Raccourcis clavier standard (⌘. pour annuler)
- Adopte automatiquement le thème du système
- Fonctions d’accessibilité intégrées
Windows
- Boîtes de dialogue modales
- Apparence de TaskDialog
- Touche Échap pour annuler
- Adopte le thème du système
Linux
- Boîtes de dialogue GTK
- Varie selon l’environnement de bureau
- Adopte le thème de l’environnement de bureau
- Navigation standard au clavier
Étapes suivantes
Ouverture, enregistrement et sélection de dossiers.
Créez des fenêtres de dialogue personnalisées.
Notifications non intrusives.
Utilisez des événements pour une communication non bloquante.
Des questions ? Posez-les sur Discord ou consultez les exemples de boîtes de dialogue.