mirror of
https://github.com/xivdev/Penumbra.git
synced 2026-02-21 07:17:53 +01:00
Replace all occurences of ImGuiCol.
This commit is contained in:
parent
a4302c9145
commit
74d35870e2
46 changed files with 1586 additions and 1475 deletions
|
|
@ -54,8 +54,8 @@ public static class FeatureChecker
|
|||
const int numButtons = 5;
|
||||
var innerSpacing = ImGui.GetStyle().ItemInnerSpacing;
|
||||
var size = new Vector2((width - (numButtons - 1) * innerSpacing.X) / numButtons, 0);
|
||||
var buttonColor = ImGui.GetColorU32(ImGuiCol.FrameBg);
|
||||
var textColor = ImGui.GetColorU32(ImGuiCol.TextDisabled);
|
||||
var buttonColor = Im.Style[ImGuiColor.FrameBackground];
|
||||
var textColor = Im.Style[ImGuiColor.TextDisabled];
|
||||
using (var style = ImStyleBorder.Frame.Push(ColorId.FolderLine.Value(), 0)
|
||||
.Push(ImStyleDouble.ItemSpacing, innerSpacing)
|
||||
.Push(ImGuiColor.Button, buttonColor)
|
||||
|
|
|
|||
|
|
@ -7,6 +7,103 @@ using FileSystemChangeType = OtterGui.Filesystem.FileSystemChangeType;
|
|||
|
||||
namespace Penumbra.Mods.Manager;
|
||||
|
||||
//public sealed class ModFileSystem2 : BaseFileSystem
|
||||
//{
|
||||
// private readonly Configuration _config;
|
||||
// private readonly SaveService _saveService;
|
||||
// public ModFileSystem2(FileSystemChanged @event, DataNodePathChange dataChangeEvent, Configuration config, SaveService saveService, IComparer<ReadOnlySpan<char>>? comparer = null)
|
||||
// : base(@event, dataChangeEvent, comparer)
|
||||
// {
|
||||
// _config = config;
|
||||
// _saveService = saveService;
|
||||
// }
|
||||
//
|
||||
// public void Dispose()
|
||||
// {
|
||||
// _communicator.ModPathChanged.Unsubscribe(OnModPathChange);
|
||||
// _communicator.ModDiscoveryFinished.Unsubscribe(Reload);
|
||||
// _communicator.ModDataChanged.Unsubscribe(OnModDataChange);
|
||||
// }
|
||||
//
|
||||
// // Save the filesystem on every filesystem change except full reloading.
|
||||
// private void OnChange(FileSystemChangeType type, IPath _1, IPath? _2, IPath? _3)
|
||||
// {
|
||||
// if (type != FileSystemChangeType.Reload)
|
||||
// _saveService.DelaySave(this);
|
||||
// }
|
||||
//
|
||||
// // Update sort order when defaulted mod names change.
|
||||
// private void OnModDataChange(in ModDataChanged.Arguments arguments)
|
||||
// {
|
||||
// if (!arguments.Type.HasFlag(ModDataChangeType.Name) || arguments.OldName == null || !TryGetValue(arguments.Mod, out var leaf))
|
||||
// return;
|
||||
//
|
||||
// var old = Extensions.FixName(arguments.OldName);
|
||||
// if (old == leaf.Name || Extensions.IsDuplicateName(leaf.Name, out var baseName, out _) && baseName == old)
|
||||
// RenameWithDuplicates(leaf, arguments.Mod.Name);
|
||||
// }
|
||||
//
|
||||
// // Update the filesystem if a mod has been added or removed.
|
||||
// // Save it, if the mod directory has been moved, since this will change the save format.
|
||||
// private void OnModPathChange(in ModPathChanged.Arguments arguments)
|
||||
// {
|
||||
// switch (arguments.Type)
|
||||
// {
|
||||
// case ModPathChangeType.Added:
|
||||
// var parent = Root;
|
||||
// if (_config.DefaultImportFolder.Length != 0)
|
||||
// try
|
||||
// {
|
||||
// parent = FindOrCreateAllFolders(_config.DefaultImportFolder);
|
||||
// }
|
||||
// catch (Exception e)
|
||||
// {
|
||||
// Penumbra.Messager.NotificationMessage(e,
|
||||
// $"Could not move newly imported mod {arguments.Mod.Name} to default import folder {_config.DefaultImportFolder}.",
|
||||
// NotificationType.Warning);
|
||||
// }
|
||||
//
|
||||
// CreateDuplicateLeaf(parent, arguments.Mod.Name, arguments.Mod);
|
||||
// break;
|
||||
// case ModPathChangeType.Deleted:
|
||||
// if (arguments.Mod.Node is not null)
|
||||
// Delete(arguments.Mod.Node);
|
||||
// break;
|
||||
// case ModPathChangeType.Moved:
|
||||
// _saveService.DelaySave(this);
|
||||
// break;
|
||||
// case ModPathChangeType.Reloaded:
|
||||
// // Nothing
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// public struct ImportDate : ISortMode
|
||||
// {
|
||||
// public ReadOnlySpan<byte> Name
|
||||
// => "Import Date (Older First)"u8;
|
||||
//
|
||||
// public ReadOnlySpan<byte> Description
|
||||
// => "In each folder, sort all subfolders lexicographically, then sort all leaves using their import date."u8;
|
||||
//
|
||||
// public IEnumerable<IFileSystemNode> GetChildren(IFileSystemFolder f)
|
||||
// => f.GetSubFolders().Cast<IFileSystemNode>().Concat(f.GetLeaves().OfType<IFileSystemData<Mod>>().OrderBy(l => l.Value.ImportDate));
|
||||
// }
|
||||
//
|
||||
// public struct InverseImportDate : ISortMode
|
||||
// {
|
||||
// public ReadOnlySpan<byte> Name
|
||||
// => "Import Date (Newer First)"u8;
|
||||
//
|
||||
// public ReadOnlySpan<byte> Description
|
||||
// => "In each folder, sort all subfolders lexicographically, then sort all leaves using their inverse import date."u8;
|
||||
//
|
||||
// public IEnumerable<IFileSystemNode> GetChildren(IFileSystemFolder f)
|
||||
// => f.GetSubFolders().Cast<IFileSystemNode>().Concat(f.GetLeaves().OfType<IFileSystemData<Mod>>().OrderByDescending(l => l.Value.ImportDate));
|
||||
// }
|
||||
//
|
||||
//}
|
||||
|
||||
public sealed class ModFileSystem : FileSystem<Mod>, IDisposable, ISavable, IService
|
||||
{
|
||||
private readonly ModManager _modManager;
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ public enum FeatureFlags : ulong
|
|||
Invalid = 1ul << 62,
|
||||
}
|
||||
|
||||
public sealed class Mod : IMod
|
||||
public sealed class Mod : IMod, IFileSystemValue<Mod>
|
||||
{
|
||||
public static readonly TemporaryMod ForcedFiles = new()
|
||||
{
|
||||
|
|
@ -69,6 +69,7 @@ public sealed class Mod : IMod
|
|||
|
||||
|
||||
// Local Data
|
||||
public string FullPath { get; set; } = string.Empty;
|
||||
public long ImportDate { get; internal set; } = DateTimeOffset.UnixEpoch.ToUnixTimeMilliseconds();
|
||||
public IReadOnlyList<string> LocalTags { get; internal set; } = [];
|
||||
public string Note { get; internal set; } = string.Empty;
|
||||
|
|
@ -130,14 +131,15 @@ public sealed class Mod : IMod
|
|||
}
|
||||
|
||||
// Cache
|
||||
public IFileSystemData<Mod>? Node { get; set; }
|
||||
public readonly SortedList<string, IIdentifiedObjectData> ChangedItems = new();
|
||||
|
||||
public string LowerChangedItemsString { get; internal set; } = string.Empty;
|
||||
public string AllTagsLower { get; internal set; } = string.Empty;
|
||||
|
||||
public int TotalFileCount { get; internal set; }
|
||||
public int TotalSwapCount { get; internal set; }
|
||||
public int TotalManipulations { get; internal set; }
|
||||
public ushort LastChangedItemsUpdate { get; internal set; }
|
||||
public bool HasOptions { get; internal set; }
|
||||
public int TotalFileCount { get; internal set; }
|
||||
public int TotalSwapCount { get; internal set; }
|
||||
public int TotalManipulations { get; internal set; }
|
||||
public ushort LastChangedItemsUpdate { get; internal set; }
|
||||
public bool HasOptions { get; internal set; }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,131 +1,139 @@
|
|||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using Penumbra.GameData.Structs;
|
||||
using Penumbra.Mods.Manager;
|
||||
using Penumbra.Services;
|
||||
|
||||
namespace Penumbra.Mods;
|
||||
|
||||
public readonly struct ModLocalData(Mod mod) : ISavable
|
||||
{
|
||||
public const int FileVersion = 3;
|
||||
|
||||
public string ToFilePath(FilenameService fileNames)
|
||||
=> fileNames.LocalDataFile(mod);
|
||||
|
||||
public void Save(StreamWriter writer)
|
||||
{
|
||||
var jObject = new JObject
|
||||
{
|
||||
{ nameof(FileVersion), JToken.FromObject(FileVersion) },
|
||||
{ nameof(Mod.ImportDate), JToken.FromObject(mod.ImportDate) },
|
||||
{ nameof(Mod.LocalTags), JToken.FromObject(mod.LocalTags) },
|
||||
{ nameof(Mod.Note), JToken.FromObject(mod.Note) },
|
||||
{ nameof(Mod.Favorite), JToken.FromObject(mod.Favorite) },
|
||||
{ nameof(Mod.PreferredChangedItems), JToken.FromObject(mod.PreferredChangedItems) },
|
||||
};
|
||||
using var jWriter = new JsonTextWriter(writer);
|
||||
jWriter.Formatting = Formatting.Indented;
|
||||
jObject.WriteTo(jWriter);
|
||||
}
|
||||
|
||||
public static ModDataChangeType Load(ModDataEditor editor, Mod mod)
|
||||
{
|
||||
var dataFile = editor.SaveService.FileNames.LocalDataFile(mod);
|
||||
|
||||
var importDate = 0L;
|
||||
var localTags = Enumerable.Empty<string>();
|
||||
var favorite = false;
|
||||
var note = string.Empty;
|
||||
|
||||
HashSet<CustomItemId> preferredChangedItems = [];
|
||||
|
||||
var save = true;
|
||||
if (File.Exists(dataFile))
|
||||
try
|
||||
{
|
||||
var text = File.ReadAllText(dataFile);
|
||||
var json = JObject.Parse(text);
|
||||
|
||||
importDate = json[nameof(Mod.ImportDate)]?.Value<long>() ?? importDate;
|
||||
favorite = json[nameof(Mod.Favorite)]?.Value<bool>() ?? favorite;
|
||||
note = json[nameof(Mod.Note)]?.Value<string>() ?? note;
|
||||
localTags = (json[nameof(Mod.LocalTags)] as JArray)?.Values<string>().OfType<string>() ?? localTags;
|
||||
preferredChangedItems = (json[nameof(Mod.PreferredChangedItems)] as JArray)?.Values<ulong>().Select(i => (CustomItemId) i).ToHashSet() ?? mod.DefaultPreferredItems;
|
||||
save = false;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Penumbra.Log.Error($"Could not load local mod data:\n{e}");
|
||||
}
|
||||
else
|
||||
{
|
||||
preferredChangedItems = mod.DefaultPreferredItems;
|
||||
}
|
||||
|
||||
if (importDate == 0)
|
||||
importDate = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
|
||||
|
||||
ModDataChangeType changes = 0;
|
||||
if (mod.ImportDate != importDate)
|
||||
{
|
||||
mod.ImportDate = importDate;
|
||||
changes |= ModDataChangeType.ImportDate;
|
||||
}
|
||||
|
||||
changes |= UpdateTags(mod, null, localTags);
|
||||
|
||||
if (mod.Favorite != favorite)
|
||||
{
|
||||
mod.Favorite = favorite;
|
||||
changes |= ModDataChangeType.Favorite;
|
||||
}
|
||||
|
||||
if (mod.Note != note)
|
||||
{
|
||||
mod.Note = note;
|
||||
changes |= ModDataChangeType.Note;
|
||||
}
|
||||
|
||||
if (!preferredChangedItems.SetEquals(mod.PreferredChangedItems))
|
||||
{
|
||||
mod.PreferredChangedItems = preferredChangedItems;
|
||||
changes |= ModDataChangeType.PreferredChangedItems;
|
||||
}
|
||||
|
||||
if (save)
|
||||
editor.SaveService.QueueSave(new ModLocalData(mod));
|
||||
|
||||
return changes;
|
||||
}
|
||||
|
||||
internal static ModDataChangeType UpdateTags(Mod mod, 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(mod.ModTags))
|
||||
{
|
||||
newLocalTags ??= mod.LocalTags;
|
||||
mod.ModTags = modTags;
|
||||
type |= ModDataChangeType.ModTags;
|
||||
}
|
||||
}
|
||||
|
||||
if (newLocalTags != null)
|
||||
{
|
||||
var localTags = newLocalTags!.Where(t => t.Length > 0 && !mod.ModTags.Contains(t)).Distinct().ToArray();
|
||||
if (!localTags.SequenceEqual(mod.LocalTags))
|
||||
{
|
||||
mod.LocalTags = localTags;
|
||||
type |= ModDataChangeType.LocalTags;
|
||||
}
|
||||
}
|
||||
|
||||
return type;
|
||||
}
|
||||
}
|
||||
using Luna;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using Penumbra.GameData.Structs;
|
||||
using Penumbra.Mods.Manager;
|
||||
using Penumbra.Services;
|
||||
|
||||
namespace Penumbra.Mods;
|
||||
|
||||
public readonly struct ModLocalData(Mod mod) : ISavable
|
||||
{
|
||||
public const int FileVersion = 3;
|
||||
|
||||
public string ToFilePath(FilenameService fileNames)
|
||||
=> fileNames.LocalDataFile(mod);
|
||||
|
||||
public void Save(StreamWriter writer)
|
||||
{
|
||||
var jObject = new JObject
|
||||
{
|
||||
{ nameof(FileVersion), JToken.FromObject(FileVersion) },
|
||||
{ nameof(Mod.ImportDate), JToken.FromObject(mod.ImportDate) },
|
||||
{ nameof(Mod.LocalTags), JToken.FromObject(mod.LocalTags) },
|
||||
{ nameof(Mod.Note), JToken.FromObject(mod.Note) },
|
||||
{ nameof(Mod.Favorite), JToken.FromObject(mod.Favorite) },
|
||||
{ nameof(Mod.PreferredChangedItems), JToken.FromObject(mod.PreferredChangedItems) },
|
||||
};
|
||||
|
||||
if (mod.FullPath.Length > 0)
|
||||
{
|
||||
var baseName = mod.FullPath.GetBaseName(mod.Name, out var folder);
|
||||
jObject[nameof(Mod.FullPath)] = folder.Length > 0 ? $"{folder}/{baseName}" : baseName.ToString();
|
||||
}
|
||||
|
||||
using var jWriter = new JsonTextWriter(writer);
|
||||
jWriter.Formatting = Formatting.Indented;
|
||||
jObject.WriteTo(jWriter);
|
||||
}
|
||||
|
||||
public static ModDataChangeType Load(ModDataEditor editor, Mod mod)
|
||||
{
|
||||
var dataFile = editor.SaveService.FileNames.LocalDataFile(mod);
|
||||
|
||||
var importDate = 0L;
|
||||
var localTags = Enumerable.Empty<string>();
|
||||
var favorite = false;
|
||||
var note = string.Empty;
|
||||
|
||||
HashSet<CustomItemId> preferredChangedItems = [];
|
||||
|
||||
var save = true;
|
||||
if (File.Exists(dataFile))
|
||||
try
|
||||
{
|
||||
var text = File.ReadAllText(dataFile);
|
||||
var json = JObject.Parse(text);
|
||||
|
||||
importDate = json[nameof(Mod.ImportDate)]?.Value<long>() ?? importDate;
|
||||
favorite = json[nameof(Mod.Favorite)]?.Value<bool>() ?? favorite;
|
||||
note = json[nameof(Mod.Note)]?.Value<string>() ?? note;
|
||||
localTags = (json[nameof(Mod.LocalTags)] as JArray)?.Values<string>().OfType<string>() ?? localTags;
|
||||
preferredChangedItems =
|
||||
(json[nameof(Mod.PreferredChangedItems)] as JArray)?.Values<ulong>().Select(i => (CustomItemId)i).ToHashSet()
|
||||
?? mod.DefaultPreferredItems;
|
||||
save = false;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Penumbra.Log.Error($"Could not load local mod data:\n{e}");
|
||||
}
|
||||
else
|
||||
preferredChangedItems = mod.DefaultPreferredItems;
|
||||
|
||||
if (importDate == 0)
|
||||
importDate = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
|
||||
|
||||
ModDataChangeType changes = 0;
|
||||
if (mod.ImportDate != importDate)
|
||||
{
|
||||
mod.ImportDate = importDate;
|
||||
changes |= ModDataChangeType.ImportDate;
|
||||
}
|
||||
|
||||
changes |= UpdateTags(mod, null, localTags);
|
||||
|
||||
if (mod.Favorite != favorite)
|
||||
{
|
||||
mod.Favorite = favorite;
|
||||
changes |= ModDataChangeType.Favorite;
|
||||
}
|
||||
|
||||
if (mod.Note != note)
|
||||
{
|
||||
mod.Note = note;
|
||||
changes |= ModDataChangeType.Note;
|
||||
}
|
||||
|
||||
if (!preferredChangedItems.SetEquals(mod.PreferredChangedItems))
|
||||
{
|
||||
mod.PreferredChangedItems = preferredChangedItems;
|
||||
changes |= ModDataChangeType.PreferredChangedItems;
|
||||
}
|
||||
|
||||
if (save)
|
||||
editor.SaveService.QueueSave(new ModLocalData(mod));
|
||||
|
||||
return changes;
|
||||
}
|
||||
|
||||
internal static ModDataChangeType UpdateTags(Mod mod, 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(mod.ModTags))
|
||||
{
|
||||
newLocalTags ??= mod.LocalTags;
|
||||
mod.ModTags = modTags;
|
||||
type |= ModDataChangeType.ModTags;
|
||||
}
|
||||
}
|
||||
|
||||
if (newLocalTags != null)
|
||||
{
|
||||
var localTags = newLocalTags!.Where(t => t.Length > 0 && !mod.ModTags.Contains(t)).Distinct().ToArray();
|
||||
if (!localTags.SequenceEqual(mod.LocalTags))
|
||||
{
|
||||
mod.LocalTags = localTags;
|
||||
type |= ModDataChangeType.LocalTags;
|
||||
}
|
||||
}
|
||||
|
||||
return type;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue