diff --git a/OtterGui b/OtterGui index 2539675a..dd26a7f4 160000 --- a/OtterGui +++ b/OtterGui @@ -1 +1 @@ -Subproject commit 2539675a1bff56088ea7be1f6ad9da2f20115032 +Subproject commit dd26a7f416106a5bed4ea68c500dfcd5c0818d59 diff --git a/Penumbra.GameData/ByteString/FullPath.cs b/Penumbra.GameData/ByteString/FullPath.cs index 5ccf71c2..1d13e969 100644 --- a/Penumbra.GameData/ByteString/FullPath.cs +++ b/Penumbra.GameData/ByteString/FullPath.cs @@ -13,7 +13,7 @@ public readonly struct FullPath : IComparable, IEquatable< FullPath > public readonly Utf8String InternalName; public readonly ulong Crc64; - public static readonly FullPath Empty = new(string.Empty); + public static readonly FullPath Empty = new(string.Empty); public FullPath( DirectoryInfo baseDir, Utf8RelPath relPath ) : this( Path.Combine( baseDir.FullName, relPath.ToString() ) ) @@ -71,9 +71,9 @@ public readonly struct FullPath : IComparable, IEquatable< FullPath > public int CompareTo( object? obj ) => obj switch { - FullPath p => InternalName.CompareTo( p.InternalName ), + FullPath p => InternalName?.CompareTo( p.InternalName ) ?? -1, FileInfo f => string.Compare( FullName, f.FullName, StringComparison.InvariantCultureIgnoreCase ), - Utf8String u => InternalName.CompareTo( u ), + Utf8String u => InternalName?.CompareTo( u ) ?? -1, string s => string.Compare( FullName, s, StringComparison.InvariantCultureIgnoreCase ), _ => -1, }; diff --git a/Penumbra/Mods/ModFileSystem.cs b/Penumbra/Mods/ModFileSystem.cs index f748dc90..8f6a61a3 100644 --- a/Penumbra/Mods/ModFileSystem.cs +++ b/Penumbra/Mods/ModFileSystem.cs @@ -68,7 +68,7 @@ public sealed class ModFileSystem : FileSystem< Mod >, IDisposable if( type.HasFlag( MetaChangeType.Name ) && oldName != null ) { var old = oldName.FixName(); - if( Find( old, out var child ) ) + if( Find( old, out var child ) && child is not Folder) { Rename( child, mod.Name.Text ); } @@ -117,7 +117,7 @@ public sealed class ModFileSystem : FileSystem< Mod >, IDisposable private static (string, bool) SaveMod( Mod mod, string fullPath ) { - var regex = new Regex( $@"^{Regex.Escape( ModToName( mod ) )}( \(\d+\))?" ); + var regex = new Regex( $@"^{Regex.Escape( ModToName( mod ) )}( \(\d+\))?$" ); // Only save pairs with non-default paths. if( regex.IsMatch( fullPath ) ) { diff --git a/Penumbra/UI/ConfigWindow.ModPanel.Edit.cs b/Penumbra/UI/ConfigWindow.ModPanel.Edit.cs index 7c149d19..365f3308 100644 --- a/Penumbra/UI/ConfigWindow.ModPanel.Edit.cs +++ b/Penumbra/UI/ConfigWindow.ModPanel.Edit.cs @@ -5,6 +5,7 @@ using System.IO; using System.Numerics; using Dalamud.Interface; using Dalamud.Interface.Components; +using Dalamud.Logging; using Dalamud.Memory; using ImGuiNET; using OtterGui; @@ -45,7 +46,14 @@ public partial class ConfigWindow if( Input.Text( "Mod Path", Input.Path, Input.None, _leaf.FullName(), out var newPath, 256, _window._inputTextWidth.X ) ) { - _window._penumbra.ModFileSystem.RenameAndMove( _leaf, newPath ); + try + { + _window._penumbra.ModFileSystem.RenameAndMove( _leaf, newPath ); + } + catch( Exception e ) + { + PluginLog.Warning( e.Message ); + } } ImGui.Dummy( _window._defaultSpace ); @@ -138,6 +146,7 @@ public partial class ConfigWindow _window.ModEditPopup.ChangeOption( -1, 0 ); _window.ModEditPopup.IsOpen = true; } + ImGui.SameLine(); fileExists = File.Exists( _mod.DefaultFile ); tt = fileExists