using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System.Windows.Forms; namespace PKHeX.WinForms { public partial class SAV_FolderList : Form { public SAV_FolderList() { InitializeComponent(); // Preprogrammed folders var locs = new List<CustomFolderPath> { new CustomFolderPath {Path = Main.BackupPath, DisplayText = "PKHeX Backups"} }; locs.AddRange(GetUserPaths()); locs.AddRange(Get3DSPaths()); locs.Add(new CustomFolderPath {Path = CyberGadgetUtil.GetCacheFolder(), DisplayText = "CGSE Cache"}); locs.Add(new CustomFolderPath {Path = CyberGadgetUtil.GetTempFolder(), DisplayText = "CGSE Temp"}); var paths = locs.GroupBy(z => z.Path).Select(z => z.First()) .OrderByDescending(z => Directory.Exists(z.Path)); foreach (var loc in paths) AddButton(loc.DisplayText, loc.Path); WinFormsUtil.TranslateInterface(this, Main.CurrentLanguage); } private void AddButton(string name, string path) { var button = new Button { Size = new Size { Height = 30, Width = 130 }, Text = name, Name = $"B_{name}", Enabled = new DirectoryInfo(path).Exists, }; button.Click += (s, e) => { if (Directory.Exists(path)) { Process.Start("explorer.exe", path); Close(); } else WinFormsUtil.Alert("Can't find folder:", path); }; FLP_Buttons.Controls.Add(button); } private static IEnumerable<CustomFolderPath> GetUserPaths() { string loc = Path.Combine(Main.WorkingDirectory, "savpaths.txt"); if (!File.Exists(loc)) yield break; var lines = File.ReadLines(loc); foreach (var line in lines) { var split = line.Split('\t'); if (split.Length == 2) yield return new CustomFolderPath {DisplayText = split[0], Path = split[1]}; } } private static IEnumerable<CustomFolderPath> Get3DSPaths() { var path3DS = PathUtilWindows.Get3DSLocation(); var path = path3DS == null || !Directory.Exists(path3DS) ? @"C:\" : Path.GetPathRoot(path3DS); foreach (var z in PathUtilWindows.Get3DSBackupPaths(path)) { var di = new DirectoryInfo(z); var root = di.Root.Name; var folder = di.Parent.Name; if (root == folder) folder = di.Name; yield return new CustomFolderPath {Path = z, DisplayText = folder}; } } private struct CustomFolderPath { public string Path; public string DisplayText; } } }