Dialogs-API
Vollständige Referenz für native Dialog-APIs
Überblick
Die Dialogs-API bietet Methoden zum Anzeigen nativer Datei- und Meldungsdialoge. Greifen Sie über den Manager app.Dialog auf Dialoge zu.
Dialogtypen:
- Dateidialoge – Dialoge zum Öffnen und Speichern
- Meldungsdialoge – Informations-, Fehler-, Warn- und Fragedialoge
Alle Dialoge sind native Betriebssystemdialoge, deren Erscheinungsbild der jeweiligen Plattform entspricht.
Auf Dialoge zugreifen
Der Zugriff auf Dialoge erfolgt über den Manager app.Dialog:
app.Dialog.OpenFile()
app.Dialog.SaveFile()
app.Dialog.Info()
app.Dialog.Question()
app.Dialog.Warning()
app.Dialog.Error()Dateidialoge
OpenFile()
Erstellt einen Dialog zum Öffnen einer Datei.
func (dm *DialogManager) OpenFile() *OpenFileDialogStructBeispiel:
dialog := app.Dialog.OpenFile()Methoden von OpenFileDialogStruct
SetTitle()
Legt den Titel des Dialogs fest.
func (d *OpenFileDialogStruct) SetTitle(title string) *OpenFileDialogStructBeispiel:
dialog.SetTitle("Select Image")AddFilter()
Fügt einen Dateitypfilter hinzu.
func (d *OpenFileDialogStruct) AddFilter(displayName, pattern string) *OpenFileDialogStructParameter:
displayName– Dem Benutzer angezeigte Filterbeschreibung (z. B. „Bilder“, „Dokumente“)pattern– Durch Semikolons getrennte Liste von Dateiendungen (z. B. „.png;.jpg“)
Beispiel:
dialog.AddFilter("Images", "*.png;*.jpg;*.gif").
AddFilter("Documents", "*.pdf;*.docx").
AddFilter("All Files", "*.*")SetDirectory()
Legt das anfängliche Verzeichnis fest.
func (d *OpenFileDialogStruct) SetDirectory(directory string) *OpenFileDialogStructBeispiel:
homeDir, _ := os.UserHomeDir()
dialog.SetDirectory(homeDir)CanChooseDirectories()
Aktiviert oder deaktiviert die Auswahl von Verzeichnissen.
func (d *OpenFileDialogStruct) CanChooseDirectories(canChooseDirectories bool) *OpenFileDialogStructBeispiel (Ordnerauswahl):
// Select folders instead of files
path, err := app.Dialog.OpenFile().
SetTitle("Select Folder").
CanChooseDirectories(true).
CanChooseFiles(false).
PromptForSingleSelection()CanChooseFiles()
Aktiviert oder deaktiviert die Auswahl von Dateien.
func (d *OpenFileDialogStruct) CanChooseFiles(canChooseFiles bool) *OpenFileDialogStructCanCreateDirectories()
Aktiviert oder deaktiviert das Erstellen neuer Verzeichnisse.
func (d *OpenFileDialogStruct) CanCreateDirectories(canCreateDirectories bool) *OpenFileDialogStructShowHiddenFiles()
Blendet ausgeblendete Dateien ein oder aus.
func (d *OpenFileDialogStruct) ShowHiddenFiles(showHiddenFiles bool) *OpenFileDialogStructAttachToWindow()
Verknüpft den Dialog mit einem bestimmten Fenster.
func (d *OpenFileDialogStruct) AttachToWindow(window Window) *OpenFileDialogStructPromptForSingleSelection()
Zeigt den Dialog an und gibt die ausgewählte Datei zurück.
func (d *OpenFileDialogStruct) PromptForSingleSelection() (string, error)Rückgabewerte:
string– Pfad der ausgewählten Datei. Behandeln Sie eine leere Zeichenfolge als „keine Auswahl“ (je nach Betriebssystem geben die Plattformimplementierungen beim Abbrechen entweder eine leere Zeichenfolge oder einen Fehler ungleich nil zurück).error– Ungleich nil, wenn der Dialog selbst nicht angezeigt werden konnte.
Beispiel:
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()
Zeigt den Dialog an und gibt mehrere ausgewählte Dateien zurück.
func (d *OpenFileDialogStruct) PromptForMultipleSelection() ([]string, error)Rückgabewerte:
[]string– Array mit den Pfaden der ausgewählten Dateienerror– Fehler, wenn der Dialog fehlgeschlagen ist
Beispiel:
paths, err := app.Dialog.OpenFile().
SetTitle("Select Images").
AddFilter("Images", "*.png;*.jpg").
PromptForMultipleSelection()
if err != nil {
return
}
for _, path := range paths {
processFile(path)
}SaveFile()
Erstellt einen Dialog zum Speichern einer Datei.
func (dm *DialogManager) SaveFile() *SaveFileDialogStructBeispiel:
dialog := app.Dialog.SaveFile()Methoden von SaveFileDialogStruct
SetTitle()
Legt den Titel des Dialogs fest.
func (d *SaveFileDialogStruct) SetTitle(title string) *SaveFileDialogStructSetFilename()
Legt den standardmäßigen Dateinamen fest.
func (d *SaveFileDialogStruct) SetFilename(filename string) *SaveFileDialogStructBeispiel:
dialog.SetFilename("document.pdf")AddFilter()
Fügt einen Dateitypfilter hinzu.
func (d *SaveFileDialogStruct) AddFilter(displayName, pattern string) *SaveFileDialogStructBeispiel:
dialog.AddFilter("PDF Document", "*.pdf").
AddFilter("Text Document", "*.txt")SetDirectory()
Legt das anfängliche Verzeichnis fest.
func (d *SaveFileDialogStruct) SetDirectory(directory string) *SaveFileDialogStructAttachToWindow()
Verknüpft den Dialog mit einem bestimmten Fenster.
func (d *SaveFileDialogStruct) AttachToWindow(window Window) *SaveFileDialogStructPromptForSingleSelection()
Zeigt den Dialog an und gibt den Speicherpfad zurück.
func (d *SaveFileDialogStruct) PromptForSingleSelection() (string, error)Beispiel:
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)Ordnerauswahl
Es gibt keine separate SelectFolderDialog. Verwenden Sie OpenFile() mit Verzeichnisoptionen:
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 = pathMeldungsdialoge
Alle Meldungsdialoge geben *MessageDialog zurück und stellen dieselben Methoden bereit.
Info()
Erstellt einen Informationsdialog.
func (dm *DialogManager) Info() *MessageDialogBeispiel:
app.Dialog.Info().
SetTitle("Success").
SetMessage("File saved successfully!").
Show()Error()
Erstellt einen Fehlerdialog.
func (dm *DialogManager) Error() *MessageDialogBeispiel:
app.Dialog.Error().
SetTitle("Error").
SetMessage("Failed to save file: " + err.Error()).
Show()Warning()
Erstellt einen Warnungsdialog.
func (dm *DialogManager) Warning() *MessageDialogBeispiel:
app.Dialog.Warning().
SetTitle("Warning").
SetMessage("This action cannot be undone.").
Show()Question()
Erstellt einen Fragedialog mit benutzerdefinierten Schaltflächen.
func (dm *DialogManager) Question() *MessageDialogBeispiel:
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()MessageDialog-Methoden
SetTitle()
Legt den Titel des Dialogs fest.
func (d *MessageDialog) SetTitle(title string) *MessageDialogSetMessage()
Legt die Meldung des Dialogs fest.
func (d *MessageDialog) SetMessage(message string) *MessageDialogSetIcon()
Legt ein benutzerdefiniertes Symbol für den Dialog fest.
func (d *MessageDialog) SetIcon(icon []byte) *MessageDialogAddButton()
Fügt dem Dialog eine Schaltfläche hinzu und gibt sie zur Konfiguration zurück.
func (d *MessageDialog) AddButton(label string) *ButtonRückgabewert: *Button – Die Schaltflächeninstanz zur weiteren Konfiguration
Beispiel:
button := dialog.AddButton("OK")
button.OnClick(func() {
// Handle click
})SetDefaultButton()
Legt fest, welche Schaltfläche die Standardschaltfläche ist (wird durch Drücken der Eingabetaste aktiviert).
func (d *MessageDialog) SetDefaultButton(button *Button) *MessageDialogBeispiel:
yes := dialog.AddButton("Yes")
no := dialog.AddButton("No")
dialog.SetDefaultButton(yes)SetCancelButton()
Legt fest, welche Schaltfläche die Abbrechen-Schaltfläche ist (wird durch Drücken der Esc-Taste aktiviert).
func (d *MessageDialog) SetCancelButton(button *Button) *MessageDialogBeispiel:
ok := dialog.AddButton("OK")
cancel := dialog.AddButton("Cancel")
dialog.SetCancelButton(cancel)AttachToWindow()
Ordnet den Dialog einem bestimmten Fenster zu.
func (d *MessageDialog) AttachToWindow(window Window) *MessageDialogShow()
Zeigt den Dialog an. Schaltflächen-Callbacks verarbeiten die Benutzerreaktionen.
func (d *MessageDialog) Show()Hinweis: Show() gibt keinen Wert zurück. Verwenden Sie Schaltflächen-Callbacks, um Benutzerreaktionen zu verarbeiten.
Schaltflächenmethoden
OnClick()
Legt die Callback-Funktion fest, die beim Klicken auf die Schaltfläche aufgerufen wird.
func (b *Button) OnClick(callback func()) *ButtonSetAsDefault()
Kennzeichnet diese Schaltfläche als Standardschaltfläche.
func (b *Button) SetAsDefault() *ButtonSetAsCancel()
Kennzeichnet diese Schaltfläche als Abbrechen-Schaltfläche.
func (b *Button) SetAsCancel() *ButtonVollständige Beispiele
Beispiel für die Dateiauswahl
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
}Beispiel für einen Bestätigungsdialog
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()
}Dialog zum Speichern von Änderungen
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()
}Verarbeitung mehrerer Dateien
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
}Fehlerbehandlung mit Dialogen
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
}Plattformspezifische Standardwerte
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()
}Bewährte Vorgehensweisen
Empfohlen
- Native Dialoge verwenden – Sie entsprechen dem Erscheinungsbild der Plattform
- Eindeutige Titel verwenden – Sie helfen Benutzern, den Zweck zu verstehen
- Geeignete Filter festlegen – Sie führen Benutzer zu den richtigen Dateitypen
- Abbrüche behandeln – Auf Fehler prüfen (der Benutzer kann abbrechen)
- Bei destruktiven Aktionen eine Bestätigung anzeigen – Question-Dialoge verwenden
- Rückmeldung geben – Info-Dialoge für Erfolgsmeldungen verwenden
- Sinnvolle Standardwerte festlegen – Standardverzeichnis, Dateiname usw.
- Callbacks für Schaltflächenaktionen verwenden – Benutzerreaktionen korrekt verarbeiten
Nicht empfohlen
- Fehler nicht ignorieren – Ein Abbruch durch den Benutzer gibt einen Fehler zurück
- Keine mehrdeutigen Schaltflächenbeschriftungen verwenden – Eindeutige Bezeichnungen verwenden: „Speichern“/„Abbrechen“
- Dialoge nicht übermäßig verwenden – sie unterbrechen den Arbeitsablauf
- Bei einem Abbruch keine Fehler anzeigen – er ist eine normale Aktion
- Dateifilter nicht vergessen – sie helfen Benutzern, die richtigen Dateien zu finden
- Pfade nicht fest codieren – os.UserHomeDir() oder Ähnliches verwenden
Dialogtypen nach Plattform
macOS
- Dialoge werden von der Titelleiste nach unten eingeblendet
- Als „Sheet“ an das übergeordnete Fenster angeheftet
- Natives macOS-Erscheinungsbild
Windows
- Windows-Standarddialoge
- Entspricht den Windows-Designrichtlinien
- Modernes Windows-10/11-Erscheinungsbild
Linux
- GTK-Dialoge auf GTK-basierten Systemen
- Qt-Dialoge auf Qt-basierten Systemen
- Passt sich an die Desktop-Umgebung an
Verhalten von Dialogen unter Linux
Unter Linux verwendet der standardmäßige GTK4-Build für Dateidialoge xdg-desktop-portal. Dies ermöglicht eine native Desktop-Integration, bedeutet jedoch, dass einige Optionen wirkungslos sind. Der ältere GTK3-Pfad (-tags gtk3) behält die vollständige programmgesteuerte Kontrolle über diese Optionen:
| Option | GTK3 (-tags gtk3) |
GTK4 (Standard) | Hinweise |
|---|---|---|---|
ShowHiddenFiles() |
✅ Funktioniert | ❌ Keine Wirkung | Benutzer steuern dies über den Schalter in der Benutzeroberfläche des Dialogs (Ctrl+H oder Menü) |
CanCreateDirectories() |
✅ Funktioniert | ❌ Keine Wirkung | Im Portal immer aktiviert |
ResolvesAliases() |
✅ Funktioniert | ❌ Keine Wirkung | Das Portal übernimmt die Auflösung symbolischer Links |
SetButtonText() |
✅ Funktioniert | ✅ Funktioniert | Benutzerdefinierter Text für die Bestätigungsschaltfläche funktioniert |
Warum diese Einschränkungen bestehen: Die portalbasierten Dialoge von GTK4 übertragen die Kontrolle über die Benutzeroberfläche an die Desktop-Umgebung (GNOME, KDE usw.). Dies ist beabsichtigt: Das Portal sorgt anwendungsübergreifend für eine einheitliche Benutzererfahrung und berücksichtigt die Benutzereinstellungen.
Gängige Muster
Muster „Speichern unter“
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
}Muster „Zuletzt verwendet öffnen“
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)
}