From d60194c504fd24b2e3735d25b25368e03f7326f6 Mon Sep 17 00:00:00 2001 From: "Frank A. Krueger" Date: Mon, 19 Jun 2017 00:08:33 -0700 Subject: [PATCH] Add Canvas --- Ooui/Canvas.cs | 36 ++++++++++++++++++++++++++++++++++++ Ooui/Client.js | 5 ++++- Ooui/Context2d.cs | 10 ++++++++++ Ooui/Message.cs | 3 +++ Tests/CanvasTests.cs | 23 +++++++++++++++++++++++ 5 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 Ooui/Canvas.cs create mode 100644 Ooui/Context2d.cs create mode 100644 Tests/CanvasTests.cs diff --git a/Ooui/Canvas.cs b/Ooui/Canvas.cs new file mode 100644 index 0000000..6c18647 --- /dev/null +++ b/Ooui/Canvas.cs @@ -0,0 +1,36 @@ +using System; + +namespace Ooui +{ + public class Canvas : Element + { + Context2d context2d = new Context2d (); + int gotContext2d = 0; + + public Canvas () + : base ("canvas") + { + } + + public Context2d GetContext2d () + { + if (System.Threading.Interlocked.CompareExchange (ref gotContext2d, 1, 0) == 0) { + var mcall = Message.Call (Id, "getContext", "2d"); + mcall.ResultId = context2d.Id; + Send (mcall); + } + return context2d; + } + protected override void SaveStateMessageIfNeeded (Message message) + { + switch (message.MessageType) { + case MessageType.Call when message.Key == "getContext" && message.Value is Array a && a.Length == 1 && "2d".Equals (a.GetValue (0)): + AddStateMessage (message); + break; + default: + base.SaveStateMessageIfNeeded (message); + break; + } + } + } +} diff --git a/Ooui/Client.js b/Ooui/Client.js index 8861f16..4be5c1b 100644 --- a/Ooui/Client.js +++ b/Ooui/Client.js @@ -75,7 +75,10 @@ function msgCall (m) { } const f = node[m.k]; if (debug) console.log ("Call", node, f, m.v); - f.apply (node, m.v); + const r = f.apply (node, m.v); + if (typeof m.rid === 'string' || m.rid instanceof String) { + nodes[m.rid] = r; + } } function msgListen (m) { diff --git a/Ooui/Context2d.cs b/Ooui/Context2d.cs new file mode 100644 index 0000000..3cccbba --- /dev/null +++ b/Ooui/Context2d.cs @@ -0,0 +1,10 @@ +namespace Ooui +{ + public class Context2d : EventTarget + { + public Context2d() + : base ("context2d") + { + } + } +} diff --git a/Ooui/Message.cs b/Ooui/Message.cs index a7fb9be..a500859 100644 --- a/Ooui/Message.cs +++ b/Ooui/Message.cs @@ -19,6 +19,9 @@ namespace Ooui [JsonProperty("v", NullValueHandling = NullValueHandling.Ignore)] public object Value = null; + [JsonProperty("rid", NullValueHandling = NullValueHandling.Ignore)] + public string ResultId = null; + public static Message Call (string targetId, string method, params object[] args) => new Message { MessageType = MessageType.Call, TargetId = targetId, diff --git a/Tests/CanvasTests.cs b/Tests/CanvasTests.cs new file mode 100644 index 0000000..da1aed5 --- /dev/null +++ b/Tests/CanvasTests.cs @@ -0,0 +1,23 @@ +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +using Ooui; + +namespace Tests +{ + [TestClass] + public class CanvasTests + { + [TestMethod] + public void Context2dState () + { + var c = new Canvas (); + Assert.AreEqual (1, c.StateMessages.Count); + var c2d = c.GetContext2d (); + Assert.AreEqual (2, c.StateMessages.Count); + var c2d2 = c.GetContext2d (); + Assert.AreEqual (2, c.StateMessages.Count); + Assert.AreEqual (c2d, c2d2); + } + } +}