mirror of
https://github.com/xivdev/Penumbra.git
synced 2026-01-02 13:53:42 +01:00
Add local data, favorites and tags.
This commit is contained in:
parent
b9662e39a9
commit
ccfc05f2b2
19 changed files with 481 additions and 94 deletions
|
|
@ -58,6 +58,7 @@ public partial class Mod
|
|||
return;
|
||||
}
|
||||
|
||||
MoveDataFile( oldDirectory, BasePath );
|
||||
new ModBackup( mod ).Move( null, dir.Name );
|
||||
|
||||
dir.Refresh();
|
||||
|
|
@ -69,9 +70,9 @@ public partial class Mod
|
|||
}
|
||||
|
||||
ModPathChanged.Invoke( ModPathChangeType.Moved, mod, oldDirectory, BasePath );
|
||||
if( metaChange != MetaChangeType.None )
|
||||
if( metaChange != ModDataChangeType.None )
|
||||
{
|
||||
ModMetaChanged?.Invoke( metaChange, mod, oldName );
|
||||
ModDataChanged?.Invoke( metaChange, mod, oldName );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -94,9 +95,9 @@ public partial class Mod
|
|||
}
|
||||
|
||||
ModPathChanged.Invoke( ModPathChangeType.Reloaded, mod, mod.ModPath, mod.ModPath );
|
||||
if( metaChange != MetaChangeType.None )
|
||||
if( metaChange != ModDataChangeType.None )
|
||||
{
|
||||
ModMetaChanged?.Invoke( metaChange, mod, oldName );
|
||||
ModDataChanged?.Invoke( metaChange, mod, oldName );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -211,6 +212,13 @@ public partial class Mod
|
|||
break;
|
||||
case ModPathChangeType.Deleted:
|
||||
NewMods.Remove( mod );
|
||||
break;
|
||||
case ModPathChangeType.Moved:
|
||||
if( oldDirectory != null && newDirectory != null )
|
||||
{
|
||||
MoveDataFile( oldDirectory, newDirectory );
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
75
Penumbra/Mods/Manager/Mod.Manager.Local.cs
Normal file
75
Penumbra/Mods/Manager/Mod.Manager.Local.cs
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using ImGuiScene;
|
||||
|
||||
namespace Penumbra.Mods;
|
||||
|
||||
public sealed partial class Mod
|
||||
{
|
||||
public partial class Manager
|
||||
{
|
||||
public void ChangeModFavorite( Index idx, bool state )
|
||||
{
|
||||
var mod = this[ idx ];
|
||||
if( mod.Favorite != state )
|
||||
{
|
||||
mod.Favorite = state;
|
||||
mod.SaveLocalData();
|
||||
ModDataChanged?.Invoke( ModDataChangeType.Favorite, mod, null );
|
||||
}
|
||||
}
|
||||
|
||||
public void ChangeModNote( Index idx, string newNote )
|
||||
{
|
||||
var mod = this[ idx ];
|
||||
if( mod.Note != newNote )
|
||||
{
|
||||
mod.Note = newNote;
|
||||
mod.SaveLocalData();
|
||||
ModDataChanged?.Invoke( ModDataChangeType.Favorite, mod, null );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void ChangeTag( Index idx, int tagIdx, string newTag, bool local )
|
||||
{
|
||||
var mod = this[ idx ];
|
||||
var which = local ? mod.LocalTags : mod.ModTags;
|
||||
if( tagIdx < 0 || tagIdx > which.Count )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ModDataChangeType flags = 0;
|
||||
if( tagIdx == which.Count )
|
||||
{
|
||||
flags = mod.UpdateTags( local ? null : which.Append( newTag ), local ? which.Append( newTag ) : null );
|
||||
}
|
||||
else
|
||||
{
|
||||
var tmp = which.ToArray();
|
||||
tmp[ tagIdx ] = newTag;
|
||||
flags = mod.UpdateTags( local ? null : tmp, local ? tmp : null );
|
||||
}
|
||||
|
||||
if( flags.HasFlag( ModDataChangeType.ModTags ) )
|
||||
{
|
||||
mod.SaveMeta();
|
||||
}
|
||||
|
||||
if( flags.HasFlag( ModDataChangeType.LocalTags ) )
|
||||
{
|
||||
mod.SaveLocalData();
|
||||
}
|
||||
|
||||
if( flags != 0 )
|
||||
{
|
||||
ModDataChanged?.Invoke( flags, mod, null );
|
||||
}
|
||||
}
|
||||
|
||||
public void ChangeLocalTag( Index idx, int tagIdx, string newTag )
|
||||
=> ChangeTag( idx, tagIdx, newTag, true );
|
||||
}
|
||||
}
|
||||
|
|
@ -6,8 +6,8 @@ public sealed partial class Mod
|
|||
{
|
||||
public partial class Manager
|
||||
{
|
||||
public delegate void ModMetaChangeDelegate( MetaChangeType type, Mod mod, string? oldName );
|
||||
public event ModMetaChangeDelegate? ModMetaChanged;
|
||||
public delegate void ModDataChangeDelegate( ModDataChangeType type, Mod mod, string? oldName );
|
||||
public event ModDataChangeDelegate? ModDataChanged;
|
||||
|
||||
public void ChangeModName( Index idx, string newName )
|
||||
{
|
||||
|
|
@ -17,7 +17,7 @@ public sealed partial class Mod
|
|||
var oldName = mod.Name;
|
||||
mod.Name = newName;
|
||||
mod.SaveMeta();
|
||||
ModMetaChanged?.Invoke( MetaChangeType.Name, mod, oldName.Text );
|
||||
ModDataChanged?.Invoke( ModDataChangeType.Name, mod, oldName.Text );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -28,7 +28,7 @@ public sealed partial class Mod
|
|||
{
|
||||
mod.Author = newAuthor;
|
||||
mod.SaveMeta();
|
||||
ModMetaChanged?.Invoke( MetaChangeType.Author, mod, null );
|
||||
ModDataChanged?.Invoke( ModDataChangeType.Author, mod, null );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -39,7 +39,7 @@ public sealed partial class Mod
|
|||
{
|
||||
mod.Description = newDescription;
|
||||
mod.SaveMeta();
|
||||
ModMetaChanged?.Invoke( MetaChangeType.Description, mod, null );
|
||||
ModDataChanged?.Invoke( ModDataChangeType.Description, mod, null );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -50,7 +50,7 @@ public sealed partial class Mod
|
|||
{
|
||||
mod.Version = newVersion;
|
||||
mod.SaveMeta();
|
||||
ModMetaChanged?.Invoke( MetaChangeType.Version, mod, null );
|
||||
ModDataChanged?.Invoke( ModDataChangeType.Version, mod, null );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -61,8 +61,11 @@ public sealed partial class Mod
|
|||
{
|
||||
mod.Website = newWebsite;
|
||||
mod.SaveMeta();
|
||||
ModMetaChanged?.Invoke( MetaChangeType.Website, mod, null );
|
||||
ModDataChanged?.Invoke( ModDataChangeType.Website, mod, null );
|
||||
}
|
||||
}
|
||||
|
||||
public void ChangeModTag( Index idx, int tagIdx, string newTag )
|
||||
=> ChangeTag( idx, tagIdx, newTag, false );
|
||||
}
|
||||
}
|
||||
|
|
@ -47,21 +47,23 @@ public partial class Mod
|
|||
return mod;
|
||||
}
|
||||
|
||||
private bool Reload( bool incorporateMetaChanges, out MetaChangeType metaChange )
|
||||
private bool Reload( bool incorporateMetaChanges, out ModDataChangeType modDataChange )
|
||||
{
|
||||
metaChange = MetaChangeType.Deletion;
|
||||
modDataChange = ModDataChangeType.Deletion;
|
||||
ModPath.Refresh();
|
||||
if( !ModPath.Exists )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
metaChange = LoadMeta();
|
||||
if( metaChange.HasFlag( MetaChangeType.Deletion ) || Name.Length == 0 )
|
||||
modDataChange = LoadMeta();
|
||||
if( modDataChange.HasFlag( ModDataChangeType.Deletion ) || Name.Length == 0 )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
LoadLocalData();
|
||||
|
||||
LoadDefaultOption();
|
||||
LoadAllGroups();
|
||||
if( incorporateMetaChanges )
|
||||
|
|
|
|||
167
Penumbra/Mods/Mod.LocalData.cs
Normal file
167
Penumbra/Mods/Mod.LocalData.cs
Normal file
|
|
@ -0,0 +1,167 @@
|
|||
using Newtonsoft.Json.Linq;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Penumbra.Mods;
|
||||
|
||||
public sealed partial class Mod
|
||||
{
|
||||
public static DirectoryInfo LocalDataDirectory
|
||||
=> new(Path.Combine( Dalamud.PluginInterface.ConfigDirectory.FullName, "mod_data" ));
|
||||
|
||||
public long ImportDate { get; private set; } = DateTimeOffset.UnixEpoch.ToUnixTimeMilliseconds();
|
||||
|
||||
public IReadOnlyList< string > LocalTags { get; private set; } = Array.Empty< string >();
|
||||
|
||||
public string AllTagsLower { get; private set; } = string.Empty;
|
||||
public string Note { get; private set; } = string.Empty;
|
||||
public bool Favorite { get; private set; } = false;
|
||||
|
||||
private FileInfo LocalDataFile
|
||||
=> new(Path.Combine( Dalamud.PluginInterface.ConfigDirectory.FullName, "mod_data", $"{ModPath.Name}.json" ));
|
||||
|
||||
private ModDataChangeType LoadLocalData()
|
||||
{
|
||||
var dataFile = LocalDataFile;
|
||||
|
||||
var importDate = 0L;
|
||||
var localTags = Enumerable.Empty< string >();
|
||||
var favorite = false;
|
||||
var note = string.Empty;
|
||||
|
||||
var save = true;
|
||||
if( File.Exists( dataFile.FullName ) )
|
||||
{
|
||||
save = false;
|
||||
try
|
||||
{
|
||||
var text = File.ReadAllText( dataFile.FullName );
|
||||
var json = JObject.Parse( text );
|
||||
|
||||
importDate = json[ nameof( ImportDate ) ]?.Value< long >() ?? importDate;
|
||||
favorite = json[ nameof( Favorite ) ]?.Value< bool >() ?? favorite;
|
||||
note = json[ nameof( Note ) ]?.Value< string >() ?? note;
|
||||
localTags = json[ nameof( LocalTags ) ]?.Values< string >().OfType< string >() ?? localTags;
|
||||
}
|
||||
catch( Exception e )
|
||||
{
|
||||
Penumbra.Log.Error( $"Could not load local mod data:\n{e}" );
|
||||
}
|
||||
}
|
||||
|
||||
if( importDate == 0 )
|
||||
{
|
||||
importDate = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
|
||||
}
|
||||
|
||||
ModDataChangeType changes = 0;
|
||||
if( ImportDate != importDate )
|
||||
{
|
||||
ImportDate = importDate;
|
||||
changes |= ModDataChangeType.ImportDate;
|
||||
}
|
||||
|
||||
changes |= UpdateTags( null, localTags );
|
||||
|
||||
if( Favorite != favorite )
|
||||
{
|
||||
Favorite = favorite;
|
||||
changes |= ModDataChangeType.Favorite;
|
||||
}
|
||||
|
||||
if( Note != note )
|
||||
{
|
||||
Note = note;
|
||||
changes |= ModDataChangeType.Note;
|
||||
}
|
||||
|
||||
if( save )
|
||||
{
|
||||
SaveLocalDataFile();
|
||||
}
|
||||
|
||||
return changes;
|
||||
}
|
||||
|
||||
private void SaveLocalData()
|
||||
=> Penumbra.Framework.RegisterDelayed( nameof( SaveLocalData ) + ModPath.Name, SaveLocalDataFile );
|
||||
|
||||
private void SaveLocalDataFile()
|
||||
{
|
||||
var dataFile = LocalDataFile;
|
||||
try
|
||||
{
|
||||
var jObject = new JObject
|
||||
{
|
||||
{ nameof( FileVersion ), JToken.FromObject( FileVersion ) },
|
||||
{ nameof( ImportDate ), JToken.FromObject( ImportDate ) },
|
||||
{ nameof( LocalTags ), JToken.FromObject( LocalTags ) },
|
||||
{ nameof( Note ), JToken.FromObject( Note ) },
|
||||
{ nameof( Favorite ), JToken.FromObject( Favorite ) },
|
||||
};
|
||||
dataFile.Directory!.Create();
|
||||
File.WriteAllText( dataFile.FullName, jObject.ToString( Formatting.Indented ) );
|
||||
}
|
||||
catch( Exception e )
|
||||
{
|
||||
Penumbra.Log.Error( $"Could not write local data file for mod {Name} to {dataFile.FullName}:\n{e}" );
|
||||
}
|
||||
}
|
||||
|
||||
private static void MoveDataFile( DirectoryInfo oldMod, DirectoryInfo newMod )
|
||||
{
|
||||
var oldFile = Path.Combine( Dalamud.PluginInterface.ConfigDirectory.FullName, "mod_data", $"{oldMod.Name}.json" );
|
||||
var newFile = Path.Combine( Dalamud.PluginInterface.ConfigDirectory.FullName, "mod_data", $"{newMod.Name}.json" );
|
||||
if( File.Exists( oldFile ) )
|
||||
{
|
||||
try
|
||||
{
|
||||
File.Move( oldFile, newFile, true );
|
||||
}
|
||||
catch( Exception e )
|
||||
{
|
||||
Penumbra.Log.Error( $"Could not move local data file {oldFile} to {newFile}:\n{e}" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private ModDataChangeType UpdateTags( IEnumerable< string >? newModTags, IEnumerable< string >? newLocalTags )
|
||||
{
|
||||
if( newModTags == null && newLocalTags == null )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
ModDataChangeType type = 0;
|
||||
if( newModTags != null )
|
||||
{
|
||||
var modTags = newModTags.Where( t => t.Length > 0 ).Distinct().ToArray();
|
||||
if( !modTags.SequenceEqual( ModTags ) )
|
||||
{
|
||||
newLocalTags ??= LocalTags;
|
||||
ModTags = modTags;
|
||||
type |= ModDataChangeType.ModTags;
|
||||
}
|
||||
}
|
||||
|
||||
if( newLocalTags != null )
|
||||
{
|
||||
var localTags = newLocalTags!.Where( t => t.Length > 0 && !ModTags.Contains( t ) ).Distinct().ToArray();
|
||||
if( !localTags.SequenceEqual( LocalTags ) )
|
||||
{
|
||||
LocalTags = localTags;
|
||||
type |= ModDataChangeType.LocalTags;
|
||||
}
|
||||
}
|
||||
|
||||
if( type != 0 )
|
||||
{
|
||||
AllTagsLower = string.Join( '\0', ModTags.Concat( LocalTags ).Select( s => s.ToLowerInvariant() ) );
|
||||
}
|
||||
|
||||
return type;
|
||||
}
|
||||
}
|
||||
|
|
@ -16,7 +16,20 @@ public sealed partial class Mod
|
|||
private static class Migration
|
||||
{
|
||||
public static bool Migrate( Mod mod, JObject json )
|
||||
=> MigrateV0ToV1( mod, json ) || MigrateV1ToV2( mod );
|
||||
=> MigrateV0ToV1( mod, json ) || MigrateV1ToV2( mod ) || MigrateV2ToV3( mod );
|
||||
|
||||
private static bool MigrateV2ToV3( Mod mod )
|
||||
{
|
||||
if( mod.FileVersion > 2 )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Remove import time.
|
||||
mod.FileVersion = 3;
|
||||
mod.SaveMeta();
|
||||
return true;
|
||||
}
|
||||
|
||||
private static bool MigrateV1ToV2( Mod mod )
|
||||
{
|
||||
|
|
@ -56,8 +69,8 @@ public sealed partial class Mod
|
|||
|
||||
var swaps = json[ "FileSwaps" ]?.ToObject< Dictionary< Utf8GamePath, FullPath > >()
|
||||
?? new Dictionary< Utf8GamePath, FullPath >();
|
||||
var groups = json[ "Groups" ]?.ToObject< Dictionary< string, OptionGroupV0 > >() ?? new Dictionary< string, OptionGroupV0 >();
|
||||
var priority = 1;
|
||||
var groups = json[ "Groups" ]?.ToObject< Dictionary< string, OptionGroupV0 > >() ?? new Dictionary< string, OptionGroupV0 >();
|
||||
var priority = 1;
|
||||
var seenMetaFiles = new HashSet< FullPath >();
|
||||
foreach( var group in groups.Values )
|
||||
{
|
||||
|
|
@ -187,7 +200,7 @@ public sealed partial class Mod
|
|||
|
||||
private static SubMod SubModFromOption( Mod mod, OptionV0 option, HashSet< FullPath > seenMetaFiles )
|
||||
{
|
||||
var subMod = new SubMod(mod) { Name = option.OptionName };
|
||||
var subMod = new SubMod( mod ) { Name = option.OptionName };
|
||||
AddFilesToSubMod( subMod, mod.ModPath, option, seenMetaFiles );
|
||||
subMod.IncorporateMetaChanges( mod.ModPath, false );
|
||||
return subMod;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using OtterGui.Classes;
|
||||
|
|
@ -7,17 +9,21 @@ using OtterGui.Classes;
|
|||
namespace Penumbra.Mods;
|
||||
|
||||
[Flags]
|
||||
public enum MetaChangeType : ushort
|
||||
public enum ModDataChangeType : ushort
|
||||
{
|
||||
None = 0x00,
|
||||
Name = 0x01,
|
||||
Author = 0x02,
|
||||
Description = 0x04,
|
||||
Version = 0x08,
|
||||
Website = 0x10,
|
||||
Deletion = 0x20,
|
||||
Migration = 0x40,
|
||||
ImportDate = 0x80,
|
||||
None = 0x0000,
|
||||
Name = 0x0001,
|
||||
Author = 0x0002,
|
||||
Description = 0x0004,
|
||||
Version = 0x0008,
|
||||
Website = 0x0010,
|
||||
Deletion = 0x0020,
|
||||
Migration = 0x0040,
|
||||
ModTags = 0x0080,
|
||||
ImportDate = 0x0100,
|
||||
Favorite = 0x0200,
|
||||
LocalTags = 0x0400,
|
||||
Note = 0x0800,
|
||||
}
|
||||
|
||||
public sealed partial class Mod
|
||||
|
|
@ -29,25 +35,25 @@ public sealed partial class Mod
|
|||
Priority = int.MaxValue,
|
||||
};
|
||||
|
||||
public const uint CurrentFileVersion = 1;
|
||||
public const uint CurrentFileVersion = 3;
|
||||
public uint FileVersion { get; private set; } = CurrentFileVersion;
|
||||
public LowerString Name { get; private set; } = "New Mod";
|
||||
public LowerString Author { get; private set; } = LowerString.Empty;
|
||||
public string Description { get; private set; } = string.Empty;
|
||||
public string Version { get; private set; } = string.Empty;
|
||||
public string Website { get; private set; } = string.Empty;
|
||||
public long ImportDate { get; private set; } = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
|
||||
public IReadOnlyList< string > ModTags { get; private set; } = Array.Empty< string >();
|
||||
|
||||
internal FileInfo MetaFile
|
||||
=> new(Path.Combine( ModPath.FullName, "meta.json" ));
|
||||
|
||||
private MetaChangeType LoadMeta()
|
||||
private ModDataChangeType LoadMeta()
|
||||
{
|
||||
var metaFile = MetaFile;
|
||||
if( !File.Exists( metaFile.FullName ) )
|
||||
{
|
||||
Penumbra.Log.Debug( $"No mod meta found for {ModPath.Name}." );
|
||||
return MetaChangeType.Deletion;
|
||||
return ModDataChangeType.Deletion;
|
||||
}
|
||||
|
||||
try
|
||||
|
|
@ -61,36 +67,37 @@ public sealed partial class Mod
|
|||
var newVersion = json[ nameof( Version ) ]?.Value< string >() ?? string.Empty;
|
||||
var newWebsite = json[ nameof( Website ) ]?.Value< string >() ?? string.Empty;
|
||||
var newFileVersion = json[ nameof( FileVersion ) ]?.Value< uint >() ?? 0;
|
||||
var importDate = json[ nameof( ImportDate ) ]?.Value< long >() ?? DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
|
||||
var importDate = json[ nameof( ImportDate ) ]?.Value< long >();
|
||||
var modTags = json[ nameof( ModTags ) ]?.Values< string >().OfType< string >();
|
||||
|
||||
MetaChangeType changes = 0;
|
||||
ModDataChangeType changes = 0;
|
||||
if( Name != newName )
|
||||
{
|
||||
changes |= MetaChangeType.Name;
|
||||
changes |= ModDataChangeType.Name;
|
||||
Name = newName;
|
||||
}
|
||||
|
||||
if( Author != newAuthor )
|
||||
{
|
||||
changes |= MetaChangeType.Author;
|
||||
changes |= ModDataChangeType.Author;
|
||||
Author = newAuthor;
|
||||
}
|
||||
|
||||
if( Description != newDescription )
|
||||
{
|
||||
changes |= MetaChangeType.Description;
|
||||
changes |= ModDataChangeType.Description;
|
||||
Description = newDescription;
|
||||
}
|
||||
|
||||
if( Version != newVersion )
|
||||
{
|
||||
changes |= MetaChangeType.Version;
|
||||
changes |= ModDataChangeType.Version;
|
||||
Version = newVersion;
|
||||
}
|
||||
|
||||
if( Website != newWebsite )
|
||||
{
|
||||
changes |= MetaChangeType.Website;
|
||||
changes |= ModDataChangeType.Website;
|
||||
Website = newWebsite;
|
||||
}
|
||||
|
||||
|
|
@ -99,22 +106,24 @@ public sealed partial class Mod
|
|||
FileVersion = newFileVersion;
|
||||
if( Migration.Migrate( this, json ) )
|
||||
{
|
||||
changes |= MetaChangeType.Migration;
|
||||
changes |= ModDataChangeType.Migration;
|
||||
}
|
||||
}
|
||||
|
||||
if( ImportDate != importDate )
|
||||
if( importDate != null && ImportDate != importDate.Value )
|
||||
{
|
||||
ImportDate = importDate;
|
||||
changes |= MetaChangeType.ImportDate;
|
||||
ImportDate = importDate.Value;
|
||||
changes |= ModDataChangeType.ImportDate;
|
||||
}
|
||||
|
||||
changes |= UpdateTags( modTags, null );
|
||||
|
||||
return changes;
|
||||
}
|
||||
catch( Exception e )
|
||||
{
|
||||
Penumbra.Log.Error( $"Could not load mod meta:\n{e}" );
|
||||
return MetaChangeType.Deletion;
|
||||
return ModDataChangeType.Deletion;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -134,7 +143,7 @@ public sealed partial class Mod
|
|||
{ nameof( Description ), JToken.FromObject( Description ) },
|
||||
{ nameof( Version ), JToken.FromObject( Version ) },
|
||||
{ nameof( Website ), JToken.FromObject( Website ) },
|
||||
{ nameof( ImportDate ), JToken.FromObject( ImportDate ) },
|
||||
{ nameof( ModTags ), JToken.FromObject( ModTags ) },
|
||||
};
|
||||
File.WriteAllText( metaFile.FullName, jObject.ToString( Formatting.Indented ) );
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ public sealed class ModFileSystem : FileSystem< Mod >, IDisposable
|
|||
|
||||
ret.Changed += ret.OnChange;
|
||||
Penumbra.ModManager.ModDiscoveryFinished += ret.Reload;
|
||||
Penumbra.ModManager.ModMetaChanged += ret.OnMetaChange;
|
||||
Penumbra.ModManager.ModDataChanged += ret.OnDataChange;
|
||||
Penumbra.ModManager.ModPathChanged += ret.OnModPathChange;
|
||||
|
||||
return ret;
|
||||
|
|
@ -43,7 +43,7 @@ public sealed class ModFileSystem : FileSystem< Mod >, IDisposable
|
|||
{
|
||||
Penumbra.ModManager.ModPathChanged -= OnModPathChange;
|
||||
Penumbra.ModManager.ModDiscoveryFinished -= Reload;
|
||||
Penumbra.ModManager.ModMetaChanged -= OnMetaChange;
|
||||
Penumbra.ModManager.ModDataChanged -= OnDataChange;
|
||||
}
|
||||
|
||||
public struct ImportDate : ISortMode< Mod >
|
||||
|
|
@ -92,9 +92,9 @@ public sealed class ModFileSystem : FileSystem< Mod >, IDisposable
|
|||
}
|
||||
|
||||
// Update sort order when defaulted mod names change.
|
||||
private void OnMetaChange( MetaChangeType type, Mod mod, string? oldName )
|
||||
private void OnDataChange( ModDataChangeType type, Mod mod, string? oldName )
|
||||
{
|
||||
if( type.HasFlag( MetaChangeType.Name ) && oldName != null )
|
||||
if( type.HasFlag( ModDataChangeType.Name ) && oldName != null )
|
||||
{
|
||||
var old = oldName.FixName();
|
||||
if( Find( old, out var child ) && child is not Folder )
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue