|
|
@@ -234,20 +234,24 @@ namespace InABox.Core
|
|
|
|
|
|
public static bool GlobalObserving = true;
|
|
|
|
|
|
- private bool _observing = false;
|
|
|
+ internal bool _observing = false;
|
|
|
+ internal bool _observingOnlyCascades = false;
|
|
|
|
|
|
public bool IsObserving()
|
|
|
{
|
|
|
return GlobalObserving && _observing;
|
|
|
}
|
|
|
|
|
|
- public void SetObserving(bool active)
|
|
|
+ void IBaseObject.SetObserving(bool active) => SetObserving(active);
|
|
|
+
|
|
|
+ public void SetObserving(bool active, bool? onlyCascades = null)
|
|
|
{
|
|
|
bApplyingChanges = true;
|
|
|
_observing = active;
|
|
|
+ _observingOnlyCascades = onlyCascades ?? _observingOnlyCascades;
|
|
|
_disabledInterceptor = true;
|
|
|
foreach (var oo in DatabaseSchema.GetSubObjects(this))
|
|
|
- oo.SetObserving(active);
|
|
|
+ oo.SetObserving(active, onlyCascades: onlyCascades);
|
|
|
_disabledInterceptor = false;
|
|
|
bApplyingChanges = false;
|
|
|
}
|
|
|
@@ -256,21 +260,25 @@ namespace InABox.Core
|
|
|
{
|
|
|
}
|
|
|
|
|
|
+ protected virtual void DoPropertyCascaded(string name, object? before, object? after)
|
|
|
+ {
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// Triggered for any property change, but is not triggered if that property change triggers any other property changes.
|
|
|
/// </summary>
|
|
|
/// <remarks>
|
|
|
- /// See also <seealso cref="PropertyCascaded"/>.
|
|
|
+ /// See also <seealso cref="PropertyChanged"/>.
|
|
|
/// </remarks>
|
|
|
- public event PropertyChangedEventHandler? PropertyChanged;
|
|
|
+ public event PropertyChangedEventHandler? PropertyEdited;
|
|
|
|
|
|
/// <summary>
|
|
|
/// Triggered for any property change, including property changes triggered by other properties changing.
|
|
|
/// </summary>
|
|
|
/// <remarks>
|
|
|
- /// Most cases should just use <see cref="PropertyChanged"/>.
|
|
|
+ /// Should be used for data binding and stuff.
|
|
|
/// </remarks>
|
|
|
- public event PropertyChangedEventHandler? PropertyCascaded;
|
|
|
+ public event PropertyChangedEventHandler? PropertyChanged;
|
|
|
|
|
|
private bool bApplyingChanges;
|
|
|
|
|
|
@@ -329,7 +337,7 @@ namespace InABox.Core
|
|
|
|
|
|
DoPropertyChanged(name, before, after);
|
|
|
|
|
|
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
|
|
|
+ PropertyEdited?.Invoke(this, new PropertyChangedEventArgs(name));
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
|
@@ -340,7 +348,8 @@ namespace InABox.Core
|
|
|
|
|
|
try
|
|
|
{
|
|
|
- PropertyCascaded?.Invoke(this, new PropertyChangedEventArgs(name));
|
|
|
+ DoPropertyCascaded(name, before, after);
|
|
|
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
|
@@ -374,7 +383,21 @@ namespace InABox.Core
|
|
|
public void OnPropertyChanged(string name, object? before, object? after)
|
|
|
{
|
|
|
if (!IsObserving())
|
|
|
+ {
|
|
|
+ if (_observingOnlyCascades)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ DoPropertyCascaded(name, before, after);
|
|
|
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
|
|
|
+ }
|
|
|
+ catch (Exception e)
|
|
|
+ {
|
|
|
+ CoreUtils.LogException("", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
return;
|
|
|
+ }
|
|
|
|
|
|
if (name.Equals("IsChanged") || name.Equals("Observing") || name.Equals("OriginalValues"))
|
|
|
return;
|
|
|
@@ -406,8 +429,10 @@ namespace InABox.Core
|
|
|
public void CancelChanges()
|
|
|
{
|
|
|
bApplyingChanges = true;
|
|
|
- var bObs = IsObserving();
|
|
|
- SetObserving(false);
|
|
|
+
|
|
|
+ var bObs = _observing;
|
|
|
+ var onlyCascades = _observingOnlyCascades;
|
|
|
+ SetObserving(false, onlyCascades: true);
|
|
|
|
|
|
foreach (var (key, value) in OriginalValueList)
|
|
|
{
|
|
|
@@ -417,6 +442,8 @@ namespace InABox.Core
|
|
|
if(prop != null)
|
|
|
{
|
|
|
prop.Setter()(this, value);
|
|
|
+
|
|
|
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(key));
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
@@ -431,7 +458,6 @@ namespace InABox.Core
|
|
|
|
|
|
OriginalValueList.Clear();
|
|
|
|
|
|
-
|
|
|
bChanged = false;
|
|
|
|
|
|
_disabledInterceptor = true;
|
|
|
@@ -441,7 +467,7 @@ namespace InABox.Core
|
|
|
}
|
|
|
_disabledInterceptor = false;
|
|
|
|
|
|
- SetObserving(bObs);
|
|
|
+ SetObserving(bObs, onlyCascades: onlyCascades);
|
|
|
bApplyingChanges = false;
|
|
|
}
|
|
|
|
|
|
@@ -570,8 +596,9 @@ namespace InABox.Core
|
|
|
{
|
|
|
Object.CancelChanges();
|
|
|
|
|
|
- var bObs = Object.IsObserving();
|
|
|
- Object.SetObserving(false);
|
|
|
+ var bObs = Object._observing;
|
|
|
+ var onlyCascades = Object._observingOnlyCascades;
|
|
|
+ Object.SetObserving(false, true);
|
|
|
foreach(var (prop, value) in Values)
|
|
|
{
|
|
|
var oldValue = prop.Getter()(Object);
|
|
|
@@ -582,7 +609,7 @@ namespace InABox.Core
|
|
|
Object.OriginalValueList[prop.Name] = oldValue;
|
|
|
}
|
|
|
}
|
|
|
- Object.SetObserving(bObs);
|
|
|
+ Object.SetObserving(bObs, onlyCascades: onlyCascades);
|
|
|
}
|
|
|
}
|
|
|
|