using System; using System.IO; using System.IO.Abstractions; using System.Text; namespace Terminal.Gui { /// /// Determines which symbol to use to represent files and directories. /// public class FileSystemIconProvider { /// /// /// Gets or sets a flag indicating whether to use Nerd Font icons. /// Defaults to which can be configured /// by end users from their ./.tui/config.json /// via . /// /// Enabling implicitly /// disables . /// public bool UseNerdIcons { get => _useNerdIcons; set { _useNerdIcons = value; if (value) { UseUnicodeCharacters = false; } } } /// /// Gets or sets a flag indicating whether to use common unicode /// characters for file/directory icons. /// public bool UseUnicodeCharacters { get => _useUnicodeCharacters; set { _useUnicodeCharacters = value; if (value) { UseNerdIcons = false; } } } private NerdFonts _nerd = new NerdFonts (); private bool _useNerdIcons = NerdFonts.Enable; private bool _useUnicodeCharacters; /// /// Gets or sets the delegate to be used to determine opened state of directories /// when resolving . Defaults to always false. /// public Func IsOpenGetter { get; set; } = (d) => false; /// /// Returns the character to use to represent or an empty /// space if no icon should be used. /// /// The file or directory requiring an icon. /// public Rune GetIcon (IFileSystemInfo fileSystemInfo) { if (UseNerdIcons) { return new Rune ( _nerd.GetNerdIcon ( fileSystemInfo, fileSystemInfo is IDirectoryInfo dir ? IsOpenGetter (dir) : false )); } if (fileSystemInfo is IDirectoryInfo) { return UseUnicodeCharacters ? ConfigurationManager.Glyphs.Folder : new Rune (Path.DirectorySeparatorChar); } return UseUnicodeCharacters ? ConfigurationManager.Glyphs.File : new Rune (' '); } /// /// Returns with an extra /// space on the end if icon is likely to overlap adjacent cells. /// public string GetIconWithOptionalSpace(IFileSystemInfo fileSystemInfo) { var space = UseNerdIcons ? " " : ""; return GetIcon(fileSystemInfo) + space; } } }