Selaa lähdekoodia

Added check box

flabbet 1 vuosi sitten
vanhempi
commit
05e09bf649

+ 5 - 0
samples/Sample7_FlyUI/WindowContentElement.cs

@@ -1,4 +1,5 @@
 using PixiEditor.Extensions.CommonApi.FlyUI.Properties;
+using PixiEditor.Extensions.Sdk;
 using PixiEditor.Extensions.Sdk.Api.FlyUI;
 using PixiEditor.Extensions.Sdk.Api.Window;
 
@@ -31,6 +32,10 @@ public class WindowContentElement : StatelessElement
                                 filterQuality: FilterQuality.None,
                                 width: 256, height: 256))
                     ),
+                    new CheckBox(new Text("heloo"), onCheckedChanged: args =>
+                    {
+                        PixiEditorExtension.Api.Logger.Log(((CheckBox)args.Sender).IsChecked ? "Checked" : "Unchecked");
+                    }),
                     new Center(
                         new Button(
                             child: new Text("Close"), onClick: _ =>

+ 1 - 0
src/PixiEditor.Extensions.CommonApi/FlyUI/Events/ElementEventArgs.cs

@@ -2,6 +2,7 @@
 
 public class ElementEventArgs
 {
+    public object Sender { get; set; } 
     public static ElementEventArgs Empty { get; } = new ElementEventArgs();
 }
 

+ 11 - 0
src/PixiEditor.Extensions.CommonApi/FlyUI/Events/ToggleEventArgs.cs

@@ -0,0 +1,11 @@
+namespace PixiEditor.Extensions.CommonApi.FlyUI.Events;
+
+public class ToggleEventArgs : ElementEventArgs<ToggleEventArgs>
+{
+    public bool IsToggled { get; }
+
+    public ToggleEventArgs(bool isToggled)
+    {
+        IsToggled = isToggled;
+    }
+}

+ 44 - 0
src/PixiEditor.Extensions.Sdk/Api/FlyUI/CheckBox.cs

@@ -0,0 +1,44 @@
+using PixiEditor.Extensions.CommonApi.FlyUI;
+using PixiEditor.Extensions.CommonApi.FlyUI.Events;
+
+namespace PixiEditor.Extensions.Sdk.Api.FlyUI;
+
+public class CheckBox : SingleChildLayoutElement
+{
+    public event ElementEventHandler CheckedChanged
+    {
+        add => AddEvent(nameof(CheckedChanged), value);
+        remove => RemoveEvent(nameof(CheckedChanged), value);
+    }
+
+    public bool IsChecked { get; set; }
+
+    public CheckBox(ILayoutElement<CompiledControl> child = null, ElementEventHandler onCheckedChanged = null)
+    {
+        Child = child;
+        
+        if (onCheckedChanged != null)
+        {
+            CheckedChanged += (args) =>
+            {
+                IsChecked = !IsChecked;
+                onCheckedChanged(args);
+            };
+        }
+        else
+        {
+            CheckedChanged += args => IsChecked = !IsChecked;
+        }
+    }
+
+
+    public override CompiledControl BuildNative()
+    {
+        CompiledControl checkbox = new CompiledControl(UniqueId, "CheckBox");
+        if (Child != null)
+            checkbox.AddChild(Child.BuildNative());
+
+        BuildPendingEvents(checkbox);
+        return checkbox;
+    }
+}

+ 31 - 0
src/PixiEditor.Extensions.Sdk/Api/FlyUI/LayoutElement.cs

@@ -37,6 +37,22 @@ public abstract class LayoutElement : ILayoutElement<CompiledControl>
         _events[eventName].Add(eventHandler);
         BuildQueuedEvents.Add(eventName);
     }
+    
+    /*public void AddEvent<TEventArgs>(string eventName, ElementEventHandler<TEventArgs> eventHandler) where TEventArgs : ElementEventArgs<TEventArgs>
+    {
+        if (_events == null)
+        {
+            _events = new Dictionary<string, List<ElementEventHandler>>();
+        }
+
+        if (!_events.ContainsKey(eventName))
+        {
+            _events.Add(eventName, new List<ElementEventHandler>());
+        }
+
+        _events[eventName].Add((args => eventHandler((TEventArgs)args))); 
+        BuildQueuedEvents.Add(eventName);
+    }*/
 
     public void RemoveEvent(string eventName, ElementEventHandler eventHandler)
     {
@@ -52,6 +68,21 @@ public abstract class LayoutElement : ILayoutElement<CompiledControl>
 
         _events[eventName].Remove(eventHandler);
     }
+    
+    /*public void RemoveEvent<TEventArgs>(string eventName, ElementEventHandler<TEventArgs> eventHandler) where TEventArgs : ElementEventArgs<TEventArgs>
+    {
+        if (_events == null)
+        {
+            return;
+        }
+
+        if (!_events.ContainsKey(eventName))
+        {
+            return;
+        }
+
+        _events[eventName].Remove((args => eventHandler((TEventArgs)args)));
+    }*/
 
     public void RaiseEvent(string eventName, ElementEventArgs args)
     {

+ 1 - 1
src/PixiEditor.Extensions.Sdk/Bridge/Native.cs

@@ -54,7 +54,7 @@ internal static partial class Native
     {
         if (LayoutElementsStore.LayoutElements.TryGetValue((int)internalControlId, out ILayoutElement<CompiledControl> element))
         {
-            element.RaiseEvent(eventName ?? "", new ElementEventArgs());
+            element.RaiseEvent(eventName ?? "", new ElementEventArgs { Sender = element });
         }
     }
 

+ 1 - 1
src/PixiEditor.Extensions/FlyUI/Elements/Button.cs

@@ -33,7 +33,7 @@ public class Button : SingleChildLayoutElement
         Binding binding = new Binding(nameof(Child)) { Source = this, Converter = LayoutElementToNativeControlConverter.Instance };
         btn.Bind(Avalonia.Controls.Button.ContentProperty, binding);
 
-        btn.Click += (sender, args) => RaiseEvent(nameof(Click), new ElementEventArgs());
+        btn.Click += (sender, args) => RaiseEvent(nameof(Click), new ElementEventArgs() { Sender = this });
 
         return btn;
     }

+ 29 - 0
src/PixiEditor.Extensions/FlyUI/Elements/CheckBox.cs

@@ -0,0 +1,29 @@
+using Avalonia.Controls;
+using Avalonia.Data;
+using PixiEditor.Extensions.CommonApi.FlyUI.Events;
+
+namespace PixiEditor.Extensions.FlyUI.Elements;
+
+public class CheckBox : SingleChildLayoutElement
+{
+    
+    public event ElementEventHandler<ToggleEventArgs> CheckedChanged
+    {
+        add => AddEvent(nameof(CheckedChanged), value);
+        remove => RemoveEvent(nameof(CheckedChanged), value);
+    }
+
+    public override Control BuildNative()
+    {
+        Avalonia.Controls.CheckBox checkbox = new Avalonia.Controls.CheckBox();
+        Binding binding =
+            new Binding(nameof(Child)) { Source = this, Converter = LayoutElementToNativeControlConverter.Instance };
+        checkbox.Bind(ContentControl.ContentProperty, binding);
+
+        checkbox.IsCheckedChanged += (sender, args) => RaiseEvent(
+            nameof(CheckedChanged),
+            new ToggleEventArgs((sender as Avalonia.Controls.CheckBox).IsChecked.Value) { Sender = this });
+
+        return checkbox;
+    }
+}

+ 30 - 0
src/PixiEditor.Extensions/FlyUI/Elements/LayoutElement.cs

@@ -27,6 +27,21 @@ public abstract class LayoutElement : ILayoutElement<Control>, INotifyPropertyCh
 
         _events[eventName].Add(eventHandler);
     }
+    
+    public void AddEvent<T>(string eventName, ElementEventHandler<T> eventHandler) where T : ElementEventArgs<T>
+    {
+        if (_events == null)
+        {
+            _events = new Dictionary<string, List<ElementEventHandler>>();
+        }
+
+        if (!_events.ContainsKey(eventName))
+        {
+            _events.Add(eventName, new List<ElementEventHandler>());
+        }
+
+        _events[eventName].Add((args => eventHandler((T)args)));
+    }
 
     public void RemoveEvent(string eventName, ElementEventHandler eventHandler)
     {
@@ -42,6 +57,21 @@ public abstract class LayoutElement : ILayoutElement<Control>, INotifyPropertyCh
 
         _events[eventName].Remove(eventHandler);
     }
+    
+    public void RemoveEvent<T>(string eventName, ElementEventHandler<T> eventHandler) where T : ElementEventArgs<T>
+    {
+        if (_events == null)
+        {
+            return;
+        }
+
+        if (!_events.ContainsKey(eventName))
+        {
+            return;
+        }
+
+        _events[eventName].Remove((args => eventHandler((T)args)));
+    }
 
     public void RaiseEvent(string eventName, ElementEventArgs args)
     {