@@ -9,14 +9,86 @@ namespace CSync.Lib;
99/// </summary>
1010public 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