diff --git a/Penumbra/Importer/TexToolsImport.cs b/Penumbra/Importer/TexToolsImport.cs index ae69bd95..ca6a1fc3 100644 --- a/Penumbra/Importer/TexToolsImport.cs +++ b/Penumbra/Importer/TexToolsImport.cs @@ -50,11 +50,8 @@ namespace Penumbra.Importer _resolvedTempFilePath = Path.Combine( _outDirectory.FullName, TempFileName ); } - private static string ReplaceBadXivSymbols( string source ) - => source.ReplaceInvalidPathSymbols().RemoveNonAsciiSymbols(); - private static DirectoryInfo NewOptionDirectory( DirectoryInfo baseDir, string optionName ) - => new( Path.Combine( baseDir.FullName, ReplaceBadXivSymbols( optionName ) ) ); + => new( Path.Combine( baseDir.FullName, optionName.ReplaceBadXivSymbols() ) ); public void ImportModPack( FileInfo modPackFile ) { @@ -197,7 +194,12 @@ namespace Penumbra.Importer public static DirectoryInfo CreateModFolder( DirectoryInfo outDirectory, string modListName ) { - var newModFolderBase = NewOptionDirectory( outDirectory, Path.GetFileName( modListName ) ); + var name = Path.GetFileName( modListName ); + if( !name.Any() ) + { + name = "_"; + } + var newModFolderBase = NewOptionDirectory( outDirectory, name ); var newModFolder = newModFolderBase; var i = 2; while( newModFolder.Exists && i < 12 ) diff --git a/Penumbra/Meta/MetaManager.cs b/Penumbra/Meta/MetaManager.cs index e4d044e2..46780430 100644 --- a/Penumbra/Meta/MetaManager.cs +++ b/Penumbra/Meta/MetaManager.cs @@ -123,7 +123,7 @@ namespace Penumbra.Meta _resolvedFiles = resolvedFiles; _default = Service< MetaDefaults >.Get(); _resourceManagement = Service< GameResourceManagement >.Get(); - _dir = new DirectoryInfo( Path.Combine( modDir.FullName, TmpDirectory, name.ReplaceInvalidPathSymbols().RemoveNonAsciiSymbols() ) ); + _dir = new DirectoryInfo( Path.Combine( modDir.FullName, TmpDirectory, name.ReplaceBadXivSymbols() ) ); ClearDirectory(); } diff --git a/Penumbra/Mod/ModData.cs b/Penumbra/Mod/ModData.cs index 8efe3f9d..013bc459 100644 --- a/Penumbra/Mod/ModData.cs +++ b/Penumbra/Mod/ModData.cs @@ -25,7 +25,7 @@ namespace Penumbra.Mod Meta = meta; Resources = resources; MetaFile = MetaFileInfo( basePath ); - SortOrder = meta.Name; + SortOrder = meta.Name.Replace( '/', '\\' ); ComputeChangedItems(); } diff --git a/Penumbra/Mods/ModManager.cs b/Penumbra/Mods/ModManager.cs index f78d62d2..606bd2f7 100644 --- a/Penumbra/Mods/ModManager.cs +++ b/Penumbra/Mods/ModManager.cs @@ -138,6 +138,11 @@ namespace Penumbra.Mods return false; } + if( Config.ModSortOrder.TryGetValue( mod.BasePath.Name, out var sortOrder ) ) + { + mod.SortOrder = sortOrder; + } + if( Mods.ContainsKey( modFolder.Name ) ) { return false; @@ -166,6 +171,14 @@ namespace Penumbra.Mods if( metaChanges || fileChanges.HasFlag( ResourceChange.Files ) ) { mod.ComputeChangedItems(); + if( Config.ModSortOrder.TryGetValue( mod.BasePath.Name, out var sortOrder ) ) + { + mod.SortOrder = sortOrder; + } + else + { + mod.SortOrder = mod.Meta.Name.Replace( '/', '\\' ); + } } var nameChange = !string.Equals( oldName, mod.Meta.Name, StringComparison.InvariantCulture ); diff --git a/Penumbra/Mods/ModManagerEditExtensions.cs b/Penumbra/Mods/ModManagerEditExtensions.cs index a1b97345..c3fd1efe 100644 --- a/Penumbra/Mods/ModManagerEditExtensions.cs +++ b/Penumbra/Mods/ModManagerEditExtensions.cs @@ -39,9 +39,10 @@ namespace Penumbra.Mods return false; } - if( newSortOrder == string.Empty || newSortOrder == mod.Meta.Name ) + var modName = mod.Meta.Name.Replace( '/', '\\' ); + if( newSortOrder == string.Empty || newSortOrder == modName ) { - mod.SortOrder = mod.Meta.Name; + mod.SortOrder = modName; manager.Config.ModSortOrder.Remove( mod.BasePath.Name ); } else diff --git a/Penumbra/UI/MenuTabs/TabInstalled/TabInstalledModPanel.cs b/Penumbra/UI/MenuTabs/TabInstalled/TabInstalledModPanel.cs index 4e2ed774..8b3a3ad3 100644 --- a/Penumbra/UI/MenuTabs/TabInstalled/TabInstalledModPanel.cs +++ b/Penumbra/UI/MenuTabs/TabInstalled/TabInstalledModPanel.cs @@ -254,7 +254,8 @@ namespace Penumbra.UI private void DrawOpenModFolderButton() { - if( ImGui.Button( ButtonOpenModFolder ) ) + Mod!.Data.BasePath.Refresh(); + if( ImGui.Button( ButtonOpenModFolder ) && Mod.Data.BasePath.Exists ) { Process.Start( Mod!.Data.BasePath.FullName ); } @@ -270,7 +271,7 @@ namespace Penumbra.UI private void RenameModFolder( string newName ) { - _newName = newName.RemoveNonAsciiSymbols().RemoveInvalidPathSymbols(); + _newName = newName.ReplaceBadXivSymbols(); if( _newName.Length == 0 ) { PluginLog.Debug( "New Directory name {NewName} was empty after removing invalid symbols.", newName ); diff --git a/Penumbra/UI/MenuTabs/TabInstalled/TabInstalledSelector.cs b/Penumbra/UI/MenuTabs/TabInstalled/TabInstalledSelector.cs index 6bb8df03..1f8c1d4c 100644 --- a/Penumbra/UI/MenuTabs/TabInstalled/TabInstalledSelector.cs +++ b/Penumbra/UI/MenuTabs/TabInstalled/TabInstalledSelector.cs @@ -157,7 +157,7 @@ namespace Penumbra.UI var modMeta = new ModMeta { Author = "Unknown", - Name = newName, + Name = newName.Replace('/', '\\'), Description = string.Empty, }; diff --git a/Penumbra/Util/StringPathExtensions.cs b/Penumbra/Util/StringPathExtensions.cs index 9c9f4f5a..1e309cac 100644 --- a/Penumbra/Util/StringPathExtensions.cs +++ b/Penumbra/Util/StringPathExtensions.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.IO; using System.Text; @@ -5,27 +6,60 @@ namespace Penumbra.Util { public static class StringPathExtensions { - private static readonly char[] Invalid = Path.GetInvalidFileNameChars(); + private static readonly HashSet< char > Invalid = new( Path.GetInvalidFileNameChars() ); public static string ReplaceInvalidPathSymbols( this string s, string replacement = "_" ) - => string.Join( replacement, s.Split( Invalid ) ); - - public static string RemoveInvalidPathSymbols( this string s ) - => string.Concat( s.Split( Invalid ) ); - - public static string RemoveNonAsciiSymbols( this string s, string replacement = "_" ) { StringBuilder sb = new( s.Length ); foreach( var c in s ) { - if( c < 128 ) + if( Invalid.Contains( c ) ) { - sb.Append( c ); + sb.Append( replacement ); } else + { + sb.Append( c ); + } + } + + return sb.ToString(); + } + + public static string RemoveInvalidPathSymbols( this string s ) + => string.Concat( s.Split( Path.GetInvalidFileNameChars() ) ); + + public static string ReplaceNonAsciiSymbols( this string s, string replacement = "_" ) + { + StringBuilder sb = new( s.Length ); + foreach( var c in s ) + { + if( c >= 128 ) { sb.Append( replacement ); } + else + { + sb.Append( c ); + } + } + + return sb.ToString(); + } + + public static string ReplaceBadXivSymbols( this string s, string replacement = "_" ) + { + StringBuilder sb = new( s.Length ); + foreach( var c in s ) + { + if( c >= 128 || Invalid.Contains( c ) ) + { + sb.Append( replacement ); + } + else + { + sb.Append( c ); + } } return sb.ToString();