diff --git a/Dalamud/Interface/ImGuiFileDialog/FileDialog.Files.cs b/Dalamud/Interface/ImGuiFileDialog/FileDialog.Files.cs index 98c48164f..881ab2108 100644 --- a/Dalamud/Interface/ImGuiFileDialog/FileDialog.Files.cs +++ b/Dalamud/Interface/ImGuiFileDialog/FileDialog.Files.cs @@ -298,70 +298,25 @@ namespace Dalamud.Interface.ImGuiFileDialog private void SetupSideBar() { - var drives = DriveInfo.GetDrives(); - foreach (var drive in drives) + foreach (var drive in DriveInfo.GetDrives()) { - this.drives.Add(new SideBarItem - { - Icon = FontAwesomeIcon.Server, - Location = drive.Name, - Text = drive.Name, - }); + this.drives.Add(new SideBarItem(drive.Name, drive.Name, FontAwesomeIcon.Server)); } var personal = Path.GetDirectoryName(Environment.GetFolderPath(Environment.SpecialFolder.Personal)); - this.quickAccess.Add(new SideBarItem - { - Icon = FontAwesomeIcon.Desktop, - Location = Environment.GetFolderPath(Environment.SpecialFolder.Desktop), - Text = "Desktop", - }); - - this.quickAccess.Add(new SideBarItem - { - Icon = FontAwesomeIcon.File, - Location = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), - Text = "Documents", - }); + this.quickAccess.Add(new SideBarItem("Desktop", Environment.GetFolderPath(Environment.SpecialFolder.Desktop), FontAwesomeIcon.Desktop)); + this.quickAccess.Add(new SideBarItem("Documents", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), FontAwesomeIcon.File)); if (!string.IsNullOrEmpty(personal)) { - this.quickAccess.Add(new SideBarItem - { - Icon = FontAwesomeIcon.Download, - Location = Path.Combine(personal, "Downloads"), - Text = "Downloads", - }); + this.quickAccess.Add(new SideBarItem("Downloads", Path.Combine(personal, "Downloads"), FontAwesomeIcon.Download)); } - this.quickAccess.Add(new SideBarItem - { - Icon = FontAwesomeIcon.Star, - Location = Environment.GetFolderPath(Environment.SpecialFolder.Favorites), - Text = "Favorites", - }); - - this.quickAccess.Add(new SideBarItem - { - Icon = FontAwesomeIcon.Music, - Location = Environment.GetFolderPath(Environment.SpecialFolder.MyMusic), - Text = "Music", - }); - - this.quickAccess.Add(new SideBarItem - { - Icon = FontAwesomeIcon.Image, - Location = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), - Text = "Pictures", - }); - - this.quickAccess.Add(new SideBarItem - { - Icon = FontAwesomeIcon.Video, - Location = Environment.GetFolderPath(Environment.SpecialFolder.MyVideos), - Text = "Videos", - }); + this.quickAccess.Add(new SideBarItem("Favorites", Environment.GetFolderPath(Environment.SpecialFolder.Favorites), FontAwesomeIcon.Star)); + this.quickAccess.Add(new SideBarItem("Music", Environment.GetFolderPath(Environment.SpecialFolder.MyMusic), FontAwesomeIcon.Music)); + this.quickAccess.Add(new SideBarItem("Pictures", Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), FontAwesomeIcon.Image)); + this.quickAccess.Add(new SideBarItem("Videos", Environment.GetFolderPath(Environment.SpecialFolder.MyVideos), FontAwesomeIcon.Video)); } private void SortFields(SortingField sortingField, bool canChangeOrder = false) diff --git a/Dalamud/Interface/ImGuiFileDialog/FileDialog.Structs.cs b/Dalamud/Interface/ImGuiFileDialog/FileDialog.Structs.cs index 05dea4db9..ddd988287 100644 --- a/Dalamud/Interface/ImGuiFileDialog/FileDialog.Structs.cs +++ b/Dalamud/Interface/ImGuiFileDialog/FileDialog.Structs.cs @@ -1,5 +1,7 @@ using System.Collections.Generic; +using System.IO; using System.Numerics; +using Dalamud.Utility; namespace Dalamud.Interface.ImGuiFileDialog { @@ -19,7 +21,27 @@ namespace Dalamud.Interface.ImGuiFileDialog public string FileModifiedDate; } - private record struct SideBarItem(string Text, string Location, FontAwesomeIcon Icon); + private readonly struct SideBarItem + { + public SideBarItem(string text, string location, FontAwesomeIcon icon) + { + this.Text = text; + this.Location = location; + this.Icon = icon; + this.Exists = !this.Location.IsNullOrEmpty() && Directory.Exists(this.Location); + } + + public string Text { get; init; } + + public string Location { get; init; } + + public FontAwesomeIcon Icon { get; init; } + + public bool Exists { get; init; } + + public bool CheckExistence() + => !this.Location.IsNullOrEmpty() && Directory.Exists(this.Location); + } private struct FilterStruct { diff --git a/Dalamud/Interface/ImGuiFileDialog/FileDialog.UI.cs b/Dalamud/Interface/ImGuiFileDialog/FileDialog.UI.cs index d768bbe81..9d10c4a40 100644 --- a/Dalamud/Interface/ImGuiFileDialog/FileDialog.UI.cs +++ b/Dalamud/Interface/ImGuiFileDialog/FileDialog.UI.cs @@ -148,7 +148,7 @@ namespace Dalamud.Interface.ImGuiFileDialog private void DrawPathComposer() { ImGui.PushFont(UiBuilder.IconFont); - if (ImGui.Button($"{(this.pathInputActivated ? (char)FontAwesomeIcon.Times : (char)FontAwesomeIcon.Edit)}")) + if (ImGui.Button(this.pathInputActivated ? FontAwesomeIcon.Times.ToIconString() : FontAwesomeIcon.Edit.ToIconString())) { this.pathInputActivated = !this.pathInputActivated; } @@ -159,11 +159,9 @@ namespace Dalamud.Interface.ImGuiFileDialog if (this.pathDecomposition.Count > 0) { - ImGui.SameLine(); - if (this.pathInputActivated) { - ImGui.PushItemWidth(ImGui.GetContentRegionAvail().X); + ImGui.SetNextItemWidth(ImGui.GetContentRegionAvail().X); ImGui.InputText("##pathedit", ref this.pathInputBuffer, 255); ImGui.PopItemWidth(); } @@ -204,7 +202,7 @@ namespace Dalamud.Interface.ImGuiFileDialog private void DrawSearchBar() { ImGui.PushFont(UiBuilder.IconFont); - if (ImGui.Button($"{(char)FontAwesomeIcon.Home}")) + if (ImGui.Button(FontAwesomeIcon.Home.ToIconString())) { this.SetPath("."); } @@ -225,10 +223,8 @@ namespace Dalamud.Interface.ImGuiFileDialog ImGui.SameLine(); ImGui.TextUnformatted("Search :"); ImGui.SameLine(); - ImGui.PushItemWidth(ImGui.GetContentRegionAvail().X); - var edited = ImGui.InputText("##InputImGuiFileDialogSearchField", ref this.searchBuffer, 255); - ImGui.PopItemWidth(); - if (edited) + ImGui.SetNextItemWidth(ImGui.GetContentRegionAvail().X); + if (ImGui.InputText("##InputImGuiFileDialogSearchField", ref this.searchBuffer, 255)) { this.ApplyFilteringOnFileList(); } @@ -240,13 +236,10 @@ namespace Dalamud.Interface.ImGuiFileDialog if (this.flags.HasFlag(ImGuiFileDialogFlags.DisableCreateDirectoryButton)) return; ImGui.PushFont(UiBuilder.IconFont); - if (ImGui.Button(FontAwesomeIcon.FolderPlus.ToIconString())) + if (ImGui.Button(FontAwesomeIcon.FolderPlus.ToIconString()) && !this.createDirectoryMode) { - if (!this.createDirectoryMode) - { - this.createDirectoryMode = true; - this.createDirectoryBuffer = string.Empty; - } + this.createDirectoryMode = true; + this.createDirectoryBuffer = string.Empty; } ImGui.PopFont(); @@ -262,9 +255,8 @@ namespace Dalamud.Interface.ImGuiFileDialog ImGui.TextUnformatted("New Directory Name"); ImGui.SameLine(); - ImGui.PushItemWidth(ImGui.GetContentRegionAvail().X - 100f); + ImGui.SetNextItemWidth(ImGui.GetContentRegionAvail().X - 100f); ImGui.InputText("##DirectoryFileName", ref this.createDirectoryBuffer, 255); - ImGui.PopItemWidth(); ImGui.SameLine(); @@ -293,17 +285,20 @@ namespace Dalamud.Interface.ImGuiFileDialog if (!this.flags.HasFlag(ImGuiFileDialogFlags.HideSideBar)) { - ImGui.BeginChild("##FileDialog_ColumnChild", size); - ImGui.Columns(2, "##FileDialog_Columns"); + if (ImGui.BeginChild("##FileDialog_ColumnChild", size)) + { + ImGui.Columns(2, "##FileDialog_Columns"); - this.DrawSideBar(new Vector2(150, size.Y)); + this.DrawSideBar(size with { X = 150 }); - ImGui.SetColumnWidth(0, 150); - ImGui.NextColumn(); + ImGui.SetColumnWidth(0, 150); + ImGui.NextColumn(); - this.DrawFileListView(size - new Vector2(160, 0)); + this.DrawFileListView(size - new Vector2(160, 0)); + + ImGui.Columns(1); + } - ImGui.Columns(1); ImGui.EndChild(); } else @@ -314,33 +309,30 @@ namespace Dalamud.Interface.ImGuiFileDialog private void DrawSideBar(Vector2 size) { - ImGui.BeginChild("##FileDialog_SideBar", size); - - ImGui.SetCursorPosY(ImGui.GetCursorPosY() + 5); - - var idx = 0; - foreach (var (name, location, icon) in this.drives.Concat(this.quickAccess)) + if (ImGui.BeginChild("##FileDialog_SideBar", size)) { - if (string.IsNullOrEmpty(location) || !Directory.Exists(location)) + + ImGui.SetCursorPosY(ImGui.GetCursorPosY() + 5); + + var idx = 0; + foreach (var qa in this.drives.Concat(this.quickAccess).Where(qa => qa.Exists)) { - continue; + ImGui.PushID(idx++); + ImGui.SetCursorPosX(25); + if (ImGui.Selectable(qa.Text, qa.Text == this.selectedSideBar) && qa.CheckExistence()) + { + this.SetPath(qa.Location); + this.selectedSideBar = qa.Text; + } + + ImGui.PushFont(UiBuilder.IconFont); + ImGui.SameLine(); + ImGui.SetCursorPosX(0); + ImGui.TextUnformatted(qa.Icon.ToIconString()); + + ImGui.PopFont(); + ImGui.PopID(); } - - ImGui.PushID(idx++); - ImGui.SetCursorPosX(25); - if (ImGui.Selectable(name, name == this.selectedSideBar)) - { - this.SetPath(location); - this.selectedSideBar = name; - } - - ImGui.PushFont(UiBuilder.IconFont); - ImGui.SameLine(); - ImGui.SetCursorPosX(0); - ImGui.TextUnformatted(icon.ToIconString()); - - ImGui.PopFont(); - ImGui.PopID(); } ImGui.EndChild(); @@ -348,9 +340,13 @@ namespace Dalamud.Interface.ImGuiFileDialog private unsafe void DrawFileListView(Vector2 size) { - ImGui.BeginChild("##FileDialog_FileList", size); + if (!ImGui.BeginChild("##FileDialog_FileList", size)) + { + ImGui.EndChild(); + return; + } - var tableFlags = ImGuiTableFlags.SizingFixedFit | ImGuiTableFlags.RowBg | ImGuiTableFlags.Hideable | ImGuiTableFlags.ScrollY | ImGuiTableFlags.NoHostExtendX; + const ImGuiTableFlags tableFlags = ImGuiTableFlags.SizingFixedFit | ImGuiTableFlags.RowBg | ImGuiTableFlags.Hideable | ImGuiTableFlags.ScrollY | ImGuiTableFlags.NoHostExtendX; if (ImGui.BeginTable("##FileTable", 4, tableFlags, size)) { ImGui.TableSetupScrollFreeze(0, 1); @@ -416,13 +412,12 @@ namespace Dalamud.Interface.ImGuiFileDialog var dir = file.Type == FileStructType.Directory; var item = !dir ? GetIcon(file.Ext) : new IconColorItem - { - Color = dirTextColor, - Icon = FontAwesomeIcon.Folder, - }; + { + Color = dirTextColor, + Icon = FontAwesomeIcon.Folder, + }; - ImGui.PushStyleColor(ImGuiCol.Text, item.Color); - if (selected) ImGui.PushStyleColor(ImGuiCol.Text, selectedTextColor); + ImGui.PushStyleColor(ImGuiCol.Text, selected ? selectedTextColor : item.Color); ImGui.TableNextRow(); @@ -451,12 +446,10 @@ namespace Dalamud.Interface.ImGuiFileDialog if (ImGui.TableNextColumn()) { var sz = ImGui.CalcTextSize(file.FileModifiedDate); - ImGui.PushItemWidth(sz.X + 5); + ImGui.SetNextItemWidth(sz.X + 5); ImGui.TextUnformatted(file.FileModifiedDate + " "); - ImGui.PopItemWidth(); } - if (selected) ImGui.PopStyleColor(); ImGui.PopStyleColor(); if (needToBreak) break; @@ -464,6 +457,7 @@ namespace Dalamud.Interface.ImGuiFileDialog } clipper.End(); + clipper.Destroy(); } } @@ -512,7 +506,7 @@ namespace Dalamud.Interface.ImGuiFileDialog this.pathClicked = this.SelectDirectory(file); return true; } - else if (this.IsDirectoryMode()) + if (this.IsDirectoryMode()) { this.SelectFileName(file); } @@ -718,18 +712,17 @@ namespace Dalamud.Interface.ImGuiFileDialog var selectOnly = this.flags.HasFlag(ImGuiFileDialogFlags.SelectOnly); - ImGui.PushItemWidth(width); + ImGui.SetNextItemWidth(width); if (selectOnly) ImGui.PushStyleVar(ImGuiStyleVar.Alpha, 0.5f); ImGui.InputText("##FileName", ref this.fileNameBuffer, 255, selectOnly ? ImGuiInputTextFlags.ReadOnly : ImGuiInputTextFlags.None); if (selectOnly) ImGui.PopStyleVar(); - ImGui.PopItemWidth(); if (this.filters.Count > 0) { ImGui.SameLine(); var needToApplyNewFilter = false; - ImGui.PushItemWidth(150f); + ImGui.SetNextItemWidth(150f); if (ImGui.BeginCombo("##Filters", this.selectedFilter.Filter, ImGuiComboFlags.None)) { var idx = 0; @@ -749,8 +742,6 @@ namespace Dalamud.Interface.ImGuiFileDialog ImGui.EndCombo(); } - ImGui.PopItemWidth(); - if (needToApplyNewFilter) { this.SetPath(this.currentPath); @@ -814,11 +805,10 @@ namespace Dalamud.Interface.ImGuiFileDialog { // quit dialog, it doesn't exist anyway return true; } - else - { // already exists, open dialog to confirm overwrite - this.isOk = false; - this.okResultToConfirm = true; - } + + // already exists, open dialog to confirm overwrite + this.isOk = false; + this.okResultToConfirm = true; } var name = $"The file Already Exists !##{this.title}{this.id}OverWriteDialog"; diff --git a/Dalamud/Interface/ImGuiFileDialog/FileDialog.cs b/Dalamud/Interface/ImGuiFileDialog/FileDialog.cs index 2a2116296..8308c7116 100644 --- a/Dalamud/Interface/ImGuiFileDialog/FileDialog.cs +++ b/Dalamud/Interface/ImGuiFileDialog/FileDialog.cs @@ -229,7 +229,7 @@ namespace Dalamud.Interface.ImGuiFileDialog var result = this.fileNameBuffer; // a collection like {.cpp, .h}, so can't decide on an extension - if (this.selectedFilter.CollectionFilters != null && this.selectedFilter.CollectionFilters.Count > 0) + if (this.selectedFilter.CollectionFilters is { Count: > 0 }) { return result; } @@ -240,7 +240,7 @@ namespace Dalamud.Interface.ImGuiFileDialog var lastPoint = result.LastIndexOf('.'); if (lastPoint != -1) { - result = result.Substring(0, lastPoint); + result = result[..lastPoint]; } result += this.selectedFilter.Filter; @@ -275,7 +275,7 @@ namespace Dalamud.Interface.ImGuiFileDialog this.currentPath = dir.FullName; if (this.currentPath[^1] == Path.DirectorySeparatorChar) { // handle selecting a drive, like C: -> C:\ - this.currentPath = this.currentPath[0..^1]; + this.currentPath = this.currentPath[..^1]; } this.pathInputBuffer = this.currentPath;