-
Notifications
You must be signed in to change notification settings - Fork 75
Expand file tree
/
Copy pathEditorDictionary.cs
More file actions
172 lines (145 loc) · 4.28 KB
/
Copy pathEditorDictionary.cs
File metadata and controls
172 lines (145 loc) · 4.28 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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
using RPGCore.DataEditor.Manifest;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
namespace RPGCore.DataEditor;
/// <summary>
/// An editable data structure that utilises a collection of key-value pairs.
/// </summary>
public class EditorDictionary : IEditorValue
{
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private readonly List<string> comments;
/// <inheritdoc/>
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
public EditorSession Session { get; }
/// <inheritdoc/>
public IList<string> Comments => comments;
/// <inheritdoc/>
public TypeName Type { get; }
/// <summary>
/// All key-value pairs contained within this dictionary.
/// </summary>
public List<EditorKeyValuePair> KeyValuePairs { get; }
/// <summary>
/// A collection of <see cref="IEditorFeature"/>s associated with this <see cref="EditorDictionary"/>.
/// </summary>
public FeatureCollection<EditorDictionary> Features { get; }
/// <summary>
/// The type of the dictionary keys.
/// </summary>
public TypeName KeyType => Type.TemplateTypes[0];
/// <summary>
/// the type of the dictionary values.
/// </summary>
public TypeName ValueType => Type.TemplateTypes[1];
/// <inheritdoc/>
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
FeatureCollection IEditorToken.Features => Features;
/// <summary>
/// The length of this <see cref="EditorDictionary"/>.
/// </summary>
public int Length
{
get => KeyValuePairs.Count;
set => SetLength(value);
}
/// <inheritdoc/>
public event PropertyChangedEventHandler PropertyChanged;
internal EditorDictionary(EditorSession session, TypeName type)
{
Session = session;
Type = type;
Features = new FeatureCollection<EditorDictionary>(this);
KeyValuePairs = new List<EditorKeyValuePair>();
comments = new List<string>();
PropertyChanged = delegate { };
}
/// <summary>
/// Sets the size of the dictionary; creates new key-value pairs to match the new size.
/// </summary>
/// <param name="size">The new size of this <see cref="EditorList"/>.</param>
/// <param name="insertNulls">If the <see cref="ValueType"/> of this <see cref="EditorDictionary"/> allows <c>null</c> values, insert nulls in new key-value pairs.</param>
public void SetLength(int size, bool insertNulls = true)
{
if (size < 0)
{
throw new ArgumentOutOfRangeException("Cannot set dictionary size to a value that is smaller than 0.", nameof(size));
}
bool modified = false;
while (KeyValuePairs.Count > size)
{
KeyValuePairs.RemoveAt(KeyValuePairs.Count - 1);
modified = true;
}
while (KeyValuePairs.Count < size)
{
if (insertNulls)
{
KeyValuePairs.Add(new EditorKeyValuePair(
this,
Session.CreateDefaultValue(KeyType),
Session.CreateDefaultValue(ValueType)));
}
else
{
KeyValuePairs.Add(new EditorKeyValuePair(
this,
Session.CreateDefaultValue(KeyType),
Session.CreateInstatedValue(ValueType)));
}
modified = true;
}
if (modified)
{
InvokeOnSizeChanged();
}
}
/// <summary>
/// Removes a value from the <see cref="EditorDictionary"/>.
/// </summary>
public bool Remove(EditorKeyValuePair kvp)
{
return KeyValuePairs.Remove(kvp);
}
/// <summary>
/// Adds a new value to the <see cref="EditorDictionary"/>.
/// </summary>
public void Add(bool insertNulls = false)
{
KeyValuePairs.Add(new EditorKeyValuePair(
this,
Session.CreateDefaultValue(KeyType),
insertNulls ? Session.CreateDefaultValue(ValueType) : Session.CreateInstatedValue(ValueType)));
InvokeOnSizeChanged();
}
/// <summary>
/// Adds a new value to the <see cref="EditorDictionary"/>.
/// </summary>
public void Add(IEditorValue key, IEditorValue value)
{
KeyValuePairs.Add(new EditorKeyValuePair(
this,
key,
value));
InvokeOnSizeChanged();
}
/// <inheritdoc/>
public IEditorValue Duplicate()
{
var editorDictionary = new EditorDictionary(Session, Type);
foreach (var keyValuePair in KeyValuePairs)
{
editorDictionary.Add(
keyValuePair.Key.Value.Duplicate(),
keyValuePair.Value.Value.Duplicate());
}
return editorDictionary;
}
private void InvokeOnSizeChanged()
{
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(KeyValuePairs)));
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(Length)));
}
}