mirror of
https://github.com/xivdev/Penumbra.git
synced 2025-12-12 18:27:24 +01:00
Move EventWrapper, some Glamourer changes.
This commit is contained in:
parent
c991eead89
commit
d24e1576d3
21 changed files with 26 additions and 209 deletions
2
OtterGui
2
OtterGui
|
|
@ -1 +1 @@
|
||||||
Subproject commit dc4ad8a5fd0347642d3fdae5f2dc17a7fbfacaa1
|
Subproject commit c69f49e026e17e81df546aa0621f1f575a22534d
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
using System;
|
using System;
|
||||||
using Penumbra.Util;
|
using OtterGui.Classes;
|
||||||
|
|
||||||
namespace Penumbra.Communication;
|
namespace Penumbra.Communication;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
using System;
|
using System;
|
||||||
using Penumbra.Util;
|
using OtterGui.Classes;
|
||||||
|
|
||||||
namespace Penumbra.Communication;
|
namespace Penumbra.Communication;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
using System;
|
using System;
|
||||||
using Penumbra.Util;
|
using OtterGui.Classes;
|
||||||
|
|
||||||
namespace Penumbra.Communication;
|
namespace Penumbra.Communication;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
using System;
|
using System;
|
||||||
using Penumbra.Util;
|
using OtterGui.Classes;
|
||||||
|
|
||||||
namespace Penumbra.Communication;
|
namespace Penumbra.Communication;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
using System;
|
using System;
|
||||||
using Penumbra.Util;
|
using OtterGui.Classes;
|
||||||
|
|
||||||
namespace Penumbra.Communication;
|
namespace Penumbra.Communication;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue