Move EventWrapper, some Glamourer changes.

This commit is contained in:
Ottermandias 2023-06-04 15:41:02 +02:00
parent c991eead89
commit d24e1576d3
21 changed files with 26 additions and 209 deletions

@ -1 +1 @@
Subproject commit dc4ad8a5fd0347642d3fdae5f2dc17a7fbfacaa1 Subproject commit c69f49e026e17e81df546aa0621f1f575a22534d

View file

@ -74,7 +74,7 @@ public unsafe struct CustomizeData : IEquatable< CustomizeData >
} }
} }
public string WriteBytes() public override string ToString()
{ {
var sb = new StringBuilder(Size * 3); var sb = new StringBuilder(Size * 3);
for (var i = 0; i < Size - 1; ++i) for (var i = 0; i < Size - 1; ++i)

View file

@ -1,6 +1,6 @@
using System; using System;
using OtterGui.Classes;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Util;
namespace Penumbra.Communication; namespace Penumbra.Communication;

View file

@ -1,5 +1,5 @@
using System; using System;
using Penumbra.Util; using OtterGui.Classes;
namespace Penumbra.Communication; namespace Penumbra.Communication;

View file

@ -1,7 +1,7 @@
using System; using System;
using OtterGui.Classes;
using Penumbra.Collections; using Penumbra.Collections;
using Penumbra.Collections.Manager; using Penumbra.Collections.Manager;
using Penumbra.Util;
namespace Penumbra.Communication; namespace Penumbra.Communication;

View file

@ -1,6 +1,6 @@
using System; using System;
using OtterGui.Classes;
using Penumbra.Collections; using Penumbra.Collections;
using Penumbra.Util;
namespace Penumbra.Communication; namespace Penumbra.Communication;

View file

@ -1,6 +1,6 @@
using System; using System;
using OtterGui.Classes;
using Penumbra.Api; using Penumbra.Api;
using Penumbra.Util;
namespace Penumbra.Communication; namespace Penumbra.Communication;

View file

@ -1,6 +1,6 @@
using System; using System;
using OtterGui.Classes;
using Penumbra.Api; using Penumbra.Api;
using Penumbra.Util;
namespace Penumbra.Communication; namespace Penumbra.Communication;

View file

@ -1,6 +1,6 @@
using System; using System;
using OtterGui.Classes;
using Penumbra.Api; using Penumbra.Api;
using Penumbra.Util;
namespace Penumbra.Communication; namespace Penumbra.Communication;

View file

@ -1,7 +1,7 @@
using System; using System;
using OtterGui.Classes;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Util;
namespace Penumbra.Communication; namespace Penumbra.Communication;

View file

@ -1,6 +1,6 @@
using System; using System;
using OtterGui.Classes;
using Penumbra.Api; using Penumbra.Api;
using Penumbra.Util;
namespace Penumbra.Communication; namespace Penumbra.Communication;

View file

@ -1,5 +1,5 @@
using System; using System;
using Penumbra.Util; using OtterGui.Classes;
namespace Penumbra.Communication; namespace Penumbra.Communication;

View file

@ -1,5 +1,5 @@
using System; using System;
using Penumbra.Util; using OtterGui.Classes;
namespace Penumbra.Communication; namespace Penumbra.Communication;

View file

@ -1,7 +1,7 @@
using System; using System;
using OtterGui.Classes;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Util;
namespace Penumbra.Communication; namespace Penumbra.Communication;

View file

@ -1,9 +1,9 @@
using System; using System;
using System.IO; using System.IO;
using OtterGui.Classes;
using Penumbra.Api; using Penumbra.Api;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Util;
namespace Penumbra.Communication; namespace Penumbra.Communication;

View file

@ -1,9 +1,9 @@
using System; using System;
using OtterGui.Classes;
using Penumbra.Api; using Penumbra.Api;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Collections; using Penumbra.Collections;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Util;
namespace Penumbra.Communication; namespace Penumbra.Communication;

View file

@ -1,5 +1,5 @@
using System; using System;
using Penumbra.Util; using OtterGui.Classes;
namespace Penumbra.Communication; namespace Penumbra.Communication;

View file

@ -1,5 +1,5 @@
using System; using System;
using Penumbra.Util; using OtterGui.Classes;
namespace Penumbra.Communication; namespace Penumbra.Communication;

View file

@ -1,6 +1,6 @@
using System; using System;
using OtterGui.Classes;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Util;
namespace Penumbra.Communication; namespace Penumbra.Communication;

View file

@ -1,10 +1,17 @@
using System; using System;
using OtterGui.Classes;
using OtterGui.Log;
using Penumbra.Communication; using Penumbra.Communication;
namespace Penumbra.Services; namespace Penumbra.Services;
public class CommunicatorService : IDisposable public class CommunicatorService : IDisposable
{ {
public CommunicatorService(Logger logger)
{
EventWrapper.ChangeLogger(logger);
}
/// <inheritdoc cref="Communication.CollectionChange"/> /// <inheritdoc cref="Communication.CollectionChange"/>
public readonly CollectionChange CollectionChange = new(); public readonly CollectionChange CollectionChange = new();

View file

@ -1,190 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace Penumbra.Util;
public abstract class EventWrapper<T, TPriority> : IDisposable
where T : Delegate
where TPriority : struct, Enum
{
private readonly string _name;
private readonly List<(object Subscriber, TPriority Priority)> _event = new();
public bool HasSubscribers
=> _event.Count > 0;
protected EventWrapper(string name)
=> _name = name;
public void Dispose()
{
lock (_event)
{
_event.Clear();
}
}
public void Subscribe(T subscriber, TPriority priority)
{
lock (_event)
{
var existingIdx = _event.FindIndex(p => (T)p.Subscriber == subscriber);
var idx = _event.FindIndex(p => p.Priority.CompareTo(priority) > 0);
if (idx == existingIdx)
{
if (idx < 0)
_event.Add((subscriber, priority));
else
_event[idx] = (subscriber, priority);
}
else
{
if (idx < 0)
_event.Add((subscriber, priority));
else
_event.Insert(idx, (subscriber, priority));
if (existingIdx >= 0)
_event.RemoveAt(existingIdx < idx ? existingIdx : existingIdx + 1);
}
}
}
public void Unsubscribe(T subscriber)
{
lock (_event)
{
var idx = _event.FindIndex(p => (T)p.Subscriber == subscriber);
if (idx >= 0)
_event.RemoveAt(idx);
}
}
protected static void Invoke(EventWrapper<T, TPriority> wrapper)
{
lock (wrapper._event)
{
foreach (var (action, _) in wrapper._event.AsEnumerable().Reverse())
{
try
{
((Action)action).Invoke();
}
catch (Exception ex)
{
Penumbra.Log.Error($"[{wrapper._name}] Exception thrown during invocation:\n{ex}");
}
}
}
}
protected static void Invoke<T1>(EventWrapper<T, TPriority> wrapper, T1 a)
{
lock (wrapper._event)
{
foreach (var (action, _) in wrapper._event.AsEnumerable().Reverse())
{
try
{
((Action<T1>)action).Invoke(a);
}
catch (Exception ex)
{
Penumbra.Log.Error($"[{wrapper._name}] Exception thrown during invocation:\n{ex}");
}
}
}
}
protected static void Invoke<T1, T2>(EventWrapper<T, TPriority> wrapper, T1 a, T2 b)
{
lock (wrapper._event)
{
foreach (var (action, _) in wrapper._event.AsEnumerable().Reverse())
{
try
{
((Action<T1, T2>)action).Invoke(a, b);
}
catch (Exception ex)
{
Penumbra.Log.Error($"[{wrapper._name}] Exception thrown during invocation:\n{ex}");
}
}
}
}
protected static void Invoke<T1, T2, T3>(EventWrapper<T, TPriority> wrapper, T1 a, T2 b, T3 c)
{
lock (wrapper._event)
{
foreach (var (action, _) in wrapper._event.AsEnumerable().Reverse())
{
try
{
((Action<T1, T2, T3>)action).Invoke(a, b, c);
}
catch (Exception ex)
{
Penumbra.Log.Error($"[{wrapper._name}] Exception thrown during invocation:\n{ex}");
}
}
}
}
protected static void Invoke<T1, T2, T3, T4>(EventWrapper<T, TPriority> wrapper, T1 a, T2 b, T3 c, T4 d)
{
lock (wrapper._event)
{
foreach (var (action, _) in wrapper._event.AsEnumerable().Reverse())
{
try
{
((Action<T1, T2, T3, T4>)action).Invoke(a, b, c, d);
}
catch (Exception ex)
{
Penumbra.Log.Error($"[{wrapper._name}] Exception thrown during invocation:\n{ex}");
}
}
}
}
protected static void Invoke<T1, T2, T3, T4, T5>(EventWrapper<T, TPriority> wrapper, T1 a, T2 b, T3 c, T4 d, T5 e)
{
lock (wrapper._event)
{
foreach (var (action, _) in wrapper._event.AsEnumerable().Reverse())
{
try
{
((Action<T1, T2, T3, T4, T5>)action).Invoke(a, b, c, d, e);
}
catch (Exception ex)
{
Penumbra.Log.Error($"[{wrapper._name}] Exception thrown during invocation:\n{ex}");
}
}
}
}
protected static void Invoke<T1, T2, T3, T4, T5, T6>(EventWrapper<T, TPriority> wrapper, T1 a, T2 b, T3 c, T4 d, T5 e, T6 f)
{
lock (wrapper._event)
{
foreach (var (action, _) in wrapper._event.AsEnumerable().Reverse())
{
try
{
((Action<T1, T2, T3, T4, T5, T6>)action).Invoke(a, b, c, d, e, f);
}
catch (Exception ex)
{
Penumbra.Log.Error($"[{wrapper._name}] Exception thrown during invocation:\n{ex}");
}
}
}
}
}