-
Notifications
You must be signed in to change notification settings - Fork 75
Expand file tree
/
Copy pathEventFieldHandlerCollection.cs
More file actions
115 lines (95 loc) · 2.5 KB
/
Copy pathEventFieldHandlerCollection.cs
File metadata and controls
115 lines (95 loc) · 2.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
namespace RPGCore.Events;
public sealed class EventFieldHandlerCollection : IEnumerable<KeyValuePair<object, IEventFieldHandler>>
{
public readonly ref struct ContextWrapped
{
private readonly IReadOnlyEventField field;
private readonly object context;
public ContextWrapped(IReadOnlyEventField field, object context)
{
this.field = field;
this.context = context;
}
public void Clear()
{
field.Handlers.Clear(context);
}
public void Add(IEventFieldHandler handler)
{
field.Handlers.internalHandlers.Add(new KeyValuePair<object, IEventFieldHandler>(context, handler));
if (handler is IHandlerUsedCallback usedCallback)
{
usedCallback.OnUse(field);
}
}
public void AddAndInvoke(IEventFieldHandler handler)
{
Add(handler);
handler.OnAfterChanged();
}
public void Remove(IEventFieldHandler handler)
{
field.Handlers.internalHandlers.Remove(new KeyValuePair<object, IEventFieldHandler>(context, handler));
}
public void InvokeAndRemove(IEventFieldHandler handler)
{
Remove(handler);
handler.OnBeforeChanged();
}
}
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private readonly IReadOnlyEventField field;
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private readonly List<KeyValuePair<object, IEventFieldHandler>> internalHandlers;
public ContextWrapped this[object context] => new(field, context);
public EventFieldHandlerCollection(IReadOnlyEventField field)
{
this.field = field;
internalHandlers = new List<KeyValuePair<object, IEventFieldHandler>>();
}
public void Clear(object context)
{
for (int i = internalHandlers.Count - 1; i >= 0; i--)
{
if (internalHandlers[i].Key == context)
{
internalHandlers[i].Value.OnBeforeChanged();
internalHandlers.RemoveAt(i);
}
}
}
public void Clear()
{
internalHandlers.Clear();
}
public void InvokeAndClear()
{
InvokeBeforeChanged();
internalHandlers.Clear();
}
public void InvokeBeforeChanged()
{
for (int i = 0; i < internalHandlers.Count; i++)
{
internalHandlers[i].Value.OnBeforeChanged();
}
}
public void InvokeAfterChanged()
{
for (int i = 0; i < internalHandlers.Count; i++)
{
internalHandlers[i].Value.OnAfterChanged();
}
}
public IEnumerator<KeyValuePair<object, IEventFieldHandler>> GetEnumerator()
{
return internalHandlers.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return internalHandlers.GetEnumerator();
}
}