From 01c360416f811ba391e0d4c9434824d47cfc7948 Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Sat, 17 Sep 2022 00:48:38 +0200 Subject: [PATCH] Add file selection combo to textures. --- Penumbra/Import/Textures/Texture.cs | 24 ++++++++++++++++--- Penumbra/Mods/Editor/Mod.Editor.Files.cs | 9 +++++-- Penumbra/UI/Classes/ModEditWindow.Textures.cs | 4 ++++ 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/Penumbra/Import/Textures/Texture.cs b/Penumbra/Import/Textures/Texture.cs index a0cc6d33..c553ed9f 100644 --- a/Penumbra/Import/Textures/Texture.cs +++ b/Penumbra/Import/Textures/Texture.cs @@ -5,7 +5,6 @@ using System.Numerics; using Dalamud.Interface; using Dalamud.Interface.ImGuiFileDialog; using Dalamud.Utility; -using FFXIVClientStructs.FFXIV.Component.GUI; using ImGuiNET; using ImGuiScene; using Lumina.Data.Files; @@ -19,7 +18,7 @@ using Image = SixLabors.ImageSharp.Image; namespace Penumbra.Import.Textures; -public class Texture : IDisposable +public sealed class Texture : IDisposable { public enum FileType { @@ -193,10 +192,29 @@ public class Texture : IDisposable private string? _tmpPath; + public void PathSelectBox( string label, string tooltip, IEnumerable paths ) + { + ImGui.SetNextItemWidth( -0.0001f ); + var startPath = Path.Length > 0 ? Path : "Choose a modded texture here..."; + using var combo = ImRaii.Combo( label, startPath ); + if( combo ) + { + foreach( var (path, idx) in paths.WithIndex() ) + { + using var id = ImRaii.PushId( idx ); + if( ImGui.Selectable( path, path == startPath ) && path != startPath ) + { + Load( path ); + } + } + } + ImGuiUtil.HoverTooltip( tooltip ); + } + public void PathInputBox( string label, string hint, string tooltip, string startPath, FileDialogManager manager ) { _tmpPath ??= Path; - using var spacing = ImRaii.PushStyle( ImGuiStyleVar.ItemSpacing, new Vector2( 3 * ImGuiHelpers.GlobalScale, 0 ) ); + using var spacing = ImRaii.PushStyle( ImGuiStyleVar.ItemSpacing, new Vector2( 3 * ImGuiHelpers.GlobalScale, ImGui.GetStyle().ItemSpacing.Y ) ); ImGui.SetNextItemWidth( -ImGui.GetFrameHeight() - 3 * ImGuiHelpers.GlobalScale ); ImGui.InputTextWithHint( label, hint, ref _tmpPath, Utf8GamePath.MaxGamePathLength ); if( ImGui.IsItemDeactivatedAfterEdit() ) diff --git a/Penumbra/Mods/Editor/Mod.Editor.Files.cs b/Penumbra/Mods/Editor/Mod.Editor.Files.cs index 480261ee..4263b83f 100644 --- a/Penumbra/Mods/Editor/Mod.Editor.Files.cs +++ b/Penumbra/Mods/Editor/Mod.Editor.Files.cs @@ -40,7 +40,7 @@ public partial class Mod public bool Equals( FileRegistry? other ) { - if( ReferenceEquals( null, other ) ) + if( other is null ) { return false; } @@ -50,7 +50,7 @@ public partial class Mod public override bool Equals( object? obj ) { - if( ReferenceEquals( null, obj ) ) + if( obj is null ) { return false; } @@ -75,6 +75,7 @@ public partial class Mod private List< FileRegistry > _availableFiles = null!; private List< FileRegistry > _mtrlFiles = null!; private List< FileRegistry > _mdlFiles = null!; + private List _texFiles = null!; private readonly HashSet< Utf8GamePath > _usedPaths = new(); // All paths that are used in @@ -89,6 +90,9 @@ public partial class Mod public IReadOnlyList< FileRegistry > MdlFiles => _mdlFiles; + public IReadOnlyList TexFiles + => _texFiles; + // Remove all path redirections where the pointed-to file does not exist. public void RemoveMissingPaths() { @@ -130,6 +134,7 @@ public partial class Mod _usedPaths.Clear(); _mtrlFiles = _availableFiles.Where( f => f.File.FullName.EndsWith( ".mtrl", StringComparison.OrdinalIgnoreCase ) ).ToList(); _mdlFiles = _availableFiles.Where( f => f.File.FullName.EndsWith( ".mdl", StringComparison.OrdinalIgnoreCase ) ).ToList(); + _texFiles = _availableFiles.Where( f => f.File.FullName.EndsWith( ".tex", StringComparison.OrdinalIgnoreCase ) ).ToList(); FileChanges = false; foreach( var subMod in _mod.AllSubMods ) { diff --git a/Penumbra/UI/Classes/ModEditWindow.Textures.cs b/Penumbra/UI/Classes/ModEditWindow.Textures.cs index b74aef07..49e541e5 100644 --- a/Penumbra/UI/Classes/ModEditWindow.Textures.cs +++ b/Penumbra/UI/Classes/ModEditWindow.Textures.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Linq; using System.Numerics; using Dalamud.Interface.ImGuiFileDialog; using ImGuiNET; @@ -34,6 +35,9 @@ public partial class ModEditWindow tex.PathInputBox( "##input", "Import Image...", "Can import game paths as well as your own files.", _mod!.ModPath.FullName, _dialogManager ); + var files = _editor!.TexFiles.Select( f => f.File.FullName ) + .Concat( _editor.TexFiles.SelectMany( f => f.SubModUsage.Select( p => p.Item2.ToString() ) ) ); + tex.PathSelectBox( "##combo", "Select the textures included in this mod on your drive or the ones they replace from the game files.", files); if( tex == _left ) {