[NUI] Add Shadow properties to ViewStyle (#1276)
authorJiyun Yang <ji.yang@samsung.com>
Mon, 6 Jan 2020 09:23:08 +0000 (18:23 +0900)
committerGitHub <noreply@github.com>
Mon, 6 Jan 2020 09:23:08 +0000 (18:23 +0900)
Signed-off-by: Jiyun Yang <ji.yang@samsung.com>
src/Tizen.NUI/src/public/BaseComponents/Style/Selector.cs
src/Tizen.NUI/src/public/BaseComponents/Style/ViewStyle.cs
src/Tizen.NUI/src/public/BaseComponents/View.cs
src/Tizen.NUI/src/public/BaseComponents/ViewBindableProperty.cs
src/Tizen.NUI/src/public/ViewProperty/ICloneable.cs [new file with mode: 0644]
src/Tizen.NUI/src/public/ViewProperty/ImageShadow.cs
src/Tizen.NUI/src/public/ViewProperty/Shadow.cs
src/Tizen.NUI/src/public/ViewProperty/TransformablePropertyMap.cs

index 6cef33c..f5d7d32 100755 (executable)
@@ -239,4 +239,56 @@ namespace Tizen.NUI.BaseComponents
         private View targetView;
         private BindableProperty targetBindableProperty;
     }
+
+    internal static class SelectorHelper<T> where T : class, Tizen.NUI.ICloneable
+    {
+        /// <summary>
+        /// For the object type of T or Selector T, convert it to Selector T and return the cloned one.
+        /// Otherwise, return null. <br/>
+        /// </summary>
+        static internal Selector<T> Clone(object value)
+        {
+            var type = value?.GetType();
+
+            if (type == typeof(Selector<T>))
+            {
+                var result = new Selector<T>();
+                result.Clone((Selector<T>)value);
+                return result;
+            }
+
+            if (type == typeof(T))
+            {
+                var result = new Selector<T>();
+                result.Clone((T)value);
+                return result;
+            }
+
+            return null;
+        }
+
+        /// <summary>
+        /// For the object type of T or Selector T, convert it to T and return the cloned one.
+        /// Otherwise, return null. <br/>
+        /// </summary>
+        static internal T Clone(object value, View view)
+        {
+            var type = value?.GetType();
+
+            if (type == typeof(T))
+            {
+                return (T)((T)value).Clone();
+            }
+
+            if (type == typeof(Selector<T>) && view != null)
+            {
+                Selector<T> selector = (Selector<T>)value;
+                T valueInState = selector.GetValue(view.ControlState);
+
+                return (T)valueInState?.Clone();
+            }
+
+            return null;
+        }
+    }
 }
index b55d46e..92b5929 100755 (executable)
@@ -85,6 +85,10 @@ namespace Tizen.NUI.BaseComponents
         private Extents margin;
         private float? weight;
 
+        private Selector<ImageShadow> imageShadow;
+
+        private Selector<Shadow> boxShadow;
+
         static ViewStyle() {}
 
         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
@@ -801,6 +805,32 @@ namespace Tizen.NUI.BaseComponents
             return viewStyle.backgroundImageBorderSelector;
         });
 
+        /// A BindableProperty for ImageShadow
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static readonly BindableProperty ImageShadowProperty = BindableProperty.Create(nameof(ImageShadow), typeof(Selector<ImageShadow>), typeof(ViewStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
+        {
+            var viewStyle = (ViewStyle)bindable;
+            viewStyle.imageShadow = SelectorHelper<ImageShadow>.Clone(newValue);
+        },
+        defaultValueCreator: (bindable) =>
+        {
+            var viewStyle = (ViewStyle)bindable;
+            return viewStyle.imageShadow;
+        });
+
+        /// A BindableProperty for BoxShadow
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static readonly BindableProperty BoxShadowProperty = BindableProperty.Create(nameof(BoxShadow), typeof(Selector<ImageShadow>), typeof(ViewStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
+        {
+            var viewStyle = (ViewStyle)bindable;
+            viewStyle.boxShadow = SelectorHelper<Shadow>.Clone(newValue);
+        },
+        defaultValueCreator: (bindable) =>
+        {
+            var viewStyle = (ViewStyle)bindable;
+            return viewStyle.boxShadow;
+        });
+
         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
         [EditorBrowsable(EditorBrowsableState.Never)]
         public ViewStyle()
@@ -1321,5 +1351,33 @@ namespace Tizen.NUI.BaseComponents
             }
             set => SetValue(BackgroundImageBorderSelectorProperty, value);
         }
+
+        /// <summary>
+        /// Describes a shadow as an image for a View.
+        /// It is null by default.
+        /// </summary>
+        /// <remarks>
+        /// The mutually exclusive with "BoxShadow".
+        /// </remarks>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public Selector<ImageShadow> ImageShadow
+        {
+            get => (Selector<ImageShadow>)GetValue(ImageShadowProperty);
+            set => SetValue(ImageShadowProperty, value);
+        }
+
+        /// <summary>
+        /// Describes a box shaped shadow drawing for a View.
+        /// It is null by default.
+        /// </summary>
+        /// <remarks>
+        /// The mutually exclusive with "ImageShadow".
+        /// </remarks>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public Selector<Shadow> BoxShadow
+        {
+            get => (Selector<Shadow>)GetValue(BoxShadowProperty);
+            set => SetValue(BoxShadowProperty, value);
+        }
     }
 }
index dec6ddb..c513026 100755 (executable)
@@ -301,46 +301,44 @@ namespace Tizen.NUI.BaseComponents
         }
 
         /// <summary>
-        /// Describes a shadow as an image for View.
+        /// Describes a shadow as an image for View.
         /// It is null by default.
         /// </summary>
         /// <remarks>
         /// The mutually exclusive with "BoxShadow".
-        /// If it is not null, the "BoxShadow" property will be ignored.
         /// </remarks>
         [EditorBrowsable(EditorBrowsableState.Never)]
         public ImageShadow ImageShadow
         {
             get
             {
-                return (ImageShadow)GetValue(ImageShadowProperty);
+                var value = (ImageShadow)GetValue(ImageShadowProperty);
+                return value == null ? null : new ImageShadow(value, OnImageShadowChanged);
             }
             set
             {
-                value.OnPropertyChanged = OnImageShadowChanged;
                 SetValue(ImageShadowProperty, value);
                 NotifyPropertyChanged();
             }
         }
 
         /// <summary>
-        /// Describes a box shaped shadow drawing for View.
+        /// Describes a box shaped shadow drawing for View.
         /// It is null by default.
         /// </summary>
         /// <remarks>
         /// The mutually exclusive with "ImageShadow".
-        /// If the "ImageShadow" is not null, this property will be ignored.
         /// </remarks>
         [EditorBrowsable(EditorBrowsableState.Never)]
         public Shadow BoxShadow
         {
             get
             {
-                return (Shadow)GetValue(BoxShadowProperty);
+                var value = (Shadow)GetValue(BoxShadowProperty);
+                return value == null ? null : new Shadow(value, OnBoxShadowChanged);
             }
             set
             {
-                value.OnPropertyChanged = OnBoxShadowChanged;
                 SetValue(BoxShadowProperty, value);
                 NotifyPropertyChanged();
             }
index a185bd6..59d7fe2 100755 (executable)
@@ -1383,7 +1383,7 @@ namespace Tizen.NUI.BaseComponents
         public static readonly BindableProperty ImageShadowProperty = BindableProperty.Create("ImageShadow", typeof(ImageShadow), typeof(View), null, propertyChanged: (bindable, oldValue, newValue) =>
         {
             var view = (View)bindable;
-            view.imageShadow = (ImageShadow)newValue;
+            view.imageShadow = SelectorHelper<ImageShadow>.Clone(newValue, view);
             Tizen.NUI.Object.SetProperty(view.swigCPtr, Interop.ViewProperty.View_Property_SHADOW_get(), ImageShadow.ToPropertyValue(view.imageShadow));
         },
         defaultValueCreator: (bindable) =>
@@ -1398,11 +1398,8 @@ namespace Tizen.NUI.BaseComponents
         public static readonly BindableProperty BoxShadowProperty = BindableProperty.Create("BoxShadow", typeof(Shadow), typeof(View), null, propertyChanged: (bindable, oldValue, newValue) =>
         {
             var view = (View)bindable;
-            view.boxShadow = (Shadow)newValue;
-            if (view.imageShadow == null)
-            {
-                Tizen.NUI.Object.SetProperty(view.swigCPtr, Interop.ViewProperty.View_Property_SHADOW_get(), Shadow.ToPropertyValue(view.boxShadow));
-            }
+            view.boxShadow = SelectorHelper<Shadow>.Clone(newValue, view);
+            Tizen.NUI.Object.SetProperty(view.swigCPtr, Interop.ViewProperty.View_Property_SHADOW_get(), Shadow.ToPropertyValue(view.boxShadow));
         },
         defaultValueCreator: (bindable) =>
         {
diff --git a/src/Tizen.NUI/src/public/ViewProperty/ICloneable.cs b/src/Tizen.NUI/src/public/ViewProperty/ICloneable.cs
new file mode 100644 (file)
index 0000000..4304e7e
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright(c) 2020 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+using System.ComponentModel;
+
+namespace Tizen.NUI
+{
+
+    /// <summary>
+    /// The class that offer Clone method.
+    /// </summary>
+    [EditorBrowsable(EditorBrowsableState.Never)]
+    public interface ICloneable
+    {
+        /// <summary>
+        /// Clone object
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        object Clone();
+    }
+}
+
+
index 5bf2d85..9e03c5c 100644 (file)
@@ -24,7 +24,7 @@ namespace Tizen.NUI
     /// The Shadow composed of image for View
     /// </summary>
     [EditorBrowsable(EditorBrowsableState.Never)]
-    public class ImageShadow : TransformablePropertyMap
+    public class ImageShadow : TransformablePropertyMap, Tizen.NUI.ICloneable
     {
         private string url;
 
@@ -38,11 +38,18 @@ namespace Tizen.NUI
         {
         }
 
+        internal ImageShadow(ImageShadow other, PropertyChangedCallback callback = null) : base(other)
+        {
+            Url = other.Url;
+            Border = other.Border;
+            OnPropertyChanged = callback;
+        }
+
         /// <summary>
         /// Deep copy method
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        override public object Clone()
+        public object Clone()
         {
             return new ImageShadow() {
                 Offset = offset,
index 18b6fe7..3bbb610 100644 (file)
@@ -24,7 +24,7 @@ namespace Tizen.NUI
     /// The platform provided shadow drawing for View
     /// </summary>
     [EditorBrowsable(EditorBrowsableState.Never)]
-    public class Shadow : TransformablePropertyMap
+    public class Shadow : TransformablePropertyMap, Tizen.NUI.ICloneable
     {
         private static readonly Color noColor = new Color(0, 0, 0, 0);
 
@@ -43,6 +43,13 @@ namespace Tizen.NUI
             Color = defaultColor;
         }
 
+        internal Shadow(Shadow other, PropertyChangedCallback callback = null) : base(other)
+        {
+            Color = other.Color;
+            BlurRadius = other.BlurRadius;
+            OnPropertyChanged = callback;
+        }
+
         /// <summary>
         /// The boolean conversion
         /// </summary>
@@ -60,7 +67,7 @@ namespace Tizen.NUI
         /// Deep copy method
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        override public object Clone()
+        public object Clone()
         {
             return new Shadow() {
                 Offset = offset,
index b5e46d2..84f4ec0 100644 (file)
@@ -186,12 +186,6 @@ namespace Tizen.NUI
 
         abstract internal bool IsValid();
 
-        /// <summary>
-        /// Deep copy method
-        /// </summary>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        abstract public object Clone();
-
         static internal PropertyValue ToPropertyValue(TransformablePropertyMap instance)
         {
             return (instance != null && instance.IsValid()) ? new PropertyValue(instance.propertyMap) : new PropertyValue();