API des boîtes de dialogue
Référence complète des API de boîtes de dialogue natives
Vue d’ensemble
L’API Dialogs fournit des méthodes permettant d’afficher des boîtes de dialogue natives de sélection de fichiers et de message. Accédez aux boîtes de dialogue via le gestionnaire app.Dialog.
Types de boîtes de dialogue :
- Boîtes de dialogue de fichiers — boîtes de dialogue d’ouverture et d’enregistrement
- Boîtes de dialogue de message — boîtes de dialogue d’information, d’erreur, d’avertissement et de question
Toutes les boîtes de dialogue sont des boîtes de dialogue natives du système d’exploitation qui respectent l’apparence et le comportement de la plateforme.
Accès aux boîtes de dialogue
Accédez aux boîtes de dialogue via le gestionnaire app.Dialog :
app.Dialog.OpenFile()
app.Dialog.SaveFile()
app.Dialog.Info()
app.Dialog.Question()
app.Dialog.Warning()
app.Dialog.Error()Boîtes de dialogue de fichiers
OpenFile()
Crée une boîte de dialogue d’ouverture de fichier.
func (dm *DialogManager) OpenFile() *OpenFileDialogStructExemple :
dialog := app.Dialog.OpenFile()Méthodes de OpenFileDialogStruct
SetTitle()
Définit le titre de la boîte de dialogue.
func (d *OpenFileDialogStruct) SetTitle(title string) *OpenFileDialogStructExemple :
dialog.SetTitle("Select Image")AddFilter()
Ajoute un filtre de type de fichier.
func (d *OpenFileDialogStruct) AddFilter(displayName, pattern string) *OpenFileDialogStructParamètres :
displayName— Description du filtre affichée à l’utilisateur (par exemple, « Images » ou « Documents »)pattern— Liste d’extensions séparées par des points-virgules (par exemple, « .png;.jpg »)
Exemple :
dialog.AddFilter("Images", "*.png;*.jpg;*.gif").
AddFilter("Documents", "*.pdf;*.docx").
AddFilter("All Files", "*.*")SetDirectory()
Définit le répertoire initial.
func (d *OpenFileDialogStruct) SetDirectory(directory string) *OpenFileDialogStructExemple :
homeDir, _ := os.UserHomeDir()
dialog.SetDirectory(homeDir)CanChooseDirectories()
Active ou désactive la sélection de répertoires.
func (d *OpenFileDialogStruct) CanChooseDirectories(canChooseDirectories bool) *OpenFileDialogStructExemple (sélection d’un dossier) :
// Select folders instead of files
path, err := app.Dialog.OpenFile().
SetTitle("Select Folder").
CanChooseDirectories(true).
CanChooseFiles(false).
PromptForSingleSelection()CanChooseFiles()
Active ou désactive la sélection de fichiers.
func (d *OpenFileDialogStruct) CanChooseFiles(canChooseFiles bool) *OpenFileDialogStructCanCreateDirectories()
Active ou désactive la création de répertoires.
func (d *OpenFileDialogStruct) CanCreateDirectories(canCreateDirectories bool) *OpenFileDialogStructShowHiddenFiles()
Affiche ou masque les fichiers cachés.
func (d *OpenFileDialogStruct) ShowHiddenFiles(showHiddenFiles bool) *OpenFileDialogStructAttachToWindow()
Associe la boîte de dialogue à une fenêtre précise.
func (d *OpenFileDialogStruct) AttachToWindow(window Window) *OpenFileDialogStructPromptForSingleSelection()
Affiche la boîte de dialogue et renvoie le fichier sélectionné.
func (d *OpenFileDialogStruct) PromptForSingleSelection() (string, error)Valeurs renvoyées :
string— Chemin du fichier sélectionné. Considérez une chaîne vide comme une absence de sélection (selon le système d’exploitation, les implémentations propres à la plateforme peuvent renvoyer soit une chaîne vide, soit une erreur non nulle en cas d’annulation).error— Valeur non nulle si la boîte de dialogue elle-même n’a pas pu être affichée.
Exemple :
path, err := app.Dialog.OpenFile().
SetTitle("Select Image").
AddFilter("Images", "*.png;*.jpg;*.gif").
PromptForSingleSelection()
if err != nil {
// The dialog failed to present (rare).
return
}
if path == "" {
// User cancelled.
return
}
// Use the selected file
processFile(path)PromptForMultipleSelection()
Affiche la boîte de dialogue et renvoie les fichiers sélectionnés.
func (d *OpenFileDialogStruct) PromptForMultipleSelection() ([]string, error)Valeurs renvoyées :
[]string— Tableau des chemins des fichiers sélectionnéserror— Erreur si l’affichage de la boîte de dialogue a échoué
Exemple :
paths, err := app.Dialog.OpenFile().
SetTitle("Select Images").
AddFilter("Images", "*.png;*.jpg").
PromptForMultipleSelection()
if err != nil {
return
}
for _, path := range paths {
processFile(path)
}SaveFile()
Crée une boîte de dialogue d’enregistrement de fichier.
func (dm *DialogManager) SaveFile() *SaveFileDialogStructExemple :
dialog := app.Dialog.SaveFile()Méthodes de SaveFileDialogStruct
SetTitle()
Définit le titre de la boîte de dialogue.
func (d *SaveFileDialogStruct) SetTitle(title string) *SaveFileDialogStructSetFilename()
Définit le nom de fichier par défaut.
func (d *SaveFileDialogStruct) SetFilename(filename string) *SaveFileDialogStructExemple :
dialog.SetFilename("document.pdf")AddFilter()
Ajoute un filtre de type de fichier.
func (d *SaveFileDialogStruct) AddFilter(displayName, pattern string) *SaveFileDialogStructExemple :
dialog.AddFilter("PDF Document", "*.pdf").
AddFilter("Text Document", "*.txt")SetDirectory()
Définit le répertoire initial.
func (d *SaveFileDialogStruct) SetDirectory(directory string) *SaveFileDialogStructAttachToWindow()
Associe la boîte de dialogue à une fenêtre précise.
func (d *SaveFileDialogStruct) AttachToWindow(window Window) *SaveFileDialogStructPromptForSingleSelection()
Affiche la boîte de dialogue et renvoie le chemin d’enregistrement.
func (d *SaveFileDialogStruct) PromptForSingleSelection() (string, error)Exemple :
path, err := app.Dialog.SaveFile().
SetTitle("Save Document").
SetFilename("untitled.pdf").
AddFilter("PDF Document", "*.pdf").
PromptForSingleSelection()
if err != nil {
// User cancelled
return
}
// Save to the selected path
saveDocument(path)Sélection d’un dossier
Il n’existe pas de SelectFolderDialog distinct. Utilisez OpenFile() avec les options de sélection de répertoires :
path, err := app.Dialog.OpenFile().
SetTitle("Select Output Folder").
CanChooseDirectories(true).
CanChooseFiles(false).
PromptForSingleSelection()
if err != nil {
// User cancelled
return
}
// Use the selected folder
outputDir = pathBoîtes de dialogue de message
Toutes les boîtes de dialogue de message renvoient *MessageDialog et partagent les mêmes méthodes.
Info()
Crée une boîte de dialogue d’information.
func (dm *DialogManager) Info() *MessageDialogExemple :
app.Dialog.Info().
SetTitle("Success").
SetMessage("File saved successfully!").
Show()Error()
Crée une boîte de dialogue d’erreur.
func (dm *DialogManager) Error() *MessageDialogExemple :
app.Dialog.Error().
SetTitle("Error").
SetMessage("Failed to save file: " + err.Error()).
Show()Warning()
Crée une boîte de dialogue d’avertissement.
func (dm *DialogManager) Warning() *MessageDialogExemple :
app.Dialog.Warning().
SetTitle("Warning").
SetMessage("This action cannot be undone.").
Show()Question()
Crée une boîte de dialogue de question avec des boutons personnalisés.
func (dm *DialogManager) Question() *MessageDialogExemple :
dialog := app.Dialog.Question().
SetTitle("Confirm").
SetMessage("Do you want to save changes?")
save := dialog.AddButton("Save")
save.OnClick(func() {
saveDocument()
})
dontSave := dialog.AddButton("Don't Save")
dontSave.OnClick(func() {
// Continue without saving
})
cancel := dialog.AddButton("Cancel")
cancel.OnClick(func() {
// Do nothing
})
dialog.SetDefaultButton(save)
dialog.SetCancelButton(cancel)
dialog.Show()Méthodes de MessageDialog
SetTitle()
Définit le titre de la boîte de dialogue.
func (d *MessageDialog) SetTitle(title string) *MessageDialogSetMessage()
Définit le message de la boîte de dialogue.
func (d *MessageDialog) SetMessage(message string) *MessageDialogSetIcon()
Définit une icône personnalisée pour la boîte de dialogue.
func (d *MessageDialog) SetIcon(icon []byte) *MessageDialogAddButton()
Ajoute un bouton à la boîte de dialogue et renvoie ce bouton afin de permettre sa configuration.
func (d *MessageDialog) AddButton(label string) *ButtonRenvoie : *Button — L’instance du bouton permettant de poursuivre sa configuration
Exemple :
button := dialog.AddButton("OK")
button.OnClick(func() {
// Handle click
})SetDefaultButton()
Définit le bouton par défaut (activé en appuyant sur Entrée).
func (d *MessageDialog) SetDefaultButton(button *Button) *MessageDialogExemple :
yes := dialog.AddButton("Yes")
no := dialog.AddButton("No")
dialog.SetDefaultButton(yes)SetCancelButton()
Définit le bouton d’annulation (activé en appuyant sur Échap).
func (d *MessageDialog) SetCancelButton(button *Button) *MessageDialogExemple :
ok := dialog.AddButton("OK")
cancel := dialog.AddButton("Cancel")
dialog.SetCancelButton(cancel)AttachToWindow()
Associe la boîte de dialogue à une fenêtre donnée.
func (d *MessageDialog) AttachToWindow(window Window) *MessageDialogShow()
Affiche la boîte de dialogue. Les fonctions de rappel des boutons traitent les réponses de l’utilisateur.
func (d *MessageDialog) Show()Remarque : Show() ne renvoie aucune valeur. Utilisez les fonctions de rappel des boutons pour traiter les réponses de l’utilisateur.
Méthodes des boutons
OnClick()
Définit la fonction de rappel exécutée lorsque l’utilisateur clique sur le bouton.
func (b *Button) OnClick(callback func()) *ButtonSetAsDefault()
Définit ce bouton comme bouton par défaut.
func (b *Button) SetAsDefault() *ButtonSetAsCancel()
Définit ce bouton comme bouton d’annulation.
func (b *Button) SetAsCancel() *ButtonExemples complets
Exemple de sélection de fichiers
type FileService struct {
app *application.App
}
func (s *FileService) OpenImage() (string, error) {
path, err := s.app.Dialog.OpenFile().
SetTitle("Select Image").
AddFilter("Images", "*.png;*.jpg;*.jpeg;*.gif").
AddFilter("All Files", "*.*").
PromptForSingleSelection()
if err != nil {
return "", err
}
return path, nil
}
func (s *FileService) SaveDocument(defaultName string) (string, error) {
path, err := s.app.Dialog.SaveFile().
SetTitle("Save Document").
SetFilename(defaultName).
AddFilter("PDF Document", "*.pdf").
AddFilter("Text Document", "*.txt").
PromptForSingleSelection()
if err != nil {
return "", err
}
return path, nil
}
func (s *FileService) SelectOutputFolder() (string, error) {
path, err := s.app.Dialog.OpenFile().
SetTitle("Select Output Folder").
CanChooseDirectories(true).
CanChooseFiles(false).
PromptForSingleSelection()
if err != nil {
return "", err
}
return path, nil
}Exemple de boîte de dialogue de confirmation
func (s *Service) DeleteItem(app *application.App, id string) {
dialog := app.Dialog.Question().
SetTitle("Confirm Delete").
SetMessage("Are you sure you want to delete this item?")
deleteBtn := dialog.AddButton("Delete")
deleteBtn.OnClick(func() {
deleteFromDatabase(id)
})
cancelBtn := dialog.AddButton("Cancel")
// Cancel does nothing
dialog.SetDefaultButton(cancelBtn) // Default to Cancel for safety
dialog.SetCancelButton(cancelBtn)
dialog.Show()
}Boîte de dialogue d’enregistrement des modifications
func (s *Editor) PromptSaveChanges(app *application.App) {
dialog := app.Dialog.Question().
SetTitle("Unsaved Changes").
SetMessage("Do you want to save your changes before closing?")
save := dialog.AddButton("Save")
save.OnClick(func() {
s.Save()
s.Close()
})
dontSave := dialog.AddButton("Don't Save")
dontSave.OnClick(func() {
s.Close()
})
cancel := dialog.AddButton("Cancel")
// Cancel does nothing, dialog closes
dialog.SetDefaultButton(save)
dialog.SetCancelButton(cancel)
dialog.Show()
}Traitement de plusieurs fichiers
func (s *Service) ProcessMultipleFiles(app *application.App) error {
// Select multiple files
paths, err := app.Dialog.OpenFile().
SetTitle("Select Files to Process").
AddFilter("Images", "*.png;*.jpg").
PromptForMultipleSelection()
if err != nil {
return err
}
if len(paths) == 0 {
app.Dialog.Info().
SetTitle("No Files Selected").
SetMessage("Please select at least one file.").
Show()
return nil
}
// Process files
for _, path := range paths {
err := processFile(path)
if err != nil {
app.Dialog.Error().
SetTitle("Processing Error").
SetMessage(fmt.Sprintf("Failed to process %s: %v", path, err)).
Show()
continue
}
}
// Show completion
app.Dialog.Info().
SetTitle("Complete").
SetMessage(fmt.Sprintf("Successfully processed %d files", len(paths))).
Show()
return nil
}Gestion des erreurs avec les boîtes de dialogue
func (s *Service) SaveFile(app *application.App, data []byte) error {
// Select save location
path, err := app.Dialog.SaveFile().
SetTitle("Save File").
SetFilename("data.json").
AddFilter("JSON File", "*.json").
PromptForSingleSelection()
if err != nil {
// User cancelled - not an error
return nil
}
// Attempt to save
err = os.WriteFile(path, data, 0644)
if err != nil {
// Show error dialog
app.Dialog.Error().
SetTitle("Save Failed").
SetMessage(fmt.Sprintf("Could not save file: %v", err)).
Show()
return err
}
// Show success
app.Dialog.Info().
SetTitle("Success").
SetMessage("File saved successfully!").
Show()
return nil
}Valeurs par défaut propres à chaque plateforme
import (
"os"
"path/filepath"
"runtime"
)
func (s *Service) GetDefaultDirectory() string {
homeDir, _ := os.UserHomeDir()
switch runtime.GOOS {
case "windows":
return filepath.Join(homeDir, "Documents")
case "darwin":
return filepath.Join(homeDir, "Documents")
case "linux":
return filepath.Join(homeDir, "Documents")
default:
return homeDir
}
}
func (s *Service) OpenWithDefaults(app *application.App) (string, error) {
return app.Dialog.OpenFile().
SetTitle("Open File").
SetDirectory(s.GetDefaultDirectory()).
AddFilter("All Files", "*.*").
PromptForSingleSelection()
}Bonnes pratiques
À faire
- Utilisez des boîtes de dialogue natives — Elles respectent l’apparence et le comportement de la plateforme
- Donnez des titres explicites — Aidez les utilisateurs à comprendre l’objectif de la boîte de dialogue
- Définissez des filtres appropriés — Guidez les utilisateurs vers les types de fichiers adéquats
- Gérez l’annulation — Vérifiez les erreurs, car l’utilisateur peut annuler l’opération
- Demandez confirmation avant toute action destructive — Utilisez des boîtes de dialogue Question
- Fournissez un retour d’information — Utilisez des boîtes de dialogue Info pour les messages de réussite
- Définissez des valeurs par défaut pertinentes — Répertoire et nom de fichier par défaut, etc.
- Utilisez des fonctions de rappel pour les actions des boutons — Traitez correctement les réponses de l’utilisateur
À ne pas faire
- N’ignorez pas les erreurs — L’annulation par l’utilisateur renvoie une erreur
- N’utilisez pas de libellés de boutons ambigus — Soyez précis : « Enregistrer »/« Annuler »
- N’abusez pas des boîtes de dialogue — Elles interrompent le flux de travail
- N’affichez pas d’erreur en cas d’annulation — Il s’agit d’une action normale
- N’oubliez pas les filtres de fichiers — Aidez les utilisateurs à trouver les fichiers appropriés
- Ne codez pas les chemins en dur — Utilisez os.UserHomeDir() ou une fonction similaire
Types de boîtes de dialogue selon la plateforme
macOS
- Les boîtes de dialogue se déroulent depuis la barre de titre
- Style « feuille » attaché à la fenêtre parente
- Apparence native de macOS
Windows
- Boîtes de dialogue Windows standard
- Respecte les directives de conception de Windows
- Apparence moderne de Windows 10/11
Linux
- Boîtes de dialogue GTK sur les systèmes basés sur GTK
- Boîtes de dialogue Qt sur les systèmes basés sur Qt
- S’adapte à l’environnement de bureau
Comportement des boîtes de dialogue sous Linux
Sous Linux, la compilation GTK4 par défaut utilise xdg-desktop-portal pour les boîtes de dialogue de fichiers, ce qui assure une intégration native au bureau, mais signifie que certaines options sont sans effet. L’ancienne voie GTK3 (-tags gtk3) conserve un contrôle programmatique total sur ces options :
| Option | GTK3 (-tags gtk3) |
GTK4 (par défaut) | Remarques |
|---|---|---|---|
ShowHiddenFiles() |
✅ Fonctionne | ❌ Sans effet | L’utilisateur contrôle cette option au moyen du bouton bascule de la boîte de dialogue (Ctrl+H ou menu) |
CanCreateDirectories() |
✅ Fonctionne | ❌ Sans effet | Toujours activé dans le portail |
ResolvesAliases() |
✅ Fonctionne | ❌ Sans effet | Le portail gère la résolution des liens symboliques |
SetButtonText() |
✅ Fonctionne | ✅ Fonctionne | Le texte personnalisé du bouton d’acceptation fonctionne |
Pourquoi ces limitations existent : les boîtes de dialogue de GTK4 fondées sur le portail délèguent le contrôle de l’interface utilisateur à l’environnement de bureau (GNOME, KDE, etc.). Ce comportement est intentionnel : le portail offre une expérience utilisateur cohérente entre les applications et respecte les préférences de l’utilisateur.
Modèles courants
Modèle « Enregistrer sous »
func (s *Service) SaveAs(app *application.App, currentPath string) (string, error) {
// Extract filename from current path
filename := filepath.Base(currentPath)
// Show save dialog
path, err := app.Dialog.SaveFile().
SetTitle("Save As").
SetFilename(filename).
PromptForSingleSelection()
if err != nil {
return "", err
}
return path, nil
}Modèle « Ouvrir un élément récent »
func (s *Service) OpenRecent(app *application.App, recentPath string) error {
// Check if file still exists
if _, err := os.Stat(recentPath); os.IsNotExist(err) {
dialog := app.Dialog.Question().
SetTitle("File Not Found").
SetMessage("The file no longer exists. Remove from recent files?")
remove := dialog.AddButton("Remove")
remove.OnClick(func() {
s.removeFromRecent(recentPath)
})
cancel := dialog.AddButton("Cancel")
dialog.SetCancelButton(cancel)
dialog.Show()
return err
}
return s.openFile(recentPath)
}