diff --git a/adapter/ohos/entrance/ace_container.cpp b/adapter/ohos/entrance/ace_container.cpp index 18a883f8eb87795a6d4575b9cd2ea880be23fe17..d95c8772f84964c8e3a06586b22a31453fd5f1bf 100644 --- a/adapter/ohos/entrance/ace_container.cpp +++ b/adapter/ohos/entrance/ace_container.cpp @@ -3197,6 +3197,10 @@ void AceContainer::UpdateColorMode(uint32_t colorMode) { ACE_SCOPED_TRACE("AceContainer::UpdateColorMode %u", colorMode); CHECK_NULL_VOID(pipelineContext_); + if (SystemProperties::ConfigChangePerform()) { + pipelineContext_->ClearImageCache(); + NG::ImageDecoder::ClearPixelMapCache(); + } auto themeManager = pipelineContext_->GetThemeManager(); CHECK_NULL_VOID(themeManager); if (!IsUseCustomBg() && !IsTransparentBg()) { diff --git a/frameworks/bridge/declarative_frontend/jsview/js_data_panel.cpp b/frameworks/bridge/declarative_frontend/jsview/js_data_panel.cpp index 191520b88153a1f1f5e5dc52d48c4e1f87f2f59e..ff21602f68afc37ad4578d58de28333fb776a728 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_data_panel.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_data_panel.cpp @@ -23,6 +23,7 @@ #include "bridge/declarative_frontend/jsview/js_utils.h" #include "bridge/declarative_frontend/jsview/js_view_abstract.h" #include "bridge/declarative_frontend/jsview/models/data_panel_model_impl.h" +#include "core/common/resource/resource_parse_utils.h" #include "core/components/data_panel/data_panel_theme.h" #include "core/components_ng/base/view_abstract_model.h" #include "core/components_ng/pattern/data_panel/data_panel_model.h" @@ -260,13 +261,12 @@ void JSDataPanel::ShadowOption(const JSCallbackInfo& info) JSRef jsRadius = paramObject->GetProperty("radius"); JSRef jsOffsetX = paramObject->GetProperty("offsetX"); JSRef jsOffsetY = paramObject->GetProperty("offsetY"); - ParseJsDouble(jsRadius, radius); - if (NonPositive(radius)) { - radius = theme->GetTrackShadowRadius().ConvertToVp(); - } - ParseJsDouble(jsOffsetX, offsetX); - ParseJsDouble(jsOffsetY, offsetY); - + RefPtr resR; + RefPtr resX; + RefPtr resY; + HandleShadowRadius(jsRadius, radius, resR, shadow); + HandleShadowOffsetX(jsOffsetX, offsetX, resX, shadow); + HandleShadowOffsetY(jsOffsetY, offsetY, resY, shadow); auto colors = paramObject->GetProperty("colors"); if (!colors->IsArray()) { shadow.radius = radius; @@ -276,18 +276,7 @@ void JSDataPanel::ShadowOption(const JSCallbackInfo& info) DataPanelModel::GetInstance()->SetShadowOption(shadow); return; } - shadowColors.clear(); - auto colorsArray = JSRef::Cast(colors); - for (size_t i = 0; i < colorsArray->Length(); ++i) { - auto item = colorsArray->GetValueAt(i); - OHOS::Ace::NG::Gradient gradient; - if (!ConvertGradientColor(item, gradient)) { - shadowColors.clear(); - ConvertThemeColor(shadowColors); - break; - } - shadowColors.emplace_back(gradient); - } + ParseShadowColors(colors, shadowColors); } shadow.radius = radius; @@ -324,9 +313,27 @@ bool JSDataPanel::ConvertGradientColor(const JsiRef& itemParam, OHOS:: bool JSDataPanel::ConvertResourceColor(const JsiRef& itemParam, OHOS::Ace::NG::Gradient& gradient) { Color color; - if (!ParseJsColor(itemParam, color)) { + RefPtr resObj; + if (!ParseJsColor(itemParam, color, resObj)) { return false; } + + if (resObj && SystemProperties::ConfigChangePerform()) { + std::string key = "gradient.Color"; + gradient.AddResource(key, resObj, [](const RefPtr& resObj, NG::Gradient& gradient) { + Color color; + ResourceParseUtils::ParseResColor(resObj, color); + gradient.ClearColors(); + NG::GradientColor startColor; + startColor.SetLinearColor(LinearColor(color)); + startColor.SetDimension(Dimension(0.0)); + NG::GradientColor endColor; + endColor.SetLinearColor(LinearColor(color)); + endColor.SetDimension(Dimension(1.0)); + gradient.AddColor(startColor); + gradient.AddColor(endColor); + }); + } OHOS::Ace::NG::GradientColor gradientColorStart; gradientColorStart.SetLinearColor(LinearColor(color)); gradientColorStart.SetDimension(Dimension(0.0)); @@ -376,4 +383,75 @@ void JSDataPanel::BorderRadius(const JSCallbackInfo& info) JSViewAbstract::ParseBorderRadius(info[0]); } } + +void JSDataPanel::ParseShadowColors(const JSRef& colors, std::vector& shadowColors) +{ + shadowColors.clear(); + auto colorsArray = JSRef::Cast(colors); + for (size_t i = 0; i < colorsArray->Length(); ++i) { + auto item = colorsArray->GetValueAt(i); + OHOS::Ace::NG::Gradient gradient; + if (!ConvertGradientColor(item, gradient)) { + shadowColors.clear(); + ConvertThemeColor(shadowColors); + break; + } + shadowColors.emplace_back(gradient); + } +} + +void JSDataPanel::HandleShadowRadius( + const JSRef& jsRadius, double& radius, RefPtr& resR, OHOS::Ace::NG::DataPanelShadow& shadow) +{ + RefPtr theme = GetTheme(); + ParseJsDouble(jsRadius, radius, resR); + if (resR && SystemProperties::ConfigChangePerform()) { + auto&& updateFunc = [](const RefPtr& resRadius, OHOS::Ace::NG::DataPanelShadow& shadow) { + RefPtr theme = GetTheme(); + double radius = theme->GetTrackShadowRadius().ConvertToVp(); + ResourceParseUtils::ParseResDouble(resRadius, radius); + if (NonPositive(radius)) { + radius = theme->GetTrackShadowRadius().ConvertToVp(); + } + shadow.SetRadius(radius); + }; + shadow.AddResource("shadow.radius", resR, std::move(updateFunc)); + } else { + if (NonPositive(radius)) { + radius = theme->GetTrackShadowRadius().ConvertToVp(); + } + } +} + +void JSDataPanel::HandleShadowOffsetX(const JSRef& jsOffsetX, double& offsetX, RefPtr& resX, + OHOS::Ace::NG::DataPanelShadow& shadow) +{ + RefPtr theme = GetTheme(); + ParseJsDouble(jsOffsetX, offsetX, resX); + if (resX && SystemProperties::ConfigChangePerform()) { + auto&& updateFuncX = [](const RefPtr& resObj, OHOS::Ace::NG::DataPanelShadow& shadow) { + RefPtr theme = GetTheme(); + double val = theme->GetTrackShadowOffsetX().ConvertToVp(); + ResourceParseUtils::ParseResDouble(resObj, val); + shadow.SetOffsetX(val); + }; + shadow.AddResource("shadow.offsetX", resX, std::move(updateFuncX)); + } +} + +void JSDataPanel::HandleShadowOffsetY(const JSRef& jsOffsetY, double& offsetY, RefPtr& resY, + OHOS::Ace::NG::DataPanelShadow& shadow) +{ + RefPtr theme = GetTheme(); + ParseJsDouble(jsOffsetY, offsetY, resY); + if (resY && SystemProperties::ConfigChangePerform()) { + auto&& updateFuncY = [](const RefPtr& resObj, OHOS::Ace::NG::DataPanelShadow& shadow) { + RefPtr theme = GetTheme(); + double val = theme->GetTrackShadowOffsetY().ConvertToVp(); + ResourceParseUtils::ParseResDouble(resObj, val); + shadow.SetOffsetY(val); + }; + shadow.AddResource("shadow.offsetY", resY, std::move(updateFuncY)); + } +} } // namespace OHOS::Ace::Framework diff --git a/frameworks/bridge/declarative_frontend/jsview/js_data_panel.h b/frameworks/bridge/declarative_frontend/jsview/js_data_panel.h index fa824fa760f45c687be4c1582d452e7da957cdd5..48b0625ee73883089a4915f846e2139beeda4123 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_data_panel.h +++ b/frameworks/bridge/declarative_frontend/jsview/js_data_panel.h @@ -17,6 +17,7 @@ #define FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_JS_VIEW_JS_DATA_PANEL_H #include "bridge/declarative_frontend/jsview/js_view_abstract.h" +#include "core/components_ng/pattern/data_panel/data_panel_paint_property.h" namespace OHOS::Ace::Framework { class JSDataPanel : public JSViewAbstract { @@ -29,6 +30,13 @@ public: static void StrokeWidth(const JSCallbackInfo& info); static void ShadowOption(const JSCallbackInfo& info); static void BorderRadius(const JSCallbackInfo& info); + static void ParseShadowColors(const JSRef& colors, std::vector& shadowColors); + static void HandleShadowRadius(const JSRef& jsRadius, double& radius, RefPtr& resR, + OHOS::Ace::NG::DataPanelShadow& shadow); + static void HandleShadowOffsetX(const JSRef& jsOffsetX, double& offsetX, RefPtr& resX, + OHOS::Ace::NG::DataPanelShadow& shadow); + static void HandleShadowOffsetY(const JSRef& jsOffsetY, double& offsetY, RefPtr& resY, + OHOS::Ace::NG::DataPanelShadow& shadow); private: static bool ConvertGradientColor(const JsiRef& itemParam, OHOS::Ace::NG::Gradient& gradient); diff --git a/frameworks/bridge/declarative_frontend/jsview/js_image_animator.cpp b/frameworks/bridge/declarative_frontend/jsview/js_image_animator.cpp index 11260897676930777855da8ae8eb79cc87db6c18..4eefd831a3fc289bea485fd79546f7764795b670 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_image_animator.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_image_animator.cpp @@ -281,9 +281,6 @@ void JSImageAnimator::ParseImages(const JSRef& image, ImageProperties& im ParseJsDimensionVp(jsObjImage->GetProperty("top"), imageProperties.top); ParseJsDimensionVp(jsObjImage->GetProperty("left"), imageProperties.left); ParseJsInt32(jsObjImage->GetProperty("duration"), imageProperties.duration); - if (SystemProperties::ConfigChangePerform() && resObj) { - ImageModel::GetInstance()->CreateWithResourceObj(ImageResourceType::SRC, resObj); - } } } // namespace OHOS::Ace::Framework diff --git a/frameworks/core/components_ng/pattern/data_panel/data_panel_model_ng.cpp b/frameworks/core/components_ng/pattern/data_panel/data_panel_model_ng.cpp index 6a0e51af0a96602c439c2c521aa4cd29921df8a2..f59389fef8b18cfbee158dcac4f524f9d4bf5057 100644 --- a/frameworks/core/components_ng/pattern/data_panel/data_panel_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/data_panel/data_panel_model_ng.cpp @@ -15,7 +15,9 @@ #include "core/components_ng/pattern/data_panel/data_panel_model_ng.h" +#include "core/common/resource/resource_manager.h" #include "core/common/resource/resource_parse_utils.h" +#include "core/common/resource/resource_wrapper.h" #include "core/components_ng/base/view_abstract.h" #include "core/components_ng/base/view_stack_processor.h" #include "core/components_ng/pattern/data_panel/data_panel_pattern.h" @@ -64,6 +66,20 @@ void DataPanelModelNG::SetEffect(bool isCloseEffect) void DataPanelModelNG::SetValueColors(const std::vector& valueColors) { + auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); + auto pattern = frameNode->GetPattern(); + RefPtr resObj = AceType::MakeRefPtr("", "", -1); + auto&& updateFunc = [valueColors, weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { + auto frameNode = weak.Upgrade(); + if (!frameNode) { + return; + } + for (auto& gradient : const_cast&>(valueColors)) { + gradient.ReloadResources(); + } + ACE_UPDATE_NODE_PAINT_PROPERTY(DataPanelPaintProperty, ValueColors, valueColors, frameNode); + }; + pattern->AddResObj("dataPanel.ValueColors", resObj, std::move(updateFunc)); ACE_UPDATE_PAINT_PROPERTY(DataPanelPaintProperty, ValueColors, valueColors); } @@ -79,6 +95,19 @@ void DataPanelModelNG::SetStrokeWidth(const Dimension& strokeWidth) void DataPanelModelNG::SetShadowOption(const DataPanelShadow& shadowOption) { + auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); + auto pattern = frameNode->GetPattern(); + RefPtr resObj = AceType::MakeRefPtr("", "", -1); + auto&& updateFunc = [shadowOption, weak = AceType::WeakClaim(frameNode)](const RefPtr& resObj) { + auto frameNode = weak.Upgrade(); + if (!frameNode) { + return; + } + DataPanelShadow& shadowValue = const_cast(shadowOption); + shadowValue.ReloadResources(); + ACE_UPDATE_NODE_PAINT_PROPERTY(DataPanelPaintProperty, ShadowOption, shadowValue, frameNode); + }; + pattern->AddResObj("dataPanel.ShadowOption", resObj, std::move(updateFunc)); ACE_UPDATE_PAINT_PROPERTY(DataPanelPaintProperty, ShadowOption, shadowOption); } diff --git a/frameworks/core/components_ng/pattern/data_panel/data_panel_paint_property.h b/frameworks/core/components_ng/pattern/data_panel/data_panel_paint_property.h index 43389e607e59981396f66fd6abdcce06aabedb83..6a2b4d7a3c131034b1905a4da9a01ea4fc6e324a 100644 --- a/frameworks/core/components_ng/pattern/data_panel/data_panel_paint_property.h +++ b/frameworks/core/components_ng/pattern/data_panel/data_panel_paint_property.h @@ -16,6 +16,7 @@ #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_DATA_PANEL_DATA_PANEL_PAINT_PROPERTY_H #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_DATA_PANEL_DATA_PANEL_PAINT_PROPERTY_H +#include "core/common/resource/resource_object.h" #include "core/components/common/layout/constants.h" #include "core/components/common/properties/color.h" #include "core/components/data_panel/data_panel_theme.h" @@ -36,6 +37,56 @@ struct DataPanelShadow { return radius == rhs.radius && offsetX == rhs.offsetX && offsetY == rhs.offsetY && colors == rhs.colors && isShadowVisible == rhs.isShadowVisible; } + + struct ResourceUpdater { + RefPtr resObj; + std::function&, DataPanelShadow&)> updateFunc; + }; + std::unordered_map resMap_; + + void AddResource(const std::string& key, const RefPtr& resObj, + std::function&, DataPanelShadow&)>&& updateFunc) + { + if (resObj == nullptr || !updateFunc) { + return; + } + resMap_[key] = { resObj, std::move(updateFunc) }; + } + + void ReloadResources() + { + for (const auto& [key, resourceUpdater] : resMap_) { + resourceUpdater.updateFunc(resourceUpdater.resObj, *this); + } + for (auto& grad : colors) { + grad.ReloadResources(); + } + } + + void SetIsShadowVisible(bool isVisible) + { + isShadowVisible = isVisible; + } + + void SetRadius(double radiusValue) + { + radius = radiusValue; + } + + void SetOffsetX(double offsetXValue) + { + offsetX = offsetXValue; + } + + void SetOffsetY(double offsetYValue) + { + offsetY = offsetYValue; + } + + void SetColors(const std::vector& colorList) + { + colors = colorList; + } }; class DataPanelPaintProperty : public PaintProperty { DECLARE_ACE_TYPE(DataPanelPaintProperty, PaintProperty) diff --git a/frameworks/core/components_ng/pattern/data_panel/data_panel_pattern.cpp b/frameworks/core/components_ng/pattern/data_panel/data_panel_pattern.cpp index b46e02987f75f18899521c8b25ec8061cd034916..2f8eb1afe347d0458909cf0190f9fc1e9fec5183 100644 --- a/frameworks/core/components_ng/pattern/data_panel/data_panel_pattern.cpp +++ b/frameworks/core/components_ng/pattern/data_panel/data_panel_pattern.cpp @@ -159,4 +159,17 @@ void DataPanelPattern::UpdateStrokeWidth(const CalcDimension& strokeWidth, bool host->MarkDirtyNode(PROPERTY_UPDATE_RENDER); } } + +void DataPanelPattern::OnColorModeChange(uint32_t colorMode) +{ + Pattern::OnColorModeChange(colorMode); + auto host = GetHost(); + CHECK_NULL_VOID(host); + auto pipelineContext = host->GetContext(); + CHECK_NULL_VOID(pipelineContext); + if (host->GetRerenderable()) { + host->MarkModifyDone(); + host->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF); + } +} } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/data_panel/data_panel_pattern.h b/frameworks/core/components_ng/pattern/data_panel/data_panel_pattern.h index ea72d205ca139cc60555cf350151881d758e1864..cd2e04c26ce47604f6713b611b409fbceb2a33d6 100644 --- a/frameworks/core/components_ng/pattern/data_panel/data_panel_pattern.h +++ b/frameworks/core/components_ng/pattern/data_panel/data_panel_pattern.h @@ -68,6 +68,7 @@ public: void UpdateTrackBackground(const Color& color, bool isFirstLoad = false); void UpdateStrokeWidth(const CalcDimension& strokeWidth, bool isFirstLoad = false); + void OnColorModeChange(uint32_t colorMode) override; private: void OnAttachToFrameNode() override; diff --git a/frameworks/core/components_ng/pattern/image/image_pattern.cpp b/frameworks/core/components_ng/pattern/image/image_pattern.cpp index baa5796b0f1676967f7d59f08bc922b2d01b9052..4ec9c868810a3de0134e812da5505e3056932e87 100644 --- a/frameworks/core/components_ng/pattern/image/image_pattern.cpp +++ b/frameworks/core/components_ng/pattern/image/image_pattern.cpp @@ -1926,9 +1926,7 @@ void ImagePattern::OnLanguageConfigurationUpdate() void ImagePattern::OnColorConfigurationUpdate() { - if (!SystemProperties::ConfigChangePerform()) { - OnConfigurationUpdate(); - } + OnConfigurationUpdate(); } void ImagePattern::OnDirectionConfigurationUpdate() @@ -2816,30 +2814,27 @@ void ImagePattern::UpdateImageSourceinfo(const ImageSourceInfo& sourceInfo) auto pipelineContext = host->GetContext(); CHECK_NULL_VOID(pipelineContext); if (pipelineContext->IsSystmColorChange()) { - auto imageCache = pipelineContext->GetImageCache(); - CHECK_NULL_VOID(imageCache); auto imageLayoutProperty = GetLayoutProperty(); CHECK_NULL_VOID(imageLayoutProperty); - ImageSourceInfo imageCacheSource = imageLayoutProperty->GetImageSourceInfo().value_or(ImageSourceInfo("")); - imageCache->ClearCacheImgObj(imageCacheSource.GetKey()); imageLayoutProperty->UpdateImageSourceInfo(sourceInfo); - LoadImage(sourceInfo, imageLayoutProperty->GetPropertyChangeFlag()); } } void ImagePattern::UpdateImageFill(const Color& color) { - auto renderProperty = GetPaintProperty(); - CHECK_NULL_VOID(renderProperty); - renderProperty->UpdateSvgFillColor(color); - auto host = GetHost(); CHECK_NULL_VOID(host); - auto renderContext = host->GetRenderContext(); - CHECK_NULL_VOID(renderContext); - renderContext->UpdateForegroundColor(color); - - host->MarkDirtyNode(PROPERTY_UPDATE_RENDER); + auto pipelineContext = host->GetContext(); + CHECK_NULL_VOID(pipelineContext); + if (pipelineContext->IsSystmColorChange()) { + auto renderProperty = GetPaintProperty(); + CHECK_NULL_VOID(renderProperty); + renderProperty->UpdateSvgFillColor(color); + auto renderContext = host->GetRenderContext(); + CHECK_NULL_VOID(renderContext); + renderContext->UpdateForegroundColor(color); + host->MarkDirtyNode(PROPERTY_UPDATE_RENDER); + } } void ImagePattern::UpdateImageAlt(const ImageSourceInfo& sourceInfo) @@ -2849,14 +2844,9 @@ void ImagePattern::UpdateImageAlt(const ImageSourceInfo& sourceInfo) auto pipelineContext = host->GetContext(); CHECK_NULL_VOID(pipelineContext); if (pipelineContext->IsSystmColorChange()) { - auto imageCache = pipelineContext->GetImageCache(); - CHECK_NULL_VOID(imageCache); auto imageLayoutProperty = GetLayoutProperty(); CHECK_NULL_VOID(imageLayoutProperty); - auto altImageSourceInfo = imageLayoutProperty->GetAlt().value_or(ImageSourceInfo("")); - imageCache->ClearCacheImgObj(altImageSourceInfo.GetKey()); imageLayoutProperty->UpdateAlt(sourceInfo); - LoadAltImage(sourceInfo); } }