Krzysztof Krysiński 1 år sedan
förälder
incheckning
9059092f86

+ 2 - 1
src/PixiEditor.Extensions.CommonApi/LayoutBuilding/ByteMap.cs

@@ -9,7 +9,8 @@ public static class ByteMap
         // If you do add a new control, make sure to add it to GlobalControlFactory inside PixiEditor project
         { "Layout", 0 },
         { "Center", 1 },
-        { "Text", 2 }
+        { "Text", 2 },
+        { "Button", 3}
     };
 
     public static byte GetTypeByteId(Type type)

+ 1 - 1
src/PixiEditor.Extensions.CommonApi/LayoutBuilding/ITextElement.cs

@@ -2,5 +2,5 @@
 
 public interface ITextElement<out TBuildResult> : ILayoutElement<TBuildResult>
 {
-    public string Data { get; set; }
+    public string Value { get; set; }
 }

+ 26 - 0
src/PixiEditor.Extensions.Wasm/Api/LayoutBuilding/Button.cs

@@ -0,0 +1,26 @@
+using PixiEditor.Extensions.CommonApi.LayoutBuilding;
+
+namespace PixiEditor.Extensions.Wasm.Api.LayoutBuilding;
+
+public class Button : ISingleChildLayoutElement<NativeControl>
+{
+    ILayoutElement<NativeControl> ISingleChildLayoutElement<NativeControl>.Child
+    {
+        get => Content;
+        set => Content = value;
+    }
+
+    public ILayoutElement<NativeControl> Content { get; set; }
+
+    public Button(ILayoutElement<NativeControl> child = null)
+    {
+        Content = child;
+    }
+
+    public NativeControl Build()
+    {
+        NativeControl button = new NativeControl("Button");
+        button.AddChild(Content.Build());
+        return button;
+    }
+}

+ 4 - 4
src/PixiEditor.Extensions.Wasm/Api/LayoutBuilding/Text.cs

@@ -4,17 +4,17 @@ namespace PixiEditor.Extensions.Wasm.Api.LayoutBuilding;
 
 public class Text : ITextElement<NativeControl>
 {
-    public string Data { get; set; }
+    public string Value { get; set; }
 
-    public Text(string data)
+    public Text(string value)
     {
-        Data = data;
+        Value = value;
     }
 
     NativeControl ILayoutElement<NativeControl>.Build()
     {
         NativeControl text = new NativeControl("Text");
-        text.AddProperty(Data);
+        text.AddProperty(Value);
         return text;
     }
 }

+ 30 - 0
src/PixiEditor.Extensions/LayoutBuilding/Elements/Button.cs

@@ -0,0 +1,30 @@
+using Avalonia.Controls;
+using PixiEditor.Extensions.CommonApi.LayoutBuilding;
+
+namespace PixiEditor.Extensions.LayoutBuilding.Elements;
+
+public class Button : ISingleChildLayoutElement<Control>
+{
+    ILayoutElement<Control> ISingleChildLayoutElement<Control>.Child
+    {
+        get => Content;
+        set => Content = value;
+    }
+
+    public ILayoutElement<Control> Content { get; set; }
+
+    public Button(ILayoutElement<Control> content = null)
+    {
+        Content = content;
+    }
+
+    public Control Build()
+    {
+        return new Avalonia.Controls.Button() { Content = Content.Build() };
+    }
+
+    public void DeserializeProperties(List<object> values)
+    {
+
+    }
+}

+ 2 - 2
src/PixiEditor.Extensions/LayoutBuilding/Elements/Center.cs

@@ -3,7 +3,7 @@ using PixiEditor.Extensions.CommonApi.LayoutBuilding;
 
 namespace PixiEditor.Extensions.LayoutBuilding.Elements;
 
-public class Center : ISingleChildLayoutElement<Control>, IDeserializable
+public class Center : ISingleChildLayoutElement<Control>, IPropertyDeserializable
 {
     public ILayoutElement<Control> Child { get; set; }
 
@@ -25,7 +25,7 @@ public class Center : ISingleChildLayoutElement<Control>, IDeserializable
         };
     }
 
-    void IDeserializable.DeserializeProperties(List<object> values)
+    void IPropertyDeserializable.DeserializeProperties(List<object> values)
     {
 
     }

+ 1 - 1
src/PixiEditor.Extensions/LayoutBuilding/Elements/IDeserializable.cs → src/PixiEditor.Extensions/LayoutBuilding/Elements/IPropertyDeserializable.cs

@@ -3,7 +3,7 @@ using PixiEditor.Extensions.CommonApi.LayoutBuilding;
 
 namespace PixiEditor.Extensions.LayoutBuilding.Elements;
 
-public interface IDeserializable
+public interface IPropertyDeserializable
 {
     public void DeserializeProperties(List<object> values);
 }

+ 2 - 2
src/PixiEditor.Extensions/LayoutBuilding/Elements/Layout.cs

@@ -3,7 +3,7 @@ using PixiEditor.Extensions.CommonApi.LayoutBuilding;
 
 namespace PixiEditor.Extensions.LayoutBuilding.Elements;
 
-public sealed class Layout : ISingleChildLayoutElement<Control>, IDeserializable
+public sealed class Layout : ISingleChildLayoutElement<Control>, IPropertyDeserializable
 {
     public ILayoutElement<Control> Child { get; set; }
 
@@ -17,7 +17,7 @@ public sealed class Layout : ISingleChildLayoutElement<Control>, IDeserializable
         return new Panel { Children = { Child.Build() } };
     }
 
-    void IDeserializable.DeserializeProperties(List<object> values)
+    void IPropertyDeserializable.DeserializeProperties(List<object> values)
     {
 
     }

+ 7 - 4
src/PixiEditor.Extensions/LayoutBuilding/Elements/LayoutConverter.cs

@@ -69,13 +69,16 @@ public static class LayoutConverter
 
     private static ILayoutElement<Control> BuildLayoutElement(int controlId, List<object> properties, List<ILayoutElement<Control>> children)
     {
-        Func<IDeserializable> factory = GlobalControlFactory.Map[controlId];
+        Func<ILayoutElement<Control>> factory = GlobalControlFactory.Map[controlId];
         var element = factory();
         
-        if(element is not ILayoutElement<Control> layoutElement)
+        if(element is not { } layoutElement)
             throw new Exception("Element is not ILayoutElement<Control>");
-        
-        element.DeserializeProperties(properties);
+
+        if (element is IPropertyDeserializable deserializableProperties)
+        {
+            deserializableProperties.DeserializeProperties(properties);
+        }
 
         if (element is ISingleChildLayoutElement<Control> singleChildLayoutElement)
         {

+ 7 - 7
src/PixiEditor.Extensions/LayoutBuilding/Elements/Text.cs

@@ -3,22 +3,22 @@ using PixiEditor.Extensions.CommonApi.LayoutBuilding;
 
 namespace PixiEditor.Extensions.LayoutBuilding.Elements;
 
-public class Text : ITextElement<Control>, IDeserializable
+public class Text : ITextElement<Control>, IPropertyDeserializable
 {
-    public string Data { get; set; }
+    public string Value { get; set; }
 
-    public Text(string data = "")
+    public Text(string value = "")
     {
-        Data = data;
+        Value = value;
     }
 
     Control ILayoutElement<Control>.Build()
     {
-        return new TextBlock { Text = Data };
+        return new TextBlock { Text = Value };
     }
 
-    void IDeserializable.DeserializeProperties(List<object> values)
+    void IPropertyDeserializable.DeserializeProperties(List<object> values)
     {
-        Data = (string)values[0];
+        Value = (string)values[0];
     }
 }

+ 5 - 3
src/PixiEditor.Extensions/LayoutBuilding/GlobalControlFactory.cs

@@ -1,17 +1,19 @@
 using Avalonia.Controls;
 using PixiEditor.Extensions.CommonApi.LayoutBuilding;
 using PixiEditor.Extensions.LayoutBuilding.Elements;
+using Button = PixiEditor.Extensions.LayoutBuilding.Elements.Button;
 
 namespace PixiEditor.Extensions.LayoutBuilding;
 
 public static class GlobalControlFactory
 {
-    public static IReadOnlyDictionary<int, Func<IDeserializable>> Map => map;
+    public static IReadOnlyDictionary<int, Func<ILayoutElement<Control>>> Map => map;
 
-    private static Dictionary<int, Func<IDeserializable>> map = new()
+    private static Dictionary<int, Func<ILayoutElement<Control>>> map = new()
     {
         { 0, () => new Layout() },
         { 1,  () => new Center() },
-        { 2, () => new Text() }
+        { 2, () => new Text() },
+        { 3, () => new Button() }
     };
 }

+ 1 - 1
src/WasmSampleExtension/SampleExtension.cs

@@ -16,7 +16,7 @@ public class SampleExtension : WasmExtension
 
         Layout layout = new Layout(
             new Center(
-                child: new Text("hello sexy.")));
+                child: new Button(new Text("hello sexy."))));
 
         Api.WindowProvider.CreatePopupWindow("WASM SampleExtension", layout.Build());
     }