[NUI] Add methods to modify base theme for fhub and fix bugs
authorJiyun Yang <ji.yang@samsung.com>
Tue, 30 Jan 2024 05:02:50 +0000 (14:02 +0900)
committerdongsug-song <35130733+dongsug-song@users.noreply.github.com>
Thu, 1 Feb 2024 03:50:22 +0000 (12:50 +0900)
* Add ThemeManager.AppendBaseTheme : It enables outer package to modify base theme
* Add SharedResourcePathExtension for xaml supporting
* Fix the bug that broken images in a theme always overwrite existing settings
* Fix the bug that cloning a view style losts SolidNull information.

Signed-off-by: Jiyun Yang <ji.yang@samsung.com>
src/Tizen.NUI/src/public/BaseComponents/Style/ViewStyle.cs
src/Tizen.NUI/src/public/Theme/ThemeManager.cs
src/Tizen.NUI/src/public/Xaml/MarkupExtensions/SharedResourcePathExtension.cs [new file with mode: 0755]

index ee4b502..e927adc 100755 (executable)
@@ -566,6 +566,9 @@ namespace Tizen.NUI.BaseComponents
         {
             var source = other as ViewStyle;
 
+            IncludeDefaultStyle = source.IncludeDefaultStyle;
+            SolidNull = source.SolidNull;
+
             if (source == null || source.DirtyProperties == null || source.DirtyProperties.Count == 0)
             {
                 return;
@@ -594,9 +597,6 @@ namespace Tizen.NUI.BaseComponents
                     InternalSetValue(destinationProperty, sourceValue);
                 }
             }
-
-            IncludeDefaultStyle = source.IncludeDefaultStyle;
-            SolidNull = source.SolidNull;
         }
 
         /// <summary>
index dadb363..9c3ae12 100755 (executable)
@@ -193,9 +193,9 @@ namespace Tizen.NUI
                 newTheme.Id = "NONAME";
             }
 
-            StyleManager.Instance.SetBrokenImageUrl(StyleManager.BrokenImageType.Small, newTheme.SmallBrokenImageUrl ?? "");
-            StyleManager.Instance.SetBrokenImageUrl(StyleManager.BrokenImageType.Normal, newTheme.BrokenImageUrl ?? "");
-            StyleManager.Instance.SetBrokenImageUrl(StyleManager.BrokenImageType.Large, newTheme.LargeBrokenImageUrl ?? "");
+            if (newTheme.SmallBrokenImageUrl != null) StyleManager.Instance.SetBrokenImageUrl(StyleManager.BrokenImageType.Small, newTheme.SmallBrokenImageUrl);
+            if (newTheme.BrokenImageUrl != null) StyleManager.Instance.SetBrokenImageUrl(StyleManager.BrokenImageType.Normal, newTheme.BrokenImageUrl);
+            if (newTheme.LargeBrokenImageUrl != null) StyleManager.Instance.SetBrokenImageUrl(StyleManager.BrokenImageType.Large, newTheme.LargeBrokenImageUrl);
 
             userTheme = newTheme;
             UpdateThemeForInitialize();
@@ -220,15 +220,15 @@ namespace Tizen.NUI
                 newTheme.Id = "NONAME";
             }
 
-            StyleManager.Instance.SetBrokenImageUrl(StyleManager.BrokenImageType.Small, newTheme.SmallBrokenImageUrl ?? "");
-            StyleManager.Instance.SetBrokenImageUrl(StyleManager.BrokenImageType.Normal, newTheme.BrokenImageUrl ?? "");
-            StyleManager.Instance.SetBrokenImageUrl(StyleManager.BrokenImageType.Large, newTheme.LargeBrokenImageUrl ?? "");
+            if (newTheme.SmallBrokenImageUrl != null) StyleManager.Instance.SetBrokenImageUrl(StyleManager.BrokenImageType.Small, newTheme.SmallBrokenImageUrl);
+            if (newTheme.BrokenImageUrl != null) StyleManager.Instance.SetBrokenImageUrl(StyleManager.BrokenImageType.Normal, newTheme.BrokenImageUrl);
+            if (newTheme.LargeBrokenImageUrl != null) StyleManager.Instance.SetBrokenImageUrl(StyleManager.BrokenImageType.Large, newTheme.LargeBrokenImageUrl);
 
-            if (userTheme == null) userTheme = theme;
+            if (userTheme == null) userTheme = newTheme;
             else
             {
                 userTheme = (Theme)userTheme.Clone();
-                userTheme.MergeWithoutClone(theme);
+                userTheme.MergeWithoutClone(newTheme);
             }
 
             UpdateThemeForInitialize();
@@ -237,6 +237,38 @@ namespace Tizen.NUI
         }
 
         /// <summary>
+        /// Append a theme to the current base theme and apply it.
+        /// This will change the appearance of the existing components with property <seealso cref="View.ThemeChangeSensitive"/> on.
+        /// This also affects all components created afterwards.
+        /// </summary>
+        /// <param name="theme">The theme instance to be appended.</param>
+        /// <exception cref="ArgumentNullException">Thrown when the given theme is null.</exception>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static void AppendBaseTheme(Theme theme)
+        {
+            var newTheme = (Theme)theme?.Clone() ?? throw new ArgumentNullException(nameof(theme));
+
+            if (string.IsNullOrEmpty(newTheme.Id))
+            {
+                newTheme.Id = "NONAME";
+            }
+
+            if (newTheme.SmallBrokenImageUrl != null) StyleManager.Instance.SetBrokenImageUrl(StyleManager.BrokenImageType.Small, newTheme.SmallBrokenImageUrl);
+            if (newTheme.BrokenImageUrl != null) StyleManager.Instance.SetBrokenImageUrl(StyleManager.BrokenImageType.Normal, newTheme.BrokenImageUrl);
+            if (newTheme.LargeBrokenImageUrl != null) StyleManager.Instance.SetBrokenImageUrl(StyleManager.BrokenImageType.Large, newTheme.LargeBrokenImageUrl);
+
+            if (baseTheme == null) baseTheme = newTheme;
+            else
+            {
+                baseTheme = (Theme)baseTheme.Clone();
+                baseTheme.MergeWithoutClone(newTheme);
+            }
+
+            UpdateThemeForInitialize();
+            NotifyThemeChanged();
+        }
+
+        /// <summary>
         /// Change tizen theme.
         /// User may change this to one of platform installed one.
         /// Note that this is global theme changing which effects all applications.
diff --git a/src/Tizen.NUI/src/public/Xaml/MarkupExtensions/SharedResourcePathExtension.cs b/src/Tizen.NUI/src/public/Xaml/MarkupExtensions/SharedResourcePathExtension.cs
new file mode 100755 (executable)
index 0000000..cd9084b
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright(c) 2021 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;
+using System.ComponentModel;
+using Tizen.NUI.Binding;
+
+namespace Tizen.NUI.Xaml
+{
+    /// <summary>
+    /// Provide application's shared resource path for xaml.
+    /// </summary>
+    [EditorBrowsable(EditorBrowsableState.Never)]
+    [ContentProperty(nameof(FilePath))]
+    [AcceptEmptyServiceProvider]
+    public class SharedResourcePathExtension : IMarkupExtension<string>
+    {
+        /// <summary>
+        /// Provide application's shared resource path for xaml.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public SharedResourcePathExtension()
+        {
+        }
+
+        /// <summary> User should specify file path as a content of this extension. </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public string FilePath { get; set; }
+
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public string ProvideValue(IServiceProvider serviceProvider) => Tizen.Applications.Application.Current.DirectoryInfo.SharedResource + FilePath;
+
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        object IMarkupExtension.ProvideValue(IServiceProvider serviceProvider)
+        {
+            return (this as IMarkupExtension<string>).ProvideValue(serviceProvider);
+        }
+    }
+}