From bfaf883c76c9995130a81a7f9e22ee8e925406a6 Mon Sep 17 00:00:00 2001 From: "Frank A. Krueger" Date: Fri, 16 Jun 2017 17:07:30 -0700 Subject: [PATCH] Bubble up child messages --- Ooui/EventTarget.cs | 11 +++++++---- Ooui/Node.cs | 14 ++++++++++++-- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/Ooui/EventTarget.cs b/Ooui/EventTarget.cs index 99d71d5..f218d69 100644 --- a/Ooui/EventTarget.cs +++ b/Ooui/EventTarget.cs @@ -100,9 +100,12 @@ namespace Ooui return $"{IdPrefix}{id}"; } - public virtual void Send (Message message) + public void Send (Message message) { - SaveStateMessageIfNeeded (message); + if (message == null) + return; + if (message.TargetId == Id) + SaveStateMessageIfNeeded (message); MessageSent?.Invoke (message); } @@ -121,7 +124,7 @@ namespace Ooui }); } - public virtual void Receive (Message message) + public void Receive (Message message) { if (message == null) return; @@ -194,7 +197,7 @@ namespace Ooui public override object ReadJson (Newtonsoft.Json.JsonReader reader, Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) { - throw new NotImplementedException (); + throw new NotSupportedException (); } public override bool CanConvert (Type objectType) diff --git a/Ooui/Node.cs b/Ooui/Node.cs index daa5e0f..dec0e0e 100644 --- a/Ooui/Node.cs +++ b/Ooui/Node.cs @@ -43,13 +43,15 @@ namespace Ooui public Node InsertBefore (Node newChild, Node referenceChild) { if (referenceChild == null) { + newChild.MessageSent += HandleChildMessageSent; children.Add (newChild); } else { var index = children.IndexOf (referenceChild); if (index < 0) { - throw new ArgumentException ("Reference must be a child of this element", nameof(referenceChild)); - } + throw new ArgumentException ("Reference must be a child of this element", nameof (referenceChild)); + } + newChild.MessageSent += HandleChildMessageSent; children.Insert (index, newChild); } SendCall ("insertBefore", newChild, referenceChild); @@ -58,9 +60,12 @@ namespace Ooui public Node RemoveChild (Node child) { + if (child == null) + return null; if (!children.Remove (child)) { throw new ArgumentException ("Child not contained in this element", nameof(child)); } + child.MessageSent -= HandleChildMessageSent; SendCall ("removeChild", child); return child; } @@ -73,6 +78,11 @@ namespace Ooui InsertBefore (newNode, null); } + void HandleChildMessageSent (Message message) + { + Send (message); + } + protected override void SaveStateMessageIfNeeded (Message message) { switch (message.MessageType) {