From 7e5def660d01359c5d21b18d854172811e6fa099 Mon Sep 17 00:00:00 2001 From: Jiyun Yang Date: Tue, 30 Jan 2024 14:02:50 +0900 Subject: [PATCH] [NUI] Add methods to modify base theme for fhub and fix bugs * 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 --- .../src/public/BaseComponents/Style/ViewStyle.cs | 6 +-- src/Tizen.NUI/src/public/Theme/ThemeManager.cs | 48 +++++++++++++++---- .../SharedResourcePathExtension.cs | 55 ++++++++++++++++++++++ 3 files changed, 98 insertions(+), 11 deletions(-) create mode 100755 src/Tizen.NUI/src/public/Xaml/MarkupExtensions/SharedResourcePathExtension.cs diff --git a/src/Tizen.NUI/src/public/BaseComponents/Style/ViewStyle.cs b/src/Tizen.NUI/src/public/BaseComponents/Style/ViewStyle.cs index ee4b502..e927adc 100755 --- a/src/Tizen.NUI/src/public/BaseComponents/Style/ViewStyle.cs +++ b/src/Tizen.NUI/src/public/BaseComponents/Style/ViewStyle.cs @@ -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; } /// diff --git a/src/Tizen.NUI/src/public/Theme/ThemeManager.cs b/src/Tizen.NUI/src/public/Theme/ThemeManager.cs index 5f253da..db8e862 100755 --- a/src/Tizen.NUI/src/public/Theme/ThemeManager.cs +++ b/src/Tizen.NUI/src/public/Theme/ThemeManager.cs @@ -192,9 +192,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(); @@ -219,15 +219,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(); @@ -236,6 +236,38 @@ namespace Tizen.NUI } /// + /// Append a theme to the current base theme and apply it. + /// This will change the appearance of the existing components with property on. + /// This also affects all components created afterwards. + /// + /// The theme instance to be appended. + /// Thrown when the given theme is null. + [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(); + } + + /// /// 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 index 0000000..cd9084b --- /dev/null +++ b/src/Tizen.NUI/src/public/Xaml/MarkupExtensions/SharedResourcePathExtension.cs @@ -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 +{ + /// + /// Provide application's shared resource path for xaml. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + [ContentProperty(nameof(FilePath))] + [AcceptEmptyServiceProvider] + public class SharedResourcePathExtension : IMarkupExtension + { + /// + /// Provide application's shared resource path for xaml. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public SharedResourcePathExtension() + { + } + + /// User should specify file path as a content of this extension. + [EditorBrowsable(EditorBrowsableState.Never)] + public string FilePath { get; set; } + + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public string ProvideValue(IServiceProvider serviceProvider) => Tizen.Applications.Application.Current.DirectoryInfo.SharedResource + FilePath; + + /// + [EditorBrowsable(EditorBrowsableState.Never)] + object IMarkupExtension.ProvideValue(IServiceProvider serviceProvider) + { + return (this as IMarkupExtension).ProvideValue(serviceProvider); + } + } +} -- 2.7.4