// // FileDialog.cs: File system dialogs for open and save // using System; using System.Collections.Generic; using NStack; namespace Terminal.Gui { public class FileDialog : Dialog { Button prompt, cancel; Label nameFieldLabel, message, dirLabel; TextField dirEntry, nameEntry; public FileDialog (ustring title, ustring prompt, ustring nameFieldLabel, ustring message) : base (title, Driver.Cols - 20, Driver.Rows - 6, null) { this.message = new Label (Rect.Empty, message); var msgLines = Label.MeasureLines (message, Driver.Cols - 20); dirLabel = new Label ("Directory: ") { X = 2, Y = 1 + msgLines }; dirEntry = new TextField ("") { X = 12, Y = 1 + msgLines }; Add (dirLabel, dirEntry); this.nameFieldLabel = new Label (nameFieldLabel) { X = 2, Y = 3 + msgLines, }; nameEntry = new TextField ("") { X = 2 + nameFieldLabel.RuneCount + 1, Y = 3 + msgLines, Width = Dim.Fill () - 1 }; Add (this.nameFieldLabel, nameEntry); this.cancel = new Button ("Cancel"); AddButton (cancel); this.prompt = new Button (prompt); AddButton (this.prompt); } /// /// Gets or sets the prompt label for the button displayed to the user /// /// The prompt. public ustring Prompt { get => prompt.Text; set { prompt.Text = value; } } /// /// Gets or sets the name field label. /// /// The name field label. public ustring NameFieldLabel { get => nameFieldLabel.Text; set { nameFieldLabel.Text = value; } } /// /// Gets or sets the message displayed to the user, defaults to nothing /// /// The message. public ustring Message { get => message.Text; set { message.Text = value; } } /// /// Gets or sets a value indicating whether this can create directories. /// /// true if can create directories; otherwise, false. public bool CanCreateDirectories { get; set; } /// /// Gets or sets a value indicating whether this is extension hidden. /// /// true if is extension hidden; otherwise, false. public bool IsExtensionHidden { get; set; } /// /// Gets or sets the directory path for this panel /// /// The directory path. public ustring DirectoryPath { get => dirEntry.Text; set { dirEntry.Text = value; } } /// /// The array of filename extensions allowed, or null if all file extensions are allowed. /// /// The allowed file types. public ustring [] AllowedFileTypes { get; set; } /// /// Gets or sets a value indicating whether this allows the file to be saved with a different extension /// /// true if allows other file types; otherwise, false. public bool AllowsOtherFileTypes { get; set; } /// /// The File path that is currently shown on the panel /// /// The absolute file path for the file path entered. public ustring FilePath { get => nameEntry.Text; set { nameEntry.Text = value; } } } public class SaveDialog : FileDialog { public SaveDialog (ustring title, ustring message) : base (title, prompt: "Save", nameFieldLabel: "Save as:", message: message) { } } public class OpenDialog : FileDialog { public OpenDialog (ustring title, ustring message) : base (title, prompt: "Open", nameFieldLabel: "Open", message: message) { } /// /// Gets or sets a value indicating whether this can choose files. /// /// true if can choose files; otherwise, false. public bool CanChooseFiles { get; set; } /// /// Gets or sets a value indicating whether this can choose directories. /// /// true if can choose directories; otherwise, false. public bool CanChooseDirectories { get; set; } /// /// Gets or sets a value indicating whether this allows multiple selection. /// /// true if allows multiple selection; otherwise, false. public bool AllowsMultipleSelection { get; set; } /// /// Gets the file paths selected /// /// The file paths. public IReadOnlyList FilePaths { get; } } }