Skip to content

Commit 8138326

Browse files
committed
add .Changed event
1 parent bdf3196 commit 8138326

File tree

1 file changed

+82
-10
lines changed

1 file changed

+82
-10
lines changed

CSync/Lib/SyncedEntry.cs

Lines changed: 82 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,86 @@ namespace CSync.Lib;
99
/// </summary>
1010
public sealed class SyncedEntry<T> : SyncedEntryBase
1111
{
12-
public ConfigEntry<T> Entry { get; private set; }
12+
private ConfigEntry<T> _entry;
1313

14-
public override ConfigEntryBase BoxedEntry
15-
{
14+
public ConfigEntry<T> Entry {
15+
get => _entry;
16+
init {
17+
_entry = value;
18+
_lastLocalValue = _entry.Value;
19+
Entry.SettingChanged += OnLocalSettingChanged;
20+
}
21+
}
22+
23+
public override ConfigEntryBase BoxedEntry {
1624
get => Entry;
17-
protected init => Entry = (ConfigEntry<T>) value;
25+
protected init => Entry = (ConfigEntry<T>)value;
26+
}
27+
28+
public override bool ValueOverridden {
29+
get => base.ValueOverridden;
30+
internal set
31+
{
32+
if (value == base.ValueOverridden) return;
33+
34+
var lastValue = Value;
35+
base.ValueOverridden = value;
36+
OnValueOverriddenChanged(this, lastValue);
37+
}
38+
}
39+
40+
private void OnLocalSettingChanged(object sender, EventArgs e)
41+
{
42+
InvokeChangedIfNecessary();
43+
_lastLocalValue = LocalValue;
44+
return;
45+
46+
void InvokeChangedIfNecessary()
47+
{
48+
if (ValueOverridden) return;
49+
if (Equals(_lastLocalValue, LocalValue)) return;
50+
51+
var args = new SyncedSettingChangedEventArgs<T>
52+
{
53+
OldValue = _lastLocalValue,
54+
NewValue = LocalValue,
55+
ChangedEntry = this,
56+
};
57+
Changed?.Invoke(sender, args);
58+
}
1859
}
1960

61+
private void OnValueOverrideChanged(object sender, T oldValue)
62+
{
63+
if (!ValueOverridden) return;
64+
if (Equals(oldValue, _typedValueOverride)) return;
65+
66+
var args = new SyncedSettingChangedEventArgs<T>
67+
{
68+
OldValue = oldValue,
69+
NewValue = _typedValueOverride,
70+
ChangedEntry = this,
71+
};
72+
Changed?.Invoke(sender, args);
73+
}
74+
75+
private void OnValueOverriddenChanged(object sender, T oldValue)
76+
{
77+
if (Equals(Value, oldValue)) return;
78+
79+
var args = new SyncedSettingChangedEventArgs<T>
80+
{
81+
OldValue = oldValue,
82+
NewValue = Value,
83+
ChangedEntry = this,
84+
};
85+
Changed?.Invoke(sender, args);
86+
}
87+
88+
public event EventHandler<SyncedSettingChangedEventArgs<T>>? Changed;
89+
90+
private T _lastLocalValue;
91+
2092
public T LocalValue
2193
{
2294
get => Entry.Value;
@@ -28,7 +100,12 @@ public T LocalValue
28100
public override object? BoxedValueOverride
29101
{
30102
get => _typedValueOverride;
31-
set => _typedValueOverride = (T) value!;
103+
set
104+
{
105+
var lastValue = Value;
106+
_typedValueOverride = (T)value!;
107+
OnValueOverrideChanged(this, lastValue);
108+
}
32109
}
33110

34111
public T Value {
@@ -40,11 +117,6 @@ public T Value {
40117

41118
public static implicit operator T(SyncedEntry<T> e) => e.Value;
42119

43-
public event EventHandler SettingChanged {
44-
add => Entry.SettingChanged += value;
45-
remove => Entry.SettingChanged -= value;
46-
}
47-
48120
public SyncedEntry(ConfigEntry<T> entry) : base(entry) { }
49121

50122
public override string ToString() {

0 commit comments

Comments
 (0)