diff --git a/adapter/ohos/entrance/ace_container.cpp b/adapter/ohos/entrance/ace_container.cpp index cd98927ed01a46f31bb30f15eec9fec1cc469bda..507235922dff337c749f3b52ec2fbaecf3db9a18 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_counter.cpp b/frameworks/bridge/declarative_frontend/jsview/js_counter.cpp index 6d4224ea908c6ed8135f9e812ba6909a5e2c4840..7c8eedbc46036de8a480f707652c2a238b65482c 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_counter.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_counter.cpp @@ -135,14 +135,14 @@ void JSCounter::JSHeight(const JSCallbackInfo& args) if (!ConvertFromJSValue(args[0], value, heightResObj)) { return; } - if (SystemProperties::ConfigChangePerform() && heightResObj) { + if (SystemProperties::ConfigChangePerform()) { CounterModel::GetInstance()->CreateWithResourceObj(JsCounterResourceType::Height, heightResObj); - } else { - if (LessNotEqual(value.Value(), 0.0)) { - return; - } - CounterModel::GetInstance()->SetHeight(value); } + if (LessNotEqual(value.Value(), 0.0)) { + return; + } + CounterModel::GetInstance()->SetHeight(value); + args.ReturnSelf(); } @@ -157,14 +157,13 @@ void JSCounter::JSWidth(const JSCallbackInfo& args) if (!ConvertFromJSValue(args[0], value, widthResObj)) { return; } - if (SystemProperties::ConfigChangePerform() && widthResObj) { + if (SystemProperties::ConfigChangePerform()) { CounterModel::GetInstance()->CreateWithResourceObj(JsCounterResourceType::Width, widthResObj); - } else { - if (LessNotEqual(value.Value(), 0.0)) { - return; - } - CounterModel::GetInstance()->SetWidth(value); } + if (LessNotEqual(value.Value(), 0.0)) { + return; + } + CounterModel::GetInstance()->SetWidth(value); args.ReturnSelf(); } @@ -177,18 +176,20 @@ void JSCounter::SetSize(const JSCallbackInfo& args) RefPtr heightResObj; if (ConvertFromJSValue(obj->GetProperty("height"), height, heightResObj)) { - if (SystemProperties::ConfigChangePerform() && heightResObj) { + if (SystemProperties::ConfigChangePerform()) { CounterModel::GetInstance()->CreateWithResourceObj(JsCounterResourceType::Height, heightResObj); - } else if (height.IsValid() && GreatOrEqual(height.Value(), 0.0)) { + } + if (height.IsValid() && GreatOrEqual(height.Value(), 0.0)) { CounterModel::GetInstance()->SetHeight(height); } } Dimension width; RefPtr widthResObj; if (ConvertFromJSValue(obj->GetProperty("width"), width, widthResObj)) { - if (SystemProperties::ConfigChangePerform() && widthResObj) { + if (SystemProperties::ConfigChangePerform()) { CounterModel::GetInstance()->CreateWithResourceObj(JsCounterResourceType::Width, widthResObj); - } else if (width.IsValid() && GreatOrEqual(width.Value(), 0.0)) { + } + if (width.IsValid() && GreatOrEqual(width.Value(), 0.0)) { CounterModel::GetInstance()->SetWidth(width); } } @@ -224,11 +225,10 @@ void JSCounter::JsBackgroundColor(const JSCallbackInfo& args) Color color; RefPtr resObj; if (ParseJsColor(args[0], color, resObj)) { - if (SystemProperties::ConfigChangePerform() && resObj) { + if (SystemProperties::ConfigChangePerform()) { CounterModel::GetInstance()->CreateWithResourceObj(JsCounterResourceType::BackgroundColor, resObj); - } else { - CounterModel::GetInstance()->SetBackgroundColor(color); } + CounterModel::GetInstance()->SetBackgroundColor(color); args.ReturnSelf(); } } diff --git a/frameworks/bridge/declarative_frontend/jsview/js_data_panel.cpp b/frameworks/bridge/declarative_frontend/jsview/js_data_panel.cpp index 191520b88153a1f1f5e5dc52d48c4e1f87f2f59e..eea43ef9c5534e6656f2ccf5eb92c645ff71eb60 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" @@ -179,25 +180,13 @@ void JSDataPanel::TrackBackground(const JSCallbackInfo& info) return; } Color color; + RefPtr resObj; + auto result = ParseJsColor(info[0], color, resObj); if (SystemProperties::ConfigChangePerform()) { - RefPtr resObj; - bool state = ParseJsColor(info[0], color, resObj); - if (resObj) { - DataPanelModel::GetInstance()->CreateWithResourceObj( - OHOS::Ace::DataPanelResourceType::TRACK_BACKGROUND_COLOR, resObj); - } else if (state) { - DataPanelModel::GetInstance()->SetTrackBackground(color); - } else { - RefPtr theme = GetTheme(); - color = theme->GetBackgroundColor(); - DataPanelModel::GetInstance()->SetTrackBackground(color); - } - } else { - RefPtr resObj; - if (!ParseJsColor(info[0], color)) { - RefPtr theme = GetTheme(); - color = theme->GetBackgroundColor(); - } + DataPanelModel::GetInstance()->CreateWithResourceObj( + OHOS::Ace::DataPanelResourceType::TRACK_BACKGROUND_COLOR, resObj); + } + if (result) { DataPanelModel::GetInstance()->SetTrackBackground(color); } } @@ -260,13 +249,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 +264,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 +301,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 +371,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_gauge.cpp b/frameworks/bridge/declarative_frontend/jsview/js_gauge.cpp index 217dc234793a87b9b64428654920ef83d0f9c3a5..337a56d5ddc58789f5946dad2da615f868e6ed84 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_gauge.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_gauge.cpp @@ -284,9 +284,8 @@ void JSGauge::SetStrokeWidth(const JSCallbackInfo& info) RefPtr resObj; if (SystemProperties::ConfigChangePerform()) { bool state = ParseJsDimensionVpNG(info[0], strokeWidth, resObj); - if (resObj) { - GaugeModel::GetInstance()->CreateWithResourceObj(OHOS::Ace::GaugeResourceType::STROKE_WIDTH, resObj); - } else if (state && strokeWidth.Unit() != DimensionUnit::PERCENT) { + GaugeModel::GetInstance()->CreateWithResourceObj(OHOS::Ace::GaugeResourceType::STROKE_WIDTH, resObj); + if (state && strokeWidth.Unit() != DimensionUnit::PERCENT) { GaugeModel::GetInstance()->SetStrokeWidth(strokeWidth); } else { GaugeModel::GetInstance()->SetStrokeWidth(CalcDimension(0)); @@ -476,9 +475,8 @@ void HandleIndicatorIcon(const JSRef& jsIcon) if (SystemProperties::ConfigChangePerform()) { RefPtr resObj; bool state = JSViewAbstract::ParseJsMedia(jsIcon, iconPath, resObj); - if (resObj) { - GaugeModel::GetInstance()->CreateWithResourceObj(OHOS::Ace::GaugeResourceType::INDICATOR_ICON, resObj); - } else if (state) { + GaugeModel::GetInstance()->CreateWithResourceObj(OHOS::Ace::GaugeResourceType::INDICATOR_ICON, resObj); + if (state) { GaugeModel::GetInstance()->SetIndicatorIconPath(iconPath, "", ""); } else { GaugeModel::GetInstance()->ResetIndicatorIconPath(); @@ -501,9 +499,8 @@ void HandleIndicatorSpace(const JSRef& jsSpace) if (SystemProperties::ConfigChangePerform()) { RefPtr resObj; bool state = JSViewAbstract::ParseJsDimensionVpNG(jsSpace, space, resObj); - if (resObj) { - GaugeModel::GetInstance()->CreateWithResourceObj(OHOS::Ace::GaugeResourceType::INDICATOR_SPACE, resObj); - } else if (state) { + GaugeModel::GetInstance()->CreateWithResourceObj(OHOS::Ace::GaugeResourceType::INDICATOR_SPACE, resObj); + if (state) { if (space.IsNegative()) { space = NG::INDICATOR_DISTANCE_TO_TOP; } diff --git a/frameworks/bridge/declarative_frontend/jsview/js_image.cpp b/frameworks/bridge/declarative_frontend/jsview/js_image.cpp index a1d3dfdd0325463f7544aa9a9c21ab308fa6403c..e8077d6b8d5221b1ce913225f565feb41681414a 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_image.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_image.cpp @@ -181,7 +181,7 @@ void JSImage::SetAlt(const JSCallbackInfo& args) auto srcInfo = CreateSourceInfo(srcRef, pixmap, bundleName, moduleName); srcInfo.SetIsUriPureNumber((resId == -1)); ImageModel::GetInstance()->SetAlt(srcInfo); - if (SystemProperties::ConfigChangePerform() && resObj) { + if (SystemProperties::ConfigChangePerform()) { ImageModel::GetInstance()->CreateWithResourceObj(ImageResourceType::ALT, resObj); } } @@ -441,7 +441,7 @@ void JSImage::CreateImage(const JSCallbackInfo& info, bool isImageSpan) config.isImageSpan = isImageSpan; ImageModel::GetInstance()->Create(config, pixmap); ParseImageAIOptions(info); - if (SystemProperties::ConfigChangePerform() && resObj) { + if (SystemProperties::ConfigChangePerform()) { ImageModel::GetInstance()->CreateWithResourceObj(ImageResourceType::SRC, resObj); } } @@ -679,7 +679,7 @@ void JSImage::SetImageFill(const JSCallbackInfo& info) } ImageModel::GetInstance()->SetImageFill(color); - if (SystemProperties::ConfigChangePerform()&&resObj) { + if (SystemProperties::ConfigChangePerform()) { ImageModel::GetInstance()->CreateWithResourceObj(ImageResourceType::FILL_COLOR, resObj); } } 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/bridge/declarative_frontend/jsview/js_loading_progress.cpp b/frameworks/bridge/declarative_frontend/jsview/js_loading_progress.cpp index 53a72c034c9e886e745e499bdb608ed603d10a85..1150cb067d4baa2da3e4a0ff801e63325a836457 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_loading_progress.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_loading_progress.cpp @@ -79,9 +79,9 @@ void JSLoadingProgress::SetColor(const JSCallbackInfo& info) RefPtr resObj; if (SystemProperties::ConfigChangePerform()) { bool state = ParseJsColor(info[0], progressColor, resObj); - if (resObj) { - LoadingProgressModel::GetInstance()->CreateWithResourceObj(OHOS::Ace::LoadingProgressResourceType::COLOR, resObj); - } else if (state) { + LoadingProgressModel::GetInstance()->CreateWithResourceObj( + OHOS::Ace::LoadingProgressResourceType::COLOR, resObj); + if (state) { LoadingProgressModel::GetInstance()->SetColor(progressColor); } else { if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TWENTY)) { @@ -116,20 +116,24 @@ void JSLoadingProgress::SetColor(const JSCallbackInfo& info) void JSLoadingProgress::SetForegroundColor(const JSCallbackInfo& info) { ForegroundColorStrategy strategy; + RefPtr resObj; if (ParseJsColorStrategy(info[0], strategy)) { + LoadingProgressModel::GetInstance()->CreateWithResourceObj( + OHOS::Ace::LoadingProgressResourceType::FOREGROUNDCOLOR, resObj); ViewAbstractModel::GetInstance()->SetForegroundColorStrategy(strategy); return; } Color progressColor; - RefPtr resObj; if (SystemProperties::ConfigChangePerform()) { bool state = ParseJsColor(info[0], progressColor, resObj); - if (resObj) { - LoadingProgressModel::GetInstance()->CreateWithResourceObj(OHOS::Ace::LoadingProgressResourceType::FOREGROUNDCOLOR, resObj); - } else if (state) { + LoadingProgressModel::GetInstance()->CreateWithResourceObj( + OHOS::Ace::LoadingProgressResourceType::FOREGROUNDCOLOR, resObj); + if (state) { + LoadingProgressModel::GetInstance()->SetForegroundColorParseFailed(false); LoadingProgressModel::GetInstance()->SetColor(progressColor); } else { if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TWENTY)) { + LoadingProgressModel::GetInstance()->SetForegroundColorParseFailed(true); LoadingProgressModel::GetInstance()->ResetColor(); } return; diff --git a/frameworks/bridge/declarative_frontend/jsview/js_pattern_lock.cpp b/frameworks/bridge/declarative_frontend/jsview/js_pattern_lock.cpp index 2de45ae219b850d10fdafb51cb3da2edcb36c170..997c10f0b02d027372d2ca9d64e67ccb27929e70 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_pattern_lock.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_pattern_lock.cpp @@ -133,9 +133,8 @@ void JSPatternLock::SetSelectedColor(const JSCallbackInfo& info) RefPtr resObj; if (SystemProperties::ConfigChangePerform()) { bool state = ParseJsColor(info[0], selectedColor, resObj); - if (resObj) { - PatternLockModel::GetInstance()->CreateWithResourceObj(JsResourceType::SELECTEDCOLOR, resObj); - } else if (state) { + PatternLockModel::GetInstance()->CreateWithResourceObj(JsResourceType::SELECTEDCOLOR, resObj); + if (state) { PatternLockModel::GetInstance()->SetSelectedColor(selectedColor); } else { RefPtr patternLockTheme = GetTheme(); @@ -173,9 +172,8 @@ void JSPatternLock::SetPathColor(const JSCallbackInfo& info) RefPtr resObj; if (SystemProperties::ConfigChangePerform()) { bool state = ParseJsColor(info[0], pathColor, resObj); - if (resObj) { - PatternLockModel::GetInstance()->CreateWithResourceObj(JsResourceType::PATHCOLOR, resObj); - } else if (state) { + PatternLockModel::GetInstance()->CreateWithResourceObj(JsResourceType::PATHCOLOR, resObj); + if (state) { PatternLockModel::GetInstance()->SetPathColor(pathColor); } else { RefPtr patternLockTheme = GetTheme(); @@ -202,9 +200,8 @@ void JSPatternLock::SetActiveColor(const JSCallbackInfo& info) RefPtr resObj; if (SystemProperties::ConfigChangePerform()) { bool state = ParseJsColor(info[0], activeColor, resObj); - if (resObj) { - PatternLockModel::GetInstance()->CreateWithResourceObj(JsResourceType::ACTIVECOLOR, resObj); - } else if (state) { + PatternLockModel::GetInstance()->CreateWithResourceObj(JsResourceType::ACTIVECOLOR, resObj); + if (state) { PatternLockModel::GetInstance()->SetActiveColor(activeColor); } else { RefPtr patternLockTheme = GetTheme(); @@ -231,9 +228,8 @@ void JSPatternLock::SetRegularColor(const JSCallbackInfo& info) RefPtr resObj; if (SystemProperties::ConfigChangePerform()) { bool state = ParseJsColor(info[0], regularColor, resObj); - if (resObj) { - PatternLockModel::GetInstance()->CreateWithResourceObj(JsResourceType::REGULARCOLOR, resObj); - } else if (state) { + PatternLockModel::GetInstance()->CreateWithResourceObj(JsResourceType::REGULARCOLOR, resObj); + if (state) { PatternLockModel::GetInstance()->SetRegularColor(regularColor); } else { RefPtr patternLockTheme = GetTheme(); @@ -260,9 +256,8 @@ void JSPatternLock::SetCircleRadius(const JSCallbackInfo& info) RefPtr resObj; if (SystemProperties::ConfigChangePerform()) { bool state = ParseJsDimensionVp(info[0], radius, resObj); - if (resObj) { - PatternLockModel::GetInstance()->CreateWithResourceObj(JsResourceType::CIRCLERADIUS, resObj); - } else if (state && !radius.IsNonPositive()) { + PatternLockModel::GetInstance()->CreateWithResourceObj(JsResourceType::CIRCLERADIUS, resObj); + if (state && !radius.IsNonPositive()) { PatternLockModel::GetInstance()->SetCircleRadius(radius); } else { RefPtr patternLockTheme = GetTheme(); @@ -297,9 +292,8 @@ void JSPatternLock::SetSideLength(const JSCallbackInfo& info) RefPtr resObj; if (SystemProperties::ConfigChangePerform()) { bool state = ParseJsDimensionVp(info[0], sideLength, resObj); - if (resObj) { - PatternLockModel::GetInstance()->CreateWithResourceObj(JsResourceType::SIDELENGTH, resObj); - } else if (state && sideLength.IsNonNegative()) { + PatternLockModel::GetInstance()->CreateWithResourceObj(JsResourceType::SIDELENGTH, resObj); + if (state && sideLength.IsNonNegative()) { PatternLockModel::GetInstance()->SetSideLength(sideLength); } else { RefPtr patternLockTheme = GetTheme(); @@ -355,9 +349,8 @@ void JSPatternLock::SetActiveCircleColor(const JSRef& info) RefPtr resObj; if (SystemProperties::ConfigChangePerform()) { bool state = ParseJsColor(info, activeColor, resObj); - if (resObj) { - PatternLockModel::GetInstance()->CreateWithResourceObj(JsResourceType::ACTIVECIRCLECOLOR, resObj); - } else if (state) { + PatternLockModel::GetInstance()->CreateWithResourceObj(JsResourceType::ACTIVECIRCLECOLOR, resObj); + if (state) { PatternLockModel::GetInstance()->SetActiveCircleColor(activeColor); } else { activeColor = Color::TRANSPARENT; diff --git a/frameworks/bridge/declarative_frontend/jsview/js_progress.cpp b/frameworks/bridge/declarative_frontend/jsview/js_progress.cpp index 2eb7fa21243d255bb7df765594a810a8fa00212a..2fb7352faf9123e4ffb02a1e3d4aca19ff03f2a4 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_progress.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_progress.cpp @@ -144,27 +144,25 @@ void JSProgress::SetColor(const JSCallbackInfo& info) if (!info[0]->IsNull() && !info[0]->IsUndefined()) { state = ParseJsColor(info[0], colorVal, resObj); } - if (resObj) { - ProgressModel::GetInstance()->CreateWithResourceObj(JsProgressResourceType::COLOR, resObj); - } else { - if (!state) { - endColor = theme->GetRingProgressEndSideColor(); - beginColor = theme->GetRingProgressBeginSideColor(); - colorVal = (g_progressType == ProgressType::CAPSULE) ? theme->GetCapsuleParseFailedSelectColor() - : theme->GetTrackParseFailedSelectedColor(); - } - NG::GradientColor endSideColor; - NG::GradientColor beginSideColor; - endSideColor.SetLinearColor(LinearColor(endColor)); - endSideColor.SetDimension(Dimension(0.0f)); - beginSideColor.SetLinearColor(LinearColor(beginColor)); - beginSideColor.SetDimension(Dimension(1.0f)); - gradient.AddColor(endSideColor); - gradient.AddColor(beginSideColor); - - ProgressModel::GetInstance()->SetGradientColor(gradient); - ProgressModel::GetInstance()->SetColor(colorVal); - } + ProgressModel::GetInstance()->CreateWithResourceObj(JsProgressResourceType::COLOR, resObj); + if (!state) { + endColor = theme->GetRingProgressEndSideColor(); + beginColor = theme->GetRingProgressBeginSideColor(); + colorVal = (g_progressType == ProgressType::CAPSULE) ? theme->GetCapsuleParseFailedSelectColor() + : theme->GetTrackParseFailedSelectedColor(); + } + NG::GradientColor endSideColor; + NG::GradientColor beginSideColor; + endSideColor.SetLinearColor(LinearColor(endColor)); + endSideColor.SetDimension(Dimension(0.0f)); + beginSideColor.SetLinearColor(LinearColor(beginColor)); + beginSideColor.SetDimension(Dimension(1.0f)); + gradient.AddColor(endSideColor); + gradient.AddColor(beginSideColor); + + ProgressModel::GetInstance()->SetGradientColor(gradient); + ProgressModel::GetInstance()->SetColor(colorVal); + } else { if (info[0]->IsNull() || info[0]->IsUndefined() || !ParseJsColor(info[0], colorVal)) { endColor = theme->GetRingProgressEndSideColor(); @@ -228,8 +226,10 @@ void JSProgress::JsSetProgressStyleOptions(const JSCallbackInfo& info) CHECK_NULL_VOID(theme); CalcDimension strokeWidthDimension; + RefPtr strokeWidthResObj; auto jsStrokeWidth = paramObject->GetProperty(attrsProgressStrokeWidth); - if (!CheckLength(jsStrokeWidth, strokeWidthDimension, V2::PROGRESS_ETS_TAG, attrsProgressStrokeWidth)) { + if (!CheckLength( + jsStrokeWidth, strokeWidthDimension, V2::PROGRESS_ETS_TAG, attrsProgressStrokeWidth, strokeWidthResObj)) { strokeWidthDimension = theme->GetTrackThickness(); } @@ -237,7 +237,11 @@ void JSProgress::JsSetProgressStyleOptions(const JSCallbackInfo& info) strokeWidthDimension = theme->GetTrackThickness(); } - ProgressModel::GetInstance()->SetStrokeWidth(strokeWidthDimension); + if (SystemProperties::ConfigChangePerform() && strokeWidthResObj) { + ProgressModel::GetInstance()->CreateWithResourceObj(JsProgressResourceType::PSStrokeWidth, strokeWidthResObj); + } else { + ProgressModel::GetInstance()->SetStrokeWidth(strokeWidthDimension); + } auto jsScaleCount = paramObject->GetProperty("scaleCount"); auto scaleCount = jsScaleCount->IsNumber() ? jsScaleCount->ToNumber() : theme->GetScaleNumber(); @@ -248,8 +252,10 @@ void JSProgress::JsSetProgressStyleOptions(const JSCallbackInfo& info) } CalcDimension scaleWidthDimension; + RefPtr scaleWidthResObj; auto jsScaleWidth = paramObject->GetProperty(attrsProgressScaleWidth); - if (!CheckLength(jsScaleWidth, scaleWidthDimension, V2::PROGRESS_ETS_TAG, attrsProgressScaleWidth)) { + if (!CheckLength( + jsScaleWidth, scaleWidthDimension, V2::PROGRESS_ETS_TAG, attrsProgressScaleWidth, scaleWidthResObj)) { scaleWidthDimension = theme->GetScaleWidth(); } @@ -257,8 +263,11 @@ void JSProgress::JsSetProgressStyleOptions(const JSCallbackInfo& info) scaleWidthDimension.Unit() == DimensionUnit::PERCENT) { scaleWidthDimension = theme->GetScaleWidth(); } - - ProgressModel::GetInstance()->SetScaleWidth(scaleWidthDimension); + if (SystemProperties::ConfigChangePerform() && scaleWidthResObj) { + ProgressModel::GetInstance()->CreateWithResourceObj(JsProgressResourceType::PSScaleWidth, scaleWidthResObj); + } else { + ProgressModel::GetInstance()->SetScaleWidth(scaleWidthDimension); + } } NG::ProgressStatus JSProgress::ConvertStrToProgressStatus(const std::string& value) @@ -290,11 +299,10 @@ void JSProgress::JsSetRingStyleOptions(const JSCallbackInfo& info) paintShadow = false; } - if (SystemProperties::ConfigChangePerform() && shadowResObj) { + if (SystemProperties::ConfigChangePerform()) { ProgressModel::GetInstance()->CreateWithResourceObj(JsProgressResourceType::RingShadow, shadowResObj); - } else { - ProgressModel::GetInstance()->SetPaintShadow(paintShadow); } + ProgressModel::GetInstance()->SetPaintShadow(paintShadow); // Parse progress status std::string statusStr; @@ -307,12 +315,11 @@ void JSProgress::JsSetRingStyleOptions(const JSCallbackInfo& info) if (!ParseJsString(status, statusStr, statusResObj)) { progressStatus = NG::ProgressStatus::PROGRESSING; } - if (SystemProperties::ConfigChangePerform() && statusResObj) { + if (SystemProperties::ConfigChangePerform()) { ProgressModel::GetInstance()->CreateWithResourceObj(JsProgressResourceType::RingStatus, statusResObj); - } else { - progressStatus = ConvertStrToProgressStatus(statusStr); - ProgressModel::GetInstance()->SetProgressStatus(static_cast(progressStatus)); } + progressStatus = ConvertStrToProgressStatus(statusStr); + ProgressModel::GetInstance()->SetProgressStatus(static_cast(progressStatus)); auto jsSweepingEffect = paramObject->GetProperty("enableScanEffect"); bool sweepingEffect = false; @@ -321,12 +328,11 @@ void JSProgress::JsSetRingStyleOptions(const JSCallbackInfo& info) if (!state) { sweepingEffect = false; } - if (SystemProperties::ConfigChangePerform() && sweepingEffectResObj) { + if (SystemProperties::ConfigChangePerform()) { ProgressModel::GetInstance()->CreateWithResourceObj( JsProgressResourceType::RingSweepingEffect, sweepingEffectResObj); - } else { - ProgressModel::GetInstance()->SetRingSweepingEffect(sweepingEffect); } + ProgressModel::GetInstance()->SetRingSweepingEffect(sweepingEffect); } void JSProgress::JsBackgroundColor(const JSCallbackInfo& info) @@ -334,16 +340,15 @@ void JSProgress::JsBackgroundColor(const JSCallbackInfo& info) Color colorVal; RefPtr bgColorResObj; bool state = CheckColor(info[0], colorVal, V2::PROGRESS_ETS_TAG, V2::ATTRS_COMMON_BACKGROUND_COLOR, bgColorResObj); - if (SystemProperties::ConfigChangePerform() && bgColorResObj) { + if (SystemProperties::ConfigChangePerform()) { ProgressModel::GetInstance()->CreateWithResourceObj(JsProgressResourceType::BackgroundColor, bgColorResObj); - return; } if (!state) { RefPtr theme = GetTheme(); CHECK_NULL_VOID(theme); colorVal = (g_progressType == ProgressType::CAPSULE) ? theme->GetCapsuleParseFailedBgColor() - : (g_progressType == ProgressType::RING) ? theme->GetRingProgressParseFailedBgColor() - : theme->GetTrackParseFailedBgColor(); + : (g_progressType == ProgressType::RING) ? theme->GetRingProgressParseFailedBgColor() + : theme->GetTrackParseFailedBgColor(); } ProgressModel::GetInstance()->SetBackgroundColor(colorVal); @@ -368,38 +373,43 @@ void JSProgress::JsSetCapsuleStyle(const JSCallbackInfo& info) bool sweepingEffect = false; RefPtr sweepingEffectResObj; bool state = ParseJsBool(jsSweepingEffect, sweepingEffect, sweepingEffectResObj); - if (SystemProperties::ConfigChangePerform() && sweepingEffectResObj) { + if (SystemProperties::ConfigChangePerform()) { ProgressModel::GetInstance()->CreateWithResourceObj( JsProgressResourceType::CapsuleSweepingEffect, sweepingEffectResObj); - } else { - if (!state) { - sweepingEffect = false; - } - ProgressModel::GetInstance()->SetSweepingEffect(sweepingEffect); } + if (!state) { + sweepingEffect = false; + } + ProgressModel::GetInstance()->SetSweepingEffect(sweepingEffect); auto jsShowDefaultPercentage = paramObject->GetProperty("showDefaultPercentage"); bool showDefaultPercentage = false; RefPtr showDefaultPercentageObj; state = ParseJsBool(jsShowDefaultPercentage, showDefaultPercentage, showDefaultPercentageObj); - if (SystemProperties::ConfigChangePerform() && showDefaultPercentageObj) { + if (SystemProperties::ConfigChangePerform()) { ProgressModel::GetInstance()->CreateWithResourceObj( JsProgressResourceType::ShowDefaultPercentage, showDefaultPercentageObj); - } else { - if (!state) { - showDefaultPercentage = false; - } - ProgressModel::GetInstance()->SetShowText(showDefaultPercentage); } + if (!state) { + showDefaultPercentage = false; + } + ProgressModel::GetInstance()->SetShowText(showDefaultPercentage); auto jsContext = paramObject->GetProperty("content"); + RefPtr textResObj; std::string text; - if (jsContext->IsUndefined() || jsContext->IsNull() || (!ParseJsString(jsContext, text))) { + if (jsContext->IsUndefined() || jsContext->IsNull()) { ProgressModel::GetInstance()->SetText(std::nullopt); } else { - ProgressModel::GetInstance()->SetText(text); + bool parseOk = ParseJsString(jsContext, text, textResObj); + if (SystemProperties::ConfigChangePerform() && jsContext->IsObject() && textResObj) { + ProgressModel::GetInstance()->CreateWithResourceObj(JsProgressResourceType::Text, textResObj); + } else if (parseOk) { + ProgressModel::GetInstance()->SetText(text); + } else { + ProgressModel::GetInstance()->SetText(std::nullopt); + } } - JsSetFontStyle(info); JsSetBorderRadius(paramObject); } @@ -415,11 +425,10 @@ void JSProgress::JsSetCommonOptions(const JSCallbackInfo& info) if (!ParseJsBool(jsSmoothEffect, enable, smoothEffectResObj)) { enable = true; } - if (SystemProperties::ConfigChangePerform() && smoothEffectResObj) { + if (SystemProperties::ConfigChangePerform()) { ProgressModel::GetInstance()->CreateWithResourceObj(JsProgressResourceType::SmoothEffect, smoothEffectResObj); - } else { - ProgressModel::GetInstance()->SetSmoothEffect(enable); } + ProgressModel::GetInstance()->SetSmoothEffect(enable); } void JSProgress::JsSetFontStyle(const JSCallbackInfo& info) @@ -429,9 +438,10 @@ void JSProgress::JsSetFontStyle(const JSCallbackInfo& info) Color fontColorVal; RefPtr fontColorResObj; bool state = ParseJsColor(jsFontColor, fontColorVal, fontColorResObj); - if (SystemProperties::ConfigChangePerform() && fontColorResObj) { + if (SystemProperties::ConfigChangePerform()) { ProgressModel::GetInstance()->CreateWithResourceObj(JsProgressResourceType::FontColor, fontColorResObj); - } else if (!state) { + } + if (!state) { ProgressModel::GetInstance()->ResetFontColor(); } else { ProgressModel::GetInstance()->SetFontColor(fontColorVal); @@ -471,12 +481,11 @@ void JSProgress::JsSetFont(const JSRef& textObject) } else { weightState = ParseJsString(fontWeight, weight, weightResObj); } - if (SystemProperties::ConfigChangePerform() && weightResObj) { + if (SystemProperties::ConfigChangePerform()) { ProgressModel::GetInstance()->CreateWithResourceObj(JsProgressResourceType::FontWeight, weightResObj); - } else { - auto fontWeightVal = ConvertStrToFontWeight(weight); - ProgressModel::GetInstance()->SetFontWeight(fontWeightVal); } + auto fontWeightVal = ConvertStrToFontWeight(weight); + ProgressModel::GetInstance()->SetFontWeight(fontWeightVal); } else { ProgressModel::GetInstance()->SetFontWeight(textTheme->GetTextStyle().GetFontWeight()); } @@ -552,12 +561,11 @@ void JSProgress::JsSetLinearStyleOptions(const JSCallbackInfo& info) if (!state) { sweepingEffect = false; } - if (SystemProperties::ConfigChangePerform() && sweepingEffectResObj) { + if (SystemProperties::ConfigChangePerform()) { ProgressModel::GetInstance()->CreateWithResourceObj( JsProgressResourceType::LSSweepingEffect, sweepingEffectResObj); - } else { - ProgressModel::GetInstance()->SetLinearSweepingEffect(sweepingEffect); } + ProgressModel::GetInstance()->SetLinearSweepingEffect(sweepingEffect); CalcDimension strokeRadiusDimension; auto strokeRadius = paramObject->GetProperty("strokeRadius"); @@ -570,9 +578,8 @@ void JSProgress::JsSetLinearStyleOptions(const JSCallbackInfo& info) ProgressModel::GetInstance()->ResetStrokeRadius(); return; } - if (SystemProperties::ConfigChangePerform() && strokeRadiusResObj) { + if (SystemProperties::ConfigChangePerform()) { ProgressModel::GetInstance()->CreateWithResourceObj(JsProgressResourceType::LSStrokeRadius, strokeRadiusResObj); - return; } if (LessNotEqual(strokeRadiusDimension.Value(), 0.0f) || strokeRadiusDimension.Unit() == DimensionUnit::PERCENT) { @@ -618,12 +625,10 @@ void JSProgress::ProcessLinearStrokeWidth(const JSRef& paramObject) if (LessOrEqual(strokeWidthDimension.Value(), 0.0f) || strokeWidthDimension.Unit() == DimensionUnit::PERCENT) { strokeWidthDimension = theme->GetTrackThickness(); } - if (SystemProperties::ConfigChangePerform() && strokeWidthResObj) { - ProgressModel::GetInstance()->CreateWithResourceObj( - JsProgressResourceType::LSStrokeWidth, strokeWidthResObj); - } else { - ProgressModel::GetInstance()->SetStrokeWidth(strokeWidthDimension); + if (SystemProperties::ConfigChangePerform()) { + ProgressModel::GetInstance()->CreateWithResourceObj(JsProgressResourceType::LSStrokeWidth, strokeWidthResObj); } + ProgressModel::GetInstance()->SetStrokeWidth(strokeWidthDimension); } void JSProgress::ProcessFontSizeOption(const JSRef& textObject) @@ -634,15 +639,13 @@ void JSProgress::ProcessFontSizeOption(const JSRef& textObject) CalcDimension fontSize; RefPtr fontSizeResObj; bool sizeState = ParseJsDimensionNG(jsSize, fontSize, DimensionUnit::FP, fontSizeResObj); - if (SystemProperties::ConfigChangePerform() && fontSizeResObj) { - ProgressModel::GetInstance()->CreateWithResourceObj( - JsProgressResourceType::FontSize, fontSizeResObj); - } else { - if (!sizeState || LessNotEqual(fontSize.Value(), 0.0f) || fontSize.Unit() == DimensionUnit::PERCENT) { - fontSize = theme->GetTextSize(); - } - ProgressModel::GetInstance()->SetFontSize(fontSize); + if (SystemProperties::ConfigChangePerform()) { + ProgressModel::GetInstance()->CreateWithResourceObj(JsProgressResourceType::FontSize, fontSizeResObj); + } + if (!sizeState || LessNotEqual(fontSize.Value(), 0.0f) || fontSize.Unit() == DimensionUnit::PERCENT) { + fontSize = theme->GetTextSize(); } + ProgressModel::GetInstance()->SetFontSize(fontSize); } void JSProgress::ProcessRingStrokeWidth(const JSRef& paramObject) @@ -666,12 +669,10 @@ void JSProgress::ProcessRingStrokeWidth(const JSRef& paramObject) if (LessOrEqual(strokeWidthDimension.Value(), 0.0f) || strokeWidthDimension.Unit() == DimensionUnit::PERCENT) { strokeWidthDimension = theme->GetTrackThickness(); } - if (SystemProperties::ConfigChangePerform() && strokeWidthResObj) { - ProgressModel::GetInstance()->CreateWithResourceObj( - JsProgressResourceType::RingStrokeWidth, strokeWidthResObj); - } else { - ProgressModel::GetInstance()->SetStrokeWidth(strokeWidthDimension); + if (SystemProperties::ConfigChangePerform()) { + ProgressModel::GetInstance()->CreateWithResourceObj(JsProgressResourceType::RingStrokeWidth, strokeWidthResObj); } + ProgressModel::GetInstance()->SetStrokeWidth(strokeWidthDimension); } void JSProgress::ProcessCapsuleBorderWidth(const JSRef& paramObject) @@ -682,18 +683,17 @@ void JSProgress::ProcessCapsuleBorderWidth(const JSRef& paramObject) CalcDimension borderWidth; RefPtr borderWidthResObj; bool state = ParseJsDimensionVpNG(jsBorderWidth, borderWidth, borderWidthResObj); - if (SystemProperties::ConfigChangePerform() && borderWidthResObj) { + if (SystemProperties::ConfigChangePerform()) { ProgressModel::GetInstance()->CreateWithResourceObj( JsProgressResourceType::CapsuleBorderWidth, borderWidthResObj); - } else { - if (!state) { - borderWidth = theme->GetBorderWidth(); - } - if (LessNotEqual(borderWidth.Value(), 0.0) || borderWidth.Unit() == DimensionUnit::PERCENT) { - borderWidth = theme->GetBorderWidth(); - } - ProgressModel::GetInstance()->SetBorderWidth(borderWidth); } + if (!state) { + borderWidth = theme->GetBorderWidth(); + } + if (LessNotEqual(borderWidth.Value(), 0.0) || borderWidth.Unit() == DimensionUnit::PERCENT) { + borderWidth = theme->GetBorderWidth(); + } + ProgressModel::GetInstance()->SetBorderWidth(borderWidth); } void JSProgress::ProcessCapsuleBorderColor(const JSRef& paramObject) @@ -704,10 +704,11 @@ void JSProgress::ProcessCapsuleBorderColor(const JSRef& paramObject) Color colorVal; RefPtr borderColorResObj; bool state = ParseJsColor(jsBorderColor, colorVal, borderColorResObj); - if (SystemProperties::ConfigChangePerform() && borderColorResObj) { + if (SystemProperties::ConfigChangePerform()) { ProgressModel::GetInstance()->CreateWithResourceObj( JsProgressResourceType::CapsuleBorderColor, borderColorResObj); - } else if (state) { + } + if (state) { ProgressModel::GetInstance()->SetBorderColor(colorVal); } else { ProgressModel::GetInstance()->ResetBorderColor(); diff --git a/frameworks/bridge/declarative_frontend/jsview/js_qrcode.cpp b/frameworks/bridge/declarative_frontend/jsview/js_qrcode.cpp index 2cac28ef02eb44e0b2a71ef12fb99f3c47629fcd..7fba4b381da0a92889ff8a9c67248a7200fd88a6 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_qrcode.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_qrcode.cpp @@ -82,25 +82,12 @@ void JSQRCode::SetQRCodeColor(const JSCallbackInfo& info) return; } Color qrcodeColor; + RefPtr resObj; + auto result = ParseJsColor(info[0], qrcodeColor, resObj); if (SystemProperties::ConfigChangePerform()) { - RefPtr resObj; - bool state = ParseJsColor(info[0], qrcodeColor, resObj); - if (resObj) { - QRCodeModel::GetInstance()->CreateWithResourceObj(QRCodeResourceType::COLOR, resObj); - return; - } - if (!state && !JSQRCodeTheme::ObtainQRCodeColor(qrcodeColor)) { - RefPtr qrcodeTheme = GetTheme(); - CHECK_NULL_VOID(qrcodeTheme); - qrcodeColor = qrcodeTheme->GetQrcodeColor(); - } - QRCodeModel::GetInstance()->SetQRCodeColor(qrcodeColor); - } else { - if (!ParseJsColor(info[0], qrcodeColor) && !JSQRCodeTheme::ObtainQRCodeColor(qrcodeColor)) { - RefPtr qrcodeTheme = GetTheme(); - CHECK_NULL_VOID(qrcodeTheme); - qrcodeColor = qrcodeTheme->GetQrcodeColor(); - } + QRCodeModel::GetInstance()->CreateWithResourceObj(QRCodeResourceType::COLOR, resObj); + } + if (result) { QRCodeModel::GetInstance()->SetQRCodeColor(qrcodeColor); } } diff --git a/frameworks/bridge/declarative_frontend/jsview/js_text_clock.cpp b/frameworks/bridge/declarative_frontend/jsview/js_text_clock.cpp index f25d8561e7ee2ffa29378969641d374ae2db35d6..c21ae1c0d1cadde2a2c55d2ece63380cf84208b5 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_text_clock.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_text_clock.cpp @@ -147,11 +147,9 @@ void JSTextClock::SetTextColor(const JSCallbackInfo& info) } Color textColor; RefPtr resObj; - bool colorParsed = SystemProperties::ConfigChangePerform() ? ParseJsColor(info[0], textColor, resObj) - : ParseJsColor(info[0], textColor); - if (SystemProperties::ConfigChangePerform() && resObj) { + bool colorParsed = ParseJsColor(info[0], textColor, resObj); + if (SystemProperties::ConfigChangePerform()) { TextClockModel::GetInstance()->CreateWithTextColorResourceObj(resObj); - return; } if (!colorParsed) { TextClockModel::GetInstance()->ResetTextColor(); diff --git a/frameworks/bridge/declarative_frontend/jsview/js_texttimer.cpp b/frameworks/bridge/declarative_frontend/jsview/js_texttimer.cpp index fae763937bd3b295755d053f587f40af14d1c4b4..d37578a938764ddf62ca531647d5e30962fadd95 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_texttimer.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_texttimer.cpp @@ -217,26 +217,16 @@ void JSTextTimer::SetTextColor(const JSCallbackInfo& info) Color textColor; RefPtr resObj; if (SystemProperties::ConfigChangePerform()) { - bool state = ParseJsColor(info[0], textColor, resObj); - if (resObj) { - TextTimerModel::GetInstance()->CreateWithResourceObj(JsTextTimerResourceType::TEXTCOLOR, resObj); - } else if (state) { - TextTimerModel::GetInstance()->SetTextColor(textColor); - } else { - auto pipelineContext = PipelineContext::GetCurrentContext(); - CHECK_NULL_VOID(pipelineContext); - auto theme = pipelineContext->GetTheme(); - textColor = theme->GetTextStyle().GetTextColor(); - TextTimerModel::GetInstance()->SetTextColor(textColor); - } + TextTimerModel::GetInstance()->CreateWithResourceObj(JsTextTimerResourceType::TEXTCOLOR, resObj); + } + bool state = ParseJsColor(info[0], textColor, resObj); + if (state) { + TextTimerModel::GetInstance()->SetTextColor(textColor); } else { - if (!ParseJsColor(info[0], textColor)) { - auto pipelineContext = PipelineContext::GetCurrentContext(); - CHECK_NULL_VOID(pipelineContext); - auto theme = pipelineContext->GetTheme(); - textColor = theme->GetTextStyle().GetTextColor(); - } - + auto pipelineContext = PipelineContext::GetCurrentContext(); + CHECK_NULL_VOID(pipelineContext); + auto theme = pipelineContext->GetTheme(); + textColor = theme->GetTextStyle().GetTextColor(); TextTimerModel::GetInstance()->SetTextColor(textColor); } } diff --git a/frameworks/core/components_ng/pattern/counter/counter_model_ng.cpp b/frameworks/core/components_ng/pattern/counter/counter_model_ng.cpp index 359a987af2bc12b45a9f85c4e0f62f1e6561a883..6a8903a59b06d2d8c68a790dd8f0d0eecb1a3e52 100644 --- a/frameworks/core/components_ng/pattern/counter/counter_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/counter/counter_model_ng.cpp @@ -380,11 +380,11 @@ void CounterModelNG::CreateWithResourceObj(JsCounterResourceType jsResourceType, auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - - std::string key; + const std::string key = "counter." + std::to_string(static_cast(jsResourceType)); + pattern->RemoveResObj(key); + CHECK_NULL_VOID(resObj); switch (jsResourceType) { case JsCounterResourceType::Height: { - key = "counter.height"; auto&& updateFunc = [pattern, key, this](const RefPtr& resObj, bool isFirstLoad = false) { Dimension height; if (ResourceParseUtils::ConvertFromResObjNG(resObj, height)) { @@ -405,7 +405,6 @@ void CounterModelNG::CreateWithResourceObj(JsCounterResourceType jsResourceType, break; } case JsCounterResourceType::Width: { - key = "counter.width"; auto&& updateFunc = [pattern, key, this](const RefPtr& resObj, bool isFirstLoad = false) { Dimension width; if (ResourceParseUtils::ConvertFromResObjNG(resObj, width)) { @@ -426,7 +425,6 @@ void CounterModelNG::CreateWithResourceObj(JsCounterResourceType jsResourceType, break; } case JsCounterResourceType::BackgroundColor: { - key = "counter.backgroundColor"; auto&& updateFunc = [pattern, key, this](const RefPtr& resObj, bool isFirstLoad = false) { Color color; if (ResourceParseUtils::ParseResColor(resObj, color)) { 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..f2aea1691784e3b8a67d92e7e3cb67eb1a043594 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" @@ -48,6 +50,11 @@ void DataPanelModelNG::Create(const std::vector& values, double max, int V2::DATA_PANEL_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr(); }); stack->Push(frameNode); + auto pros = frameNode->GetPaintProperty(); + if (pros) { + pros->ResetTrackBackgroundSetByUser(); + } + ACE_UPDATE_PAINT_PROPERTY(DataPanelPaintProperty, Values, values); ACE_UPDATE_PAINT_PROPERTY(DataPanelPaintProperty, Max, max); ACE_UPDATE_PAINT_PROPERTY(DataPanelPaintProperty, DataPanelType, dataPanelType); @@ -64,12 +71,29 @@ void DataPanelModelNG::SetEffect(bool isCloseEffect) void DataPanelModelNG::SetValueColors(const std::vector& valueColors) { + auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); + CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + 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); } void DataPanelModelNG::SetTrackBackground(const Color& trackBackgroundColor) { ACE_UPDATE_PAINT_PROPERTY(DataPanelPaintProperty, TrackBackground, trackBackgroundColor); + ACE_UPDATE_PAINT_PROPERTY(DataPanelPaintProperty, TrackBackgroundSetByUser, true); } void DataPanelModelNG::SetStrokeWidth(const Dimension& strokeWidth) @@ -79,6 +103,21 @@ void DataPanelModelNG::SetStrokeWidth(const Dimension& strokeWidth) void DataPanelModelNG::SetShadowOption(const DataPanelShadow& shadowOption) { + auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); + CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + 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); } @@ -90,6 +129,7 @@ void DataPanelModelNG::SetCloseEffect(FrameNode* frameNode, bool isClose) void DataPanelModelNG::SetTrackBackground(FrameNode* frameNode, const Color& trackBackgroundColor) { ACE_UPDATE_NODE_PAINT_PROPERTY(DataPanelPaintProperty, TrackBackground, trackBackgroundColor, frameNode); + ACE_UPDATE_NODE_PAINT_PROPERTY(DataPanelPaintProperty, TrackBackgroundSetByUser, true, frameNode); } void DataPanelModelNG::SetStrokeWidth(FrameNode* frameNode, const Dimension& strokeWidth) @@ -166,6 +206,9 @@ void DataPanelModelNG::CreateWithResourceObj(DataPanelResourceType jsResourceTyp CHECK_NULL_VOID(frameNode); auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); + std::string key = "datapanel." + std::to_string(static_cast(jsResourceType)); + pattern->RemoveResObj(key); + CHECK_NULL_VOID(resObj); if (resObj) { switch (jsResourceType) { case DataPanelResourceType::TRACK_BACKGROUND_COLOR: { 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..fd3d88fa45d94dd03ac9f8058580e14c156da938 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) @@ -229,6 +280,7 @@ public: ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ShadowOption, DataPanelShadow, PROPERTY_UPDATE_RENDER); ACE_DISALLOW_COPY_AND_MOVE(DataPanelPaintProperty); + ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(TrackBackgroundSetByUser, bool, PROPERTY_UPDATE_RENDER); }; } // namespace OHOS::Ace::NG 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..82459b8d5d0407a3804d995a529909a90dda645c 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,36 @@ 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); + } +} + +void DataPanelPattern::OnColorConfigurationUpdate() +{ + if (!SystemProperties::ConfigChangePerform()) { + return; + } + auto host = GetHost(); + CHECK_NULL_VOID(host); + auto pipeline = host->GetContextWithCheck(); + CHECK_NULL_VOID(pipeline); + auto theme = pipeline->GetTheme(); + CHECK_NULL_VOID(theme); + auto pops = host->GetPaintProperty(); + CHECK_NULL_VOID(pops); + if (!pops->HasTrackBackgroundSetByUser() || + (pops->HasTrackBackgroundSetByUser() && !pops->GetTrackBackgroundSetByUserValue())) { + UpdateTrackBackground(theme->GetBackgroundColor(), false); + } +} } // 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..977e603be1c2dafa528813a7b3e292bd2741efc5 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,11 +68,13 @@ 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; bool OnDirtyLayoutWrapperSwap(const RefPtr& dirty, bool skipMeasure, bool skipLayout) override; void FireBuilder(); + void OnColorConfigurationUpdate() override; RefPtr BuildContentModifierNode(); std::optional makeFunc_; diff --git a/frameworks/core/components_ng/pattern/gauge/gauge_model_ng.cpp b/frameworks/core/components_ng/pattern/gauge/gauge_model_ng.cpp index 15e79d1b6d6de858e83ef0cc2856582c4ad6d1ab..95f0616988bf9ce8adcc8ea0645315fb10401ce5 100644 --- a/frameworks/core/components_ng/pattern/gauge/gauge_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/gauge/gauge_model_ng.cpp @@ -248,6 +248,9 @@ void GaugeModelNG::SetBuilderFunc(FrameNode* frameNode, NG::GaugeMakeCallback&& void HandleStrokeWidthResource(const RefPtr& resObj, const RefPtr& pattern) { + const std::string key = "gauge.strokeWidth"; + pattern->RemoveResObj(key); + CHECK_NULL_VOID(resObj); auto&& updateFunc = [pattern](const RefPtr& resObj, bool isFirstLoad = false) { CalcDimension result; if (!ResourceParseUtils::ParseResDimensionVpNG(resObj, result) || result.Unit() == DimensionUnit::PERCENT) { @@ -256,11 +259,14 @@ void HandleStrokeWidthResource(const RefPtr& resObj, const RefPt pattern->UpdateStrokeWidth(result, isFirstLoad); }; updateFunc(resObj, true); - pattern->AddResObj("gauge.strokeWidth", resObj, std::move(updateFunc)); + pattern->AddResObj(key, resObj, std::move(updateFunc)); } void HandleIndicatorIconResource(const RefPtr& resObj, const RefPtr& pattern) { + const std::string key = "gauge.indicator.icon"; + pattern->RemoveResObj(key); + CHECK_NULL_VOID(resObj); auto&& updateFunc = [pattern](const RefPtr& resObj, bool isFirstLoad = false) { std::string result; auto frameNode = pattern->GetHost(); @@ -278,11 +284,14 @@ void HandleIndicatorIconResource(const RefPtr& resObj, const Ref } }; updateFunc(resObj, true); - pattern->AddResObj("gauge.indicator.icon", resObj, std::move(updateFunc)); + pattern->AddResObj(key, resObj, std::move(updateFunc)); } void HandleIndicatorSpaceResource(const RefPtr& resObj, const RefPtr& pattern) { + const std::string key = "gauge.indicator.space"; + pattern->RemoveResObj(key); + CHECK_NULL_VOID(resObj); auto&& updateFunc = [pattern](const RefPtr& resObj, bool isFirstLoad = false) { CalcDimension result; if (!ResourceParseUtils::ParseResDimensionVpNG(resObj, result)) { @@ -294,7 +303,7 @@ void HandleIndicatorSpaceResource(const RefPtr& resObj, const Re pattern->UpdateIndicatorSpace(result, isFirstLoad); }; updateFunc(resObj, true); - pattern->AddResObj("gauge.indicator.space", resObj, std::move(updateFunc)); + pattern->AddResObj(key, resObj, std::move(updateFunc)); } void GaugeModelNG::CreateWithResourceObj(GaugeResourceType jsResourceType, const RefPtr& resObj) diff --git a/frameworks/core/components_ng/pattern/image/image_model_ng.cpp b/frameworks/core/components_ng/pattern/image/image_model_ng.cpp index 0c45f3b37f47ed5655388a843a8b3b5283fd5e12..869b86840980354005adeb57839646d8aeeece07 100644 --- a/frameworks/core/components_ng/pattern/image/image_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/image/image_model_ng.cpp @@ -1111,6 +1111,9 @@ void ImageModelNG::SetOrientation(FrameNode* frameNode, ImageRotateOrientation o void HandleSrcResource(const RefPtr& resObj, const RefPtr& pattern) { + std::string key = "image.src"; + pattern->RemoveResObj(key); + CHECK_NULL_VOID(resObj); auto updateFunc = [pattern](const RefPtr& resObj) { std::string src = ResourceManager::GetInstance().GetOrCreateResourceAdapter(resObj)->GetMediaPath(resObj->GetId()); @@ -1124,11 +1127,14 @@ void HandleSrcResource(const RefPtr& resObj, const RefPtrUpdateImageSourceinfo(srcInfo); pattern->OnConfigurationUpdate(); }; - pattern->AddResObj("image.src", resObj, std::move(updateFunc)); + pattern->AddResObj(key, resObj, std::move(updateFunc)); } void HandleAltResource(const RefPtr& resObj, const RefPtr& pattern) { + std::string key = "image.alt"; + pattern->RemoveResObj(key); + CHECK_NULL_VOID(resObj); auto updateFunc = [pattern](const RefPtr& resObj) { std::string src = ResourceManager::GetInstance().GetOrCreateResourceAdapter(resObj)->GetMediaPath(resObj->GetId()); @@ -1141,11 +1147,14 @@ void HandleAltResource(const RefPtr& resObj, const RefPtrUpdateImageAlt(srcInfo); pattern->OnConfigurationUpdate(); }; - pattern->AddResObj("image.alt", resObj, std::move(updateFunc)); + pattern->AddResObj(key, resObj, std::move(updateFunc)); } void HandleFillColorResource(const RefPtr& resObj, const RefPtr& pattern) { + std::string key = "image.fillcolor"; + pattern->RemoveResObj(key); + CHECK_NULL_VOID(resObj); auto updateFunc = [pattern](const RefPtr& resObj) { Color color; bool status = ResourceParseUtils::ParseResColor(resObj, color); @@ -1161,7 +1170,7 @@ void HandleFillColorResource(const RefPtr& resObj, const RefPtr< } pattern->UpdateImageFill(color); }; - pattern->AddResObj("image.fillcolor", resObj, std::move(updateFunc)); + pattern->AddResObj(key, resObj, std::move(updateFunc)); } void ImageModelNG::CreateWithResourceObj(ImageResourceType resourceType, const RefPtr& resObj) @@ -1177,10 +1186,6 @@ void ImageModelNG::CreateWithResourceObj( auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - if (!resObj) { - return; - } - switch (resourceType) { case ImageResourceType::SRC: HandleSrcResource(resObj, pattern); 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); } } diff --git a/frameworks/core/components_ng/pattern/loading_progress/loading_progress_model_ng.cpp b/frameworks/core/components_ng/pattern/loading_progress/loading_progress_model_ng.cpp index b02e0dcd56d6116fc02d159e5d3c64d6a5b67fe1..09361b946b111bce3b7dc100366b1fecb968bc52 100644 --- a/frameworks/core/components_ng/pattern/loading_progress/loading_progress_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/loading_progress/loading_progress_model_ng.cpp @@ -34,6 +34,10 @@ void LoadingProgressModelNG::Create() if (frameNode->GetThemeScopeId()) { ACE_UPDATE_PAINT_PROPERTY(LoadingProgressPaintProperty, Color, theme->GetLoadingColor()); } + auto pros = frameNode->GetPaintProperty(); + if (pros) { + pros->ResetColorSetByUser(); + } } RefPtr LoadingProgressModelNG::CreateFrameNode(int32_t nodeId) { @@ -49,6 +53,7 @@ void LoadingProgressModelNG::SetColor(const Color& value) CHECK_NULL_VOID(pattern); pattern->SetColorLock(true); ACE_UPDATE_PAINT_PROPERTY(LoadingProgressPaintProperty, Color, value); + ACE_UPDATE_PAINT_PROPERTY(LoadingProgressPaintProperty, ColorSetByUser, true); ACE_UPDATE_RENDER_CONTEXT(ForegroundColor, value); ACE_RESET_RENDER_CONTEXT(RenderContext, ForegroundColorStrategy); ACE_UPDATE_RENDER_CONTEXT(ForegroundColorFlag, true); @@ -67,6 +72,7 @@ void LoadingProgressModelNG::ResetColor() CHECK_NULL_VOID(pattern); pattern->SetColorLock(false); ACE_RESET_PAINT_PROPERTY_WITH_FLAG(LoadingProgressPaintProperty, Color, PROPERTY_UPDATE_RENDER); + ACE_UPDATE_PAINT_PROPERTY(LoadingProgressPaintProperty, ColorSetByUser, false); ACE_RESET_RENDER_CONTEXT(RenderContext, ForegroundColor); ACE_RESET_RENDER_CONTEXT(RenderContext, ForegroundColorStrategy); ACE_RESET_RENDER_CONTEXT(RenderContext, ForegroundColorFlag); @@ -91,6 +97,7 @@ uint32_t LoadingProgressModelNG::GetColor(FrameNode* frameNode) void LoadingProgressModelNG::SetColor(FrameNode* frameNode, const Color& value) { ACE_UPDATE_NODE_PAINT_PROPERTY(LoadingProgressPaintProperty, Color, value, frameNode); + ACE_UPDATE_NODE_PAINT_PROPERTY(LoadingProgressPaintProperty, ColorSetByUser, true, frameNode); ACE_UPDATE_NODE_RENDER_CONTEXT(ForegroundColor, value, frameNode); ACE_RESET_NODE_RENDER_CONTEXT(RenderContext, ForegroundColorStrategy, frameNode); ACE_UPDATE_NODE_RENDER_CONTEXT(ForegroundColorFlag, true, frameNode); @@ -112,6 +119,7 @@ void LoadingProgressModelNG::SetEnableLoading(FrameNode* frameNode, bool enable) void LoadingProgressModelNG::SetForegroundColor(FrameNode* frameNode, const Color& value) { ACE_UPDATE_NODE_PAINT_PROPERTY(LoadingProgressPaintProperty, Color, value, frameNode); + ACE_UPDATE_NODE_PAINT_PROPERTY(LoadingProgressPaintProperty, ColorSetByUser, true, frameNode); ACE_UPDATE_NODE_RENDER_CONTEXT(ForegroundColor, value, frameNode); ACE_RESET_NODE_RENDER_CONTEXT(RenderContext, ForegroundColorStrategy, frameNode); ACE_UPDATE_NODE_RENDER_CONTEXT(ForegroundColorFlag, true, frameNode); @@ -128,6 +136,7 @@ void LoadingProgressModelNG::SetBuilderFunc(FrameNode* frameNode, NG::LoadingPro void LoadingProgressModelNG::ResetColor(FrameNode* frameNode) { ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(LoadingProgressPaintProperty, Color, PROPERTY_UPDATE_RENDER, frameNode); + ACE_UPDATE_NODE_PAINT_PROPERTY(LoadingProgressPaintProperty, ColorSetByUser, false, frameNode); ACE_RESET_NODE_RENDER_CONTEXT(RenderContext, ForegroundColor, frameNode); ACE_RESET_NODE_RENDER_CONTEXT(RenderContext, ForegroundColorStrategy, frameNode); ACE_RESET_NODE_RENDER_CONTEXT(RenderContext, ForegroundColorFlag, frameNode); @@ -136,6 +145,7 @@ void LoadingProgressModelNG::ResetColor(FrameNode* frameNode) void LoadingProgressModelNG::ResetForegroundColor(FrameNode* frameNode) { ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(LoadingProgressPaintProperty, Color, PROPERTY_UPDATE_RENDER, frameNode); + ACE_UPDATE_NODE_PAINT_PROPERTY(LoadingProgressPaintProperty, ColorSetByUser, false, frameNode); ACE_RESET_NODE_RENDER_CONTEXT(RenderContext, ForegroundColor, frameNode); ACE_RESET_NODE_RENDER_CONTEXT(RenderContext, ForegroundColorStrategy, frameNode); ACE_RESET_NODE_RENDER_CONTEXT(RenderContext, ForegroundColorFlag, frameNode); @@ -155,13 +165,15 @@ void LoadingProgressModelNG::SetColorParseFailed(FrameNode* frameNode, bool isPa pattern->SetColorLock(isParseFailed); } -void LoadingProgressModelNG::CreateWithResourceObj(LoadingProgressResourceType LoadingProgressResourceType, const RefPtr& resObj) +void LoadingProgressModelNG::CreateWithResourceObj( + LoadingProgressResourceType LoadingProgressResourceType, const RefPtr& resObj) { auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); CHECK_NULL_VOID(frameNode); auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); - + const std::string key = "progress." + std::to_string(static_cast(LoadingProgressResourceType)); + pattern->RemoveResObj(key); if (!resObj) { return; } @@ -187,20 +199,18 @@ void LoadingProgressModelNG::CreateWithResourceObj(LoadingProgressResourceType L } else { result = Color::ColorFromString(color); } - pattern->UpdateColor(result, isFirstLoad); + pattern->UpdateColor(result, true); }; }; switch (LoadingProgressResourceType) { case LoadingProgressResourceType::COLOR: { - const std::string key = "loadingProgressColor"; auto updateFunc = createUpdateFunc(key); updateFunc(resObj, true); pattern->AddResObj(key, resObj, std::move(updateFunc)); break; } case LoadingProgressResourceType::FOREGROUNDCOLOR: { - const std::string key = "loadingProgressForegroundColor"; auto updateFunc = createUpdateFunc(key); updateFunc(resObj, true); pattern->AddResObj(key, resObj, std::move(updateFunc)); diff --git a/frameworks/core/components_ng/pattern/loading_progress/loading_progress_paint_property.h b/frameworks/core/components_ng/pattern/loading_progress/loading_progress_paint_property.h index d96cb20614e02e5835e0097dc524e9685b74b7ff..1f42d0faece622899cdda4baa40ff0813b3fc2cc 100644 --- a/frameworks/core/components_ng/pattern/loading_progress/loading_progress_paint_property.h +++ b/frameworks/core/components_ng/pattern/loading_progress/loading_progress_paint_property.h @@ -85,6 +85,7 @@ public: ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(LoadingProgressOwner, LoadingProgressOwner, PROPERTY_UPDATE_RENDER); ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(RefreshAnimationState, RefreshAnimationState, PROPERTY_UPDATE_RENDER); ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(RefreshSizeScaleRatio, float, PROPERTY_UPDATE_RENDER); + ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ColorSetByUser, bool, PROPERTY_UPDATE_RENDER); }; } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/loading_progress/loading_progress_pattern.cpp b/frameworks/core/components_ng/pattern/loading_progress/loading_progress_pattern.cpp index a683ad88cc3366d3c4c38a63606382d85cb8f810..5222aecfb1f50d3422ecfec61cbcfe7a31c0de1d 100644 --- a/frameworks/core/components_ng/pattern/loading_progress/loading_progress_pattern.cpp +++ b/frameworks/core/components_ng/pattern/loading_progress/loading_progress_pattern.cpp @@ -333,4 +333,26 @@ void LoadingProgressPattern::UpdateColor(const Color& color, bool isFirstLoad) host->MarkDirtyNode(PROPERTY_UPDATE_RENDER); } } +void LoadingProgressPattern::OnColorConfigurationUpdate() +{ + if (!SystemProperties::ConfigChangePerform()) { + return; + } + auto host = GetHost(); + CHECK_NULL_VOID(host); + auto pipeline = host->GetContext(); + CHECK_NULL_VOID(pipeline); + auto theme = pipeline->GetTheme(); + CHECK_NULL_VOID(theme); + auto pops = host->GetPaintProperty(); + CHECK_NULL_VOID(pops); + if (!pops->HasColorSetByUser() || (pops->HasColorSetByUser() && !pops->GetColorSetByUser())) { + if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TWENTY)) { + pops->ResetColor(); + } else if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TEN)) { + Color progressColor = theme->GetLoadingColor(); + pops->UpdateColor(progressColor); + } + } +} } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/loading_progress/loading_progress_pattern.h b/frameworks/core/components_ng/pattern/loading_progress/loading_progress_pattern.h index f9a0bb426762e29895f73069bb932044f9c1e884..fc60937f5ecfe4dc95dd47fc22b34192d52de89d 100644 --- a/frameworks/core/components_ng/pattern/loading_progress/loading_progress_pattern.h +++ b/frameworks/core/components_ng/pattern/loading_progress/loading_progress_pattern.h @@ -129,6 +129,7 @@ private: void ClearFocusStyle(); void AddIsFocusActiveUpdateEvent(); void RemoveIsFocusActiveUpdateEvent(); + void OnColorConfigurationUpdate() override; Color defaultColor_; Color focusedColor_; diff --git a/frameworks/core/components_ng/pattern/patternlock/patternlock_model_ng.cpp b/frameworks/core/components_ng/pattern/patternlock/patternlock_model_ng.cpp index 08264f8e92aa06cb4b7c466cd31971b5edccf23e..f268f595586709855ed7e64c13db322d21e82e08 100644 --- a/frameworks/core/components_ng/pattern/patternlock/patternlock_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/patternlock/patternlock_model_ng.cpp @@ -31,6 +31,13 @@ RefPtr PatternLockModelNG::Create() auto pattern = frameNode->GetPattern(); pattern->SetPatternLockController(AceType::MakeRefPtr()); + auto pros = frameNode->GetPaintProperty(); + if (pros) { + pros->ResetPathColorSetByUser(); + pros->ResetRegularColorSetByUser(); + pros->ResetActiveColorSetByUser(); + pros->ResetSelectedColorSetByUser(); + } return pattern->GetPatternLockController(); } @@ -55,6 +62,7 @@ void PatternLockModelNG::SetDotConnect(std::function&& onDotConne void PatternLockModelNG::SetSelectedColor(const Color& selectedColor) { ACE_UPDATE_PAINT_PROPERTY(PatternLockPaintProperty, SelectedColor, selectedColor); + ACE_UPDATE_PAINT_PROPERTY(PatternLockPaintProperty, SelectedColorSetByUser, true); } void PatternLockModelNG::SetAutoReset(bool isAutoReset) @@ -65,16 +73,19 @@ void PatternLockModelNG::SetAutoReset(bool isAutoReset) void PatternLockModelNG::SetPathColor(const Color& pathColor) { ACE_UPDATE_PAINT_PROPERTY(PatternLockPaintProperty, PathColor, pathColor); + ACE_UPDATE_PAINT_PROPERTY(PatternLockPaintProperty, PathColorSetByUser, true); } void PatternLockModelNG::SetActiveColor(const Color& activeColor) { ACE_UPDATE_PAINT_PROPERTY(PatternLockPaintProperty, ActiveColor, activeColor); + ACE_UPDATE_PAINT_PROPERTY(PatternLockPaintProperty, ActiveColorSetByUser, true); } void PatternLockModelNG::SetRegularColor(const Color& regularColor) { ACE_UPDATE_PAINT_PROPERTY(PatternLockPaintProperty, RegularColor, regularColor); + ACE_UPDATE_PAINT_PROPERTY(PatternLockPaintProperty, RegularColorSetByUser, true); } void PatternLockModelNG::SetCircleRadius(const Dimension& radius) @@ -120,6 +131,7 @@ void PatternLockModelNG::SetSkipUnselectedPoint(bool isSkipUnselectedPoint) void PatternLockModelNG::SetActiveColor(FrameNode* frameNode, const Color& activeColor) { ACE_UPDATE_NODE_PAINT_PROPERTY(PatternLockPaintProperty, ActiveColor, activeColor, frameNode); + ACE_UPDATE_NODE_PAINT_PROPERTY(PatternLockPaintProperty, ActiveColorSetByUser, true, frameNode); } void PatternLockModelNG::SetCircleRadius(FrameNode* frameNode, const Dimension& radius) @@ -130,6 +142,7 @@ void PatternLockModelNG::SetCircleRadius(FrameNode* frameNode, const Dimension& void PatternLockModelNG::SetSelectedColor(FrameNode* frameNode, const Color& selectedColor) { ACE_UPDATE_NODE_PAINT_PROPERTY(PatternLockPaintProperty, SelectedColor, selectedColor, frameNode); + ACE_UPDATE_NODE_PAINT_PROPERTY(PatternLockPaintProperty, SelectedColorSetByUser, true, frameNode); } void PatternLockModelNG::SetSideLength(FrameNode* frameNode, const Dimension& sideLength) @@ -150,11 +163,13 @@ void PatternLockModelNG::SetStrokeWidth(FrameNode* frameNode, const Dimension& l void PatternLockModelNG::SetRegularColor(FrameNode* frameNode, const Color& regularColor) { ACE_UPDATE_NODE_PAINT_PROPERTY(PatternLockPaintProperty, RegularColor, regularColor, frameNode); + ACE_UPDATE_NODE_PAINT_PROPERTY(PatternLockPaintProperty, RegularColorSetByUser, true, frameNode); } void PatternLockModelNG::SetPathColor(FrameNode* frameNode, const Color& pathColor) { ACE_UPDATE_NODE_PAINT_PROPERTY(PatternLockPaintProperty, PathColor, pathColor, frameNode); + ACE_UPDATE_NODE_PAINT_PROPERTY(PatternLockPaintProperty, PathColorSetByUser, true, frameNode); } void PatternLockModelNG::SetActiveCircleColor(FrameNode* frameNode, const Color& activeCircleColor) @@ -203,10 +218,12 @@ void PatternLockModelNG::CreateWithResourceObj(JsResourceType jsResourceType, co CHECK_NULL_VOID(frameNode); auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); + std::string key = "patternLock." + std::to_string(static_cast(jsResourceType)); + pattern->RemoveResObj(key); + CHECK_NULL_VOID(resObj); if (resObj) { switch (jsResourceType) { case JsResourceType::SELECTEDCOLOR: { - std::string key = "patternLock.selectedColor"; auto&& updateFunc = [pattern, key](const RefPtr& resObj, bool isFristLoad = false) { std::string color = pattern->GetResCacheMapByKey(key); Color result; @@ -231,7 +248,6 @@ void PatternLockModelNG::CreateWithResourceObj(JsResourceType jsResourceType, co break; } case JsResourceType::PATHCOLOR: { - std::string key = "patternLock.pathColor"; auto&& updateFunc = [pattern, key](const RefPtr& resObj, bool isFristLoad = false) { std::string color = pattern->GetResCacheMapByKey(key); Color result; @@ -255,7 +271,6 @@ void PatternLockModelNG::CreateWithResourceObj(JsResourceType jsResourceType, co break; } case JsResourceType::ACTIVECOLOR: { - std::string key = "patternLock.activeColor"; auto&& updateFunc = [pattern, key](const RefPtr& resObj, bool isFristLoad = false) { std::string color = pattern->GetResCacheMapByKey(key); Color result; @@ -279,7 +294,6 @@ void PatternLockModelNG::CreateWithResourceObj(JsResourceType jsResourceType, co break; } case JsResourceType::REGULARCOLOR: { - std::string key = "patternLock.regularColor"; auto&& updateFunc = [pattern, key](const RefPtr& resObj, bool isFristLoad = false) { std::string color = pattern->GetResCacheMapByKey(key); Color result; @@ -303,7 +317,6 @@ void PatternLockModelNG::CreateWithResourceObj(JsResourceType jsResourceType, co break; } case JsResourceType::CIRCLERADIUS: { - std::string key = "patternLock.circleRadius"; auto&& updateFunc = [pattern, key](const RefPtr& resObj, bool isFristLoad = false) { CalcDimension result; if (!ResourceParseUtils::ParseResDimensionVp(resObj, result)) { @@ -320,7 +333,6 @@ void PatternLockModelNG::CreateWithResourceObj(JsResourceType jsResourceType, co break; } case JsResourceType::SIDELENGTH: { - std::string key = "patternLock.sideLength"; auto&& updateFunc = [pattern, key](const RefPtr& resObj, bool isFristLoad = false) { CalcDimension result; if (!ResourceParseUtils::ParseResDimensionVp(resObj, result)) { @@ -337,7 +349,6 @@ void PatternLockModelNG::CreateWithResourceObj(JsResourceType jsResourceType, co break; } case JsResourceType::ACTIVECIRCLECOLOR: { - std::string key = "patternLock.activeCircleColor"; auto&& updateFunc = [pattern, key](const RefPtr& resObj, bool isFristLoad = false) { std::string color = pattern->GetResCacheMapByKey(key); Color result; diff --git a/frameworks/core/components_ng/pattern/patternlock/patternlock_paint_property.h b/frameworks/core/components_ng/pattern/patternlock/patternlock_paint_property.h index e862474e71d7acbba689014f5a7c071d6254384f..d5a7c9f65abd667f65fa10a23348fec7c506774e 100644 --- a/frameworks/core/components_ng/pattern/patternlock/patternlock_paint_property.h +++ b/frameworks/core/components_ng/pattern/patternlock/patternlock_paint_property.h @@ -111,6 +111,10 @@ public: ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(EnableWaveEffect, bool, PROPERTY_UPDATE_RENDER); ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(EnableForeground, bool, PROPERTY_UPDATE_RENDER); ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(SkipUnselectedPoint, bool, PROPERTY_UPDATE_RENDER); + ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(SelectedColorSetByUser, bool, PROPERTY_UPDATE_RENDER); + ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(PathColorSetByUser, bool, PROPERTY_UPDATE_RENDER); + ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ActiveColorSetByUser, bool, PROPERTY_UPDATE_RENDER); + ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(RegularColorSetByUser, bool, PROPERTY_UPDATE_RENDER); }; } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/patternlock/patternlock_pattern.cpp b/frameworks/core/components_ng/pattern/patternlock/patternlock_pattern.cpp index 37fe9a9ea98a9abd6aa93908c402ebc598f7c663..9e97ed902b3814bf67b6d2c992b321e31f614da5 100644 --- a/frameworks/core/components_ng/pattern/patternlock/patternlock_pattern.cpp +++ b/frameworks/core/components_ng/pattern/patternlock/patternlock_pattern.cpp @@ -1005,4 +1005,31 @@ void PatternLockPattern::UpdateActiveCircleColor(const Color& color, bool isFris host->MarkDirtyNode(PROPERTY_UPDATE_RENDER); } } +void PatternLockPattern::OnColorConfigurationUpdate() +{ + if (!SystemProperties::ConfigChangePerform()) { + return; + } + auto host = GetHost(); + CHECK_NULL_VOID(host); + auto pipeline = host->GetContext(); + CHECK_NULL_VOID(pipeline); + auto theme = pipeline->GetTheme(); + CHECK_NULL_VOID(theme); + auto pops = host->GetPaintProperty(); + CHECK_NULL_VOID(pops); + if (!pops->HasPathColorSetByUser() || (pops->HasPathColorSetByUser() && !pops->GetPathColorSetByUser())) { + pops->UpdatePathColor(theme->GetPathColor()); + } + if (!pops->HasRegularColorSetByUser() || (pops->HasRegularColorSetByUser() && !pops->GetRegularColorSetByUser())) { + pops->UpdateRegularColor(theme->GetRegularColor()); + } + if (!pops->HasActiveColorSetByUser() || (pops->HasActiveColorSetByUser() && !pops->GetActiveColorSetByUser())) { + pops->UpdateActiveColor(theme->GetActiveColor()); + } + if (!pops->HasSelectedColorSetByUser() || + (pops->HasSelectedColorSetByUser() && !pops->GetSelectedColorSetByUser())) { + pops->UpdateSelectedColor(theme->GetSelectedColor()); + } +} } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/patternlock/patternlock_pattern.h b/frameworks/core/components_ng/pattern/patternlock/patternlock_pattern.h index 61619fb863bfc4eb62b5d4aa3e7867801ea92a69..61776adc38b71dd9e4dc4deee347853d519481a8 100644 --- a/frameworks/core/components_ng/pattern/patternlock/patternlock_pattern.h +++ b/frameworks/core/components_ng/pattern/patternlock/patternlock_pattern.h @@ -170,6 +170,7 @@ private: OffsetF GetTouchOffsetToNode(); void InitSkipUnselectedPoint(); + void OnColorConfigurationUpdate() override; RefPtr patternLockController_; RefPtr touchDownListener_; RefPtr touchUpListener_; diff --git a/frameworks/core/components_ng/pattern/progress/progress_model.h b/frameworks/core/components_ng/pattern/progress/progress_model.h index e30880b93c948e86c4cba835c3c16385903ae5ec..19332bda2fc506afdb1cc92be6ee43b660c4b830 100644 --- a/frameworks/core/components_ng/pattern/progress/progress_model.h +++ b/frameworks/core/components_ng/pattern/progress/progress_model.h @@ -44,6 +44,9 @@ enum class JsProgressResourceType { BackgroundColor, FontSize, FontWeight, + PSStrokeWidth, + PSScaleWidth, + Text, }; class ACE_FORCE_EXPORT ProgressModel { public: diff --git a/frameworks/core/components_ng/pattern/progress/progress_model_ng.cpp b/frameworks/core/components_ng/pattern/progress/progress_model_ng.cpp index 42e3e485329e1e3cda423b9265b1dd6070149d04..997e1e7fd7d88f04763157282f2aee450a2e604b 100644 --- a/frameworks/core/components_ng/pattern/progress/progress_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/progress/progress_model_ng.cpp @@ -22,6 +22,7 @@ #include "core/components_ng/base/view_stack_processor.h" #include "core/components_ng/pattern/pattern.h" #include "core/components_ng/pattern/progress/progress_date.h" +#include "core/components_ng/pattern/progress/progress_paint_property.h" #include "core/components_ng/pattern/progress/progress_pattern.h" #include "core/components_ng/pattern/text/text_layout_property.h" #include "core/components_ng/pattern/text/text_pattern.h" @@ -87,6 +88,12 @@ void ProgressModelNG::Create(double min, double value, double cachedValue, doubl ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, BackgroundColor, theme->GetTrackBgColor()); } } + + auto pros = frameNode->GetPaintProperty(); + if (pros) { + pros->ResetColorSetByUser(); + pros->ResetGradientColorSetByUser(); + } } RefPtr ProgressModelNG::CreateFrameNode(int32_t nodeId, double value, double max, NG::ProgressType type) @@ -128,6 +135,8 @@ void ProgressModelNG::SetColor(const Color& value) CHECK_NULL_VOID(pattern); pattern->SetUserInitiatedColor(true); ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, Color, value); + ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, ColorSetByUser, true); + ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, GradientColorSetByUser, false); } void ProgressModelNG::ResetColor() @@ -138,16 +147,19 @@ void ProgressModelNG::ResetColor() CHECK_NULL_VOID(pattern); pattern->SetUserInitiatedColor(false); ACE_RESET_PAINT_PROPERTY_WITH_FLAG(ProgressPaintProperty, Color, PROPERTY_UPDATE_RENDER); + ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, ColorSetByUser, false); } void ProgressModelNG::SetGradientColor(const Gradient& value) { ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, GradientColor, value); + ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, GradientColorSetByUser, true); } void ProgressModelNG::ResetGradientColor() { ACE_RESET_PAINT_PROPERTY_WITH_FLAG(ProgressPaintProperty, GradientColor, PROPERTY_UPDATE_RENDER); + ACE_UPDATE_PAINT_PROPERTY(ProgressPaintProperty, GradientColorSetByUser, false); } void ProgressModelNG::SetBackgroundColor(const Color& value) @@ -438,11 +450,13 @@ void ProgressModelNG::SetColor(FrameNode* frameNode, const Color& value) CHECK_NULL_VOID(pattern); pattern->SetUserInitiatedColor(true); ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, Color, value, frameNode); + ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, ColorSetByUser, true, frameNode); } void ProgressModelNG::SetGradientColor(FrameNode* frameNode, const Gradient& value) { ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, GradientColor, value, frameNode); + ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, GradientColorSetByUser, true, frameNode); } void ProgressModelNG::SetSmoothEffect(FrameNode* frameNode, bool value) @@ -722,6 +736,7 @@ void ProgressModelNG::ResetColor(FrameNode* frameNode) CHECK_NULL_VOID(pattern); pattern->SetUserInitiatedColor(false); ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(ProgressPaintProperty, Color, PROPERTY_UPDATE_RENDER, frameNode); + ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, ColorSetByUser, true, frameNode); } void ProgressModelNG::ResetBackgroundColor(FrameNode* frameNode) @@ -735,6 +750,7 @@ void ProgressModelNG::ResetBackgroundColor(FrameNode* frameNode) void ProgressModelNG::ResetGradientColor(FrameNode* frameNode) { ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(ProgressPaintProperty, GradientColor, PROPERTY_UPDATE_RENDER, frameNode); + ACE_UPDATE_NODE_PAINT_PROPERTY(ProgressPaintProperty, GradientColorSetByUser, false, frameNode); } bool ProgressModelNG::isCapsule() const @@ -798,6 +814,12 @@ void ProgressModelNG::CreateWithResourceObj(JsProgressResourceType type, const R SetBackgroundColorResource(resObj); } else if (type == JsProgressResourceType::FontWeight) { SetFontWeightResource(resObj); + } else if (type == JsProgressResourceType::PSStrokeWidth) { + SetRSStrokeWidth(resObj); + } else if (type == JsProgressResourceType::PSScaleWidth) { + SetRSScaleWidth(resObj); + } else if (type == JsProgressResourceType::Text) { + SetTextResource(resObj); } } @@ -806,6 +828,8 @@ void ProgressModelNG::SetProgressColor(const RefPtr& resObj) auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); auto pattern = frameNode->GetPattern(); std::string key = "progress.color"; + pattern->RemoveResObj(key); + CHECK_NULL_VOID(resObj); auto&& updateFunc = [pattern, key, weak = AceType::WeakClaim(frameNode)]( const RefPtr& resObj, bool isFirstLoad = false) { auto frameNode = weak.Upgrade(); @@ -850,6 +874,8 @@ void ProgressModelNG::SetLSStrokeWidth(const RefPtr& resObj) auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); std::string key = "progress.strokeWidth"; + pattern->RemoveResObj(key); + CHECK_NULL_VOID(resObj); auto&& updateFunc = [pattern, key](const RefPtr& resObj, bool isFirstLoad = false) { auto node = pattern->GetHost(); CHECK_NULL_VOID(node); @@ -880,6 +906,8 @@ void ProgressModelNG::SetLSSweepingEffect(const RefPtr& resObj) auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); std::string key = "progress.sweepingEffect"; + pattern->RemoveResObj(key); + CHECK_NULL_VOID(resObj); auto&& updateFunc = [pattern, key](const RefPtr& resourceObj, bool isFirstLoad = false) { auto hostNode = pattern->GetHost(); CHECK_NULL_VOID(hostNode); @@ -900,6 +928,8 @@ void ProgressModelNG::SetLSStrokeRadius(const RefPtr& resObj) auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); std::string key = "progress.strokeRadius"; + pattern->RemoveResObj(key); + CHECK_NULL_VOID(resObj); auto&& updateFunc = [pattern, key](const RefPtr& resObj, bool isFirstLoad = false) { auto hostNode = pattern->GetHost(); CHECK_NULL_VOID(hostNode); @@ -923,6 +953,8 @@ void ProgressModelNG::SetSmoothResEffect(const RefPtr& resourceO auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); std::string key = "progress.smoothEffect"; + pattern->RemoveResObj(key); + CHECK_NULL_VOID(resourceObject); auto updateFunction = [pattern, key](const RefPtr& resourceObject, bool isFirstLoad = false) { auto hostNode = pattern->GetHost(); CHECK_NULL_VOID(hostNode); @@ -944,6 +976,8 @@ void ProgressModelNG::SetRingStrokeWidth(const RefPtr& resObj) CHECK_NULL_VOID(pattern); const std::string key = "progress.ring.strokeWidth"; + pattern->RemoveResObj(key); + CHECK_NULL_VOID(resObj); auto updateFunc = [pattern, key](const RefPtr& resourceObj, bool isFirstLoad = false) { auto node = pattern->GetHost(); CHECK_NULL_VOID(node); @@ -976,6 +1010,8 @@ void ProgressModelNG::SetRingShadow(const RefPtr& resObj) CHECK_NULL_VOID(pattern); const std::string key = "progress.ring.shadow"; + pattern->RemoveResObj(key); + CHECK_NULL_VOID(resObj); auto updateFunc = [pattern, key](const RefPtr& obj, bool isFirstLoad = false) { auto node = pattern->GetHost(); CHECK_NULL_VOID(node); @@ -997,6 +1033,8 @@ void ProgressModelNG::SetRingStatus(const RefPtr& resObj) auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); const std::string key = "progress.ring.status"; + pattern->RemoveResObj(key); + CHECK_NULL_VOID(resObj); auto updateFunc = [pattern, key](const RefPtr& obj, bool isFirstLoad = false) { auto node = pattern->GetHost(); CHECK_NULL_VOID(node); @@ -1020,6 +1058,8 @@ void ProgressModelNG::SetRingSweepingEffect(const RefPtr& resObj CHECK_NULL_VOID(pattern); const std::string key = "progress.ring.sweepingEffect"; + pattern->RemoveResObj(key); + CHECK_NULL_VOID(resObj); auto updateFunc = [pattern, key](const RefPtr& obj, bool isFirstLoad = false) { auto node = pattern->GetHost(); CHECK_NULL_VOID(node); @@ -1040,6 +1080,8 @@ void ProgressModelNG::SetCapsuleBorderWidth(const RefPtr& resObj auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); const std::string key = "progress.capsule.borderWidth"; + pattern->RemoveResObj(key); + CHECK_NULL_VOID(resObj); auto updateFunc = [pattern, key](const RefPtr& obj, bool isFirstLoad = false) { auto node = pattern->GetHost(); CHECK_NULL_VOID(node); @@ -1067,6 +1109,8 @@ void ProgressModelNG::SetCapsuleBorderColor(const RefPtr& resObj CHECK_NULL_VOID(pattern); const std::string resourceKey = "progress.capsule.borderColor"; + pattern->RemoveResObj(resourceKey); + CHECK_NULL_VOID(resObj); auto updateResourceFunction = [pattern, resourceKey]( const RefPtr& resourceObject, bool isFirstLoad = false) { auto hostNode = pattern->GetHost(); @@ -1095,6 +1139,8 @@ void ProgressModelNG::SetCapsuleSweepingEffect(const RefPtr& res CHECK_NULL_VOID(pattern); const std::string key = "progress.capsule.sweepingEffect"; + pattern->RemoveResObj(key); + CHECK_NULL_VOID(resObj); auto updateFunc = [pattern, key](const RefPtr& obj, bool isFirstLoad = false) { auto node = pattern->GetHost(); CHECK_NULL_VOID(node); @@ -1116,6 +1162,8 @@ void ProgressModelNG::SetShowDefaultPercentage(const RefPtr& res CHECK_NULL_VOID(pattern); const std::string key = "progress.capsule.showDefaultPercentage"; + pattern->RemoveResObj(key); + CHECK_NULL_VOID(resObj); auto updateFunc = [pattern, key](const RefPtr& obj, bool isFirstLoad = false) { auto node = pattern->GetHost(); CHECK_NULL_VOID(node); @@ -1137,6 +1185,8 @@ void ProgressModelNG::SetFontColorResource(const RefPtr& resObj) CHECK_NULL_VOID(pattern); const std::string key = "progress.fontColor"; + pattern->RemoveResObj(key); + CHECK_NULL_VOID(resObj); auto updateFunc = [pattern, key](const RefPtr& obj, bool isFirstLoad = false) { auto node = pattern->GetHost(); CHECK_NULL_VOID(node); @@ -1163,6 +1213,8 @@ void ProgressModelNG::SetBackgroundColorResource(const RefPtr& r CHECK_NULL_VOID(pattern); const std::string key = "progress.backgroundColor"; + pattern->RemoveResObj(key); + CHECK_NULL_VOID(resObj); auto updateFunc = [pattern, key](const RefPtr& obj, bool isFirstLoad = false) { auto node = pattern->GetHost(); CHECK_NULL_VOID(node); @@ -1195,6 +1247,8 @@ void ProgressModelNG::SetFontWeightResource(const RefPtr& resObj CHECK_NULL_VOID(pattern); const std::string key = "progress.fontWeight"; + pattern->RemoveResObj(key); + CHECK_NULL_VOID(resObj); auto updateFunc = [pattern, key](const RefPtr& obj, bool isFirstLoad = false) { auto node = pattern->GetHost(); CHECK_NULL_VOID(node); @@ -1213,4 +1267,85 @@ void ProgressModelNG::SetFontWeightResource(const RefPtr& resObj updateFunc(resObj, true); pattern->AddResObj(key, resObj, std::move(updateFunc)); } + +void ProgressModelNG::SetRSStrokeWidth(const RefPtr& resObj) +{ + auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); + CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + std::string key = "progress.style.strokeWidth"; + auto&& updateFunc = [pattern, key](const RefPtr& resObj, bool isFirstLoad = false) { + auto node = pattern->GetHost(); + CHECK_NULL_VOID(node); + auto pipeline = PipelineBase::GetCurrentContext(); + CHECK_NULL_VOID(pipeline); + auto progressTheme = pipeline->GetTheme(); + CHECK_NULL_VOID(progressTheme); + CalcDimension width; + bool parseOK = false; + if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TEN)) { + parseOK = ResourceParseUtils::ParseResDimensionVpNG(resObj, width); + } else { + parseOK = ResourceParseUtils::ParseResDimensionVp(resObj, width); + } + if (!parseOK || LessOrEqual(width.Value(), 0.0f) || width.Unit() == DimensionUnit::PERCENT) { + width = progressTheme->GetTrackThickness(); + } + SetStrokeWidth(AceType::RawPtr(node), width); + }; + updateFunc(resObj, true); + pattern->AddResObj(key, resObj, std::move(updateFunc)); +} + +void ProgressModelNG::SetRSScaleWidth(const RefPtr& resObj) +{ + auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); + CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + std::string key = "progress.style.scaleWidth"; + auto&& updateFunc = [pattern, key](const RefPtr& resObj, bool isFirstLoad = false) { + auto node = pattern->GetHost(); + CHECK_NULL_VOID(node); + auto pipeline = PipelineBase::GetCurrentContext(); + CHECK_NULL_VOID(pipeline); + auto progressTheme = pipeline->GetTheme(); + CHECK_NULL_VOID(progressTheme); + CalcDimension width; + bool parseOK = false; + if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TEN)) { + parseOK = ResourceParseUtils::ParseResDimensionVpNG(resObj, width); + } else { + parseOK = ResourceParseUtils::ParseResDimensionVp(resObj, width); + } + if (!parseOK || LessOrEqual(width.Value(), 0.0f) || width.Unit() == DimensionUnit::PERCENT) { + width = progressTheme->GetScaleWidth(); + } + SetScaleWidth(AceType::RawPtr(node), width); + }; + updateFunc(resObj, true); + pattern->AddResObj(key, resObj, std::move(updateFunc)); +} + +void ProgressModelNG::SetTextResource(const RefPtr& resObj) +{ + auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); + CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + const std::string key = "progress.text"; + auto updateFunc = [pattern, key](const RefPtr& obj, bool isFirstLoad = false) { + auto node = pattern->GetHost(); + CHECK_NULL_VOID(node); + std::string text; + if (ResourceParseUtils::ParseResString(obj, text)) { + SetText(AceType::RawPtr(node), text); + } else { + SetText(AceType::RawPtr(node), std::nullopt); + } + }; + updateFunc(resObj, true); + pattern->AddResObj(key, resObj, std::move(updateFunc)); +} } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/progress/progress_model_ng.h b/frameworks/core/components_ng/pattern/progress/progress_model_ng.h index 754c0ae43c0cf993b99dc3b878193346c1c1bf23..5ea81ecc6b47b6ff828798cb6d0711c4405281f6 100644 --- a/frameworks/core/components_ng/pattern/progress/progress_model_ng.h +++ b/frameworks/core/components_ng/pattern/progress/progress_model_ng.h @@ -72,6 +72,9 @@ public: void SetFontColorResource(const RefPtr& resObj); void SetBackgroundColorResource(const RefPtr& resObj); void SetFontWeightResource(const RefPtr& resObj); + void SetRSStrokeWidth(const RefPtr& resObj); + void SetRSScaleWidth(const RefPtr& resObj); + void SetTextResource(const RefPtr& resObj); static RefPtr CreateFrameNode(int32_t nodeId, double value, double max, NG::ProgressType type); static void SetValue(FrameNode* frameNode, double value); diff --git a/frameworks/core/components_ng/pattern/progress/progress_paint_property.h b/frameworks/core/components_ng/pattern/progress/progress_paint_property.h index 1fc0397240aebbcb98d0cb0f51d979c7445fc641..c9b8c23b94139baf4e12d6affe8b2ebae71da4d1 100644 --- a/frameworks/core/components_ng/pattern/progress/progress_paint_property.h +++ b/frameworks/core/components_ng/pattern/progress/progress_paint_property.h @@ -98,6 +98,8 @@ public: ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ProgressStatus, ProgressStatus, PROPERTY_UPDATE_MEASURE); ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(EnableSmoothEffect, bool, PROPERTY_UPDATE_MEASURE); ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(IsSensitive, bool, PROPERTY_UPDATE_MEASURE); + ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ColorSetByUser, bool, PROPERTY_UPDATE_MEASURE); + ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(GradientColorSetByUser, bool, PROPERTY_UPDATE_MEASURE); int32_t GetThemeScopeId() const; }; diff --git a/frameworks/core/components_ng/pattern/progress/progress_pattern.cpp b/frameworks/core/components_ng/pattern/progress/progress_pattern.cpp index 2fb3e0f9b77f35e27bbc7bcb30407c83c9e61e94..650e78ce82ee59f8e29ff9eeac77900b51f3a443 100644 --- a/frameworks/core/components_ng/pattern/progress/progress_pattern.cpp +++ b/frameworks/core/components_ng/pattern/progress/progress_pattern.cpp @@ -909,4 +909,44 @@ void ProgressPattern::OnColorModeChange(uint32_t colorMode) host->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF); } } + +void ProgressPattern::OnColorConfigurationUpdate() +{ + if (!SystemProperties::ConfigChangePerform()) { + return; + } + auto host = GetHost(); + CHECK_NULL_VOID(host); + auto pipeline = host->GetContext(); + CHECK_NULL_VOID(pipeline); + auto theme = pipeline->GetTheme(); + CHECK_NULL_VOID(theme); + auto pops = host->GetPaintProperty(); + CHECK_NULL_VOID(pops); + if (!pops->HasGradientColorSetByUser() || + (pops->HasGradientColorSetByUser() && !pops->GetGradientColorSetByUser())) { + if (pops->HasGradientColor()) { + Gradient gradient = pops->GetGradientColorValue(); + Color endColor; + Color beginColor; + endColor = theme->GetRingProgressEndSideColor(); + beginColor = theme->GetRingProgressBeginSideColor(); + NG::GradientColor endSideColor; + NG::GradientColor beginSideColor; + endSideColor.SetLinearColor(LinearColor(endColor)); + endSideColor.SetDimension(Dimension(0.0f)); + beginSideColor.SetLinearColor(LinearColor(beginColor)); + beginSideColor.SetDimension(Dimension(1.0f)); + gradient.ClearColors(); + gradient.AddColor(endSideColor); + gradient.AddColor(beginSideColor); + pops->UpdateGradientColor(gradient); + } + } + if (!pops->HasColorSetByUser() || (pops->HasColorSetByUser() && !pops->GetColorSetByUser())) { + Color colorVal = (progressType_ == ProgressType::CAPSULE) ? theme->GetCapsuleParseFailedSelectColor() + : theme->GetTrackParseFailedSelectedColor(); + pops->UpdateColor(colorVal); + } +} } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/progress/progress_pattern.h b/frameworks/core/components_ng/pattern/progress/progress_pattern.h index d6e6af5a9ebfcdf2ccfc746d671e565fd87a12ac..6854f695bf37e9d8c35ba2aedc679846d37f3ee6 100644 --- a/frameworks/core/components_ng/pattern/progress/progress_pattern.h +++ b/frameworks/core/components_ng/pattern/progress/progress_pattern.h @@ -49,7 +49,7 @@ public: CHECK_NULL_RETURN(progressLayoutProperty, nullptr); progressType_ = progressLayoutProperty->GetType().value_or(ProgressType::LINEAR); if (!progressModifier_) { - ProgressAnimatableProperty progressAnimatableProperty{}; + ProgressAnimatableProperty progressAnimatableProperty {}; InitAnimatableProperty(progressAnimatableProperty); progressModifier_ = AceType::MakeRefPtr(GetHost(), progressAnimatableProperty); } @@ -62,7 +62,7 @@ public: progressModifier_->SetUseContentModifier(UseContentModifier()); if ((progressLayoutProperty->GetType() == ProgressType::RING || progressLayoutProperty->GetType() == ProgressType::SCALE) && - progressLayoutProperty->GetPaddingProperty()) { + progressLayoutProperty->GetPaddingProperty()) { const auto& padding = progressLayoutProperty->GetPaddingProperty(); auto leftPadding = padding->left.value_or(CalcLength(0.0_vp)).GetDimension(); progressModifier_->SetRingProgressLeftPadding(leftPadding); @@ -208,6 +208,7 @@ private: void ObscureText(bool isSensitive); void FireBuilder(); void ReportProgressEvent(); + void OnColorConfigurationUpdate() override; RefPtr BuildContentModifierNode(); std::optional makeFunc_; RefPtr contentModifierNode_; diff --git a/frameworks/core/components_ng/pattern/qrcode/qrcode_model_ng.cpp b/frameworks/core/components_ng/pattern/qrcode/qrcode_model_ng.cpp index 25042d6a04008a20aae87320106dfe6f615d1ce6..d6dc998b0cd81bed37994e500a4a50c0cecc0bb5 100644 --- a/frameworks/core/components_ng/pattern/qrcode/qrcode_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/qrcode/qrcode_model_ng.cpp @@ -35,6 +35,12 @@ void QRCodeModelNG::Create(const std::string& value) V2::QRCODE_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr(); }); ViewStackProcessor::GetInstance()->Push(frameNode); + auto pros = frameNode->GetPaintProperty(); + if (pros) { + pros->ResetQRCodeColorSetByUser(); + pros->ResetQRBackgroundColorSetByUser(); + } + auto pipeline = PipelineBase::GetCurrentContext(); CHECK_NULL_VOID(pipeline); RefPtr qrCodeTheme = pipeline->GetTheme(); @@ -52,12 +58,14 @@ void QRCodeModelNG::SetQRCodeColor(const Color& color) ACE_UPDATE_RENDER_CONTEXT(ForegroundColor, color); ACE_RESET_RENDER_CONTEXT(RenderContext, ForegroundColorStrategy); ACE_UPDATE_RENDER_CONTEXT(ForegroundColorFlag, true); + ACE_UPDATE_PAINT_PROPERTY(QRCodePaintProperty, QRCodeColorSetByUser, true); } void QRCodeModelNG::SetQRBackgroundColor(const Color& color) { ACE_UPDATE_PAINT_PROPERTY(QRCodePaintProperty, BackgroundColor, color); ACE_UPDATE_RENDER_CONTEXT(BackgroundColor, color); + ACE_UPDATE_PAINT_PROPERTY(QRCodePaintProperty, QRBackgroundColorSetByUser, true); } void QRCodeModelNG::SetContentOpacity(const double opacity) @@ -99,12 +107,14 @@ void QRCodeModelNG::SetQRCodeColor(FrameNode* frameNode, const Color& color) ACE_UPDATE_NODE_RENDER_CONTEXT(ForegroundColor, color, frameNode); ACE_RESET_NODE_RENDER_CONTEXT(RenderContext, ForegroundColorStrategy, frameNode); ACE_UPDATE_NODE_RENDER_CONTEXT(ForegroundColorFlag, true, frameNode); + ACE_UPDATE_NODE_PAINT_PROPERTY(QRCodePaintProperty, QRCodeColorSetByUser, true, frameNode); } void QRCodeModelNG::SetQRBackgroundColor(FrameNode* frameNode, const Color& color) { ACE_UPDATE_NODE_PAINT_PROPERTY(QRCodePaintProperty, BackgroundColor, color, frameNode); ACE_UPDATE_NODE_RENDER_CONTEXT(BackgroundColor, color, frameNode); + ACE_UPDATE_NODE_PAINT_PROPERTY(QRCodePaintProperty, QRBackgroundColorSetByUser, true, frameNode); } void QRCodeModelNG::SetContentOpacity(FrameNode* frameNode, const double opacity) @@ -144,6 +154,8 @@ void HandleColorResource(const RefPtr& pattern, const RefPtr& pattern, const RefPtr& resObj) { std::string backgroundColorKey = "qrcode.background_color"; + pattern->RemoveResObj(backgroundColorKey); + CHECK_NULL_VOID(pattern); auto&& updateBackgroundColorFunc = [pattern](const RefPtr& resObj, bool isFristLoad = false) { Color result; if (!ResourceParseUtils::ParseResColor(resObj, result)) { @@ -182,6 +194,9 @@ void QRCodeModelNG::CreateWithResourceObj(QRCodeResourceType resourceType, const CHECK_NULL_VOID(frameNode); auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); + std::string key = "qrcode." + std::to_string(static_cast(resourceType)); + pattern->RemoveResObj(key); + CHECK_NULL_VOID(resObj); if (resObj) { switch (resourceType) { case QRCodeResourceType::CREATE: diff --git a/frameworks/core/components_ng/pattern/qrcode/qrcode_paint_property.h b/frameworks/core/components_ng/pattern/qrcode/qrcode_paint_property.h index 79084cf68c99539a8c49b208b60fdf5491e5c0f2..a05f16d110c2ec89386eafa0952b71e52fdecd61 100644 --- a/frameworks/core/components_ng/pattern/qrcode/qrcode_paint_property.h +++ b/frameworks/core/components_ng/pattern/qrcode/qrcode_paint_property.h @@ -75,6 +75,8 @@ public: ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(Color, Color, PROPERTY_UPDATE_RENDER); ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(BackgroundColor, Color, PROPERTY_UPDATE_RENDER); ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(Opacity, double, PROPERTY_UPDATE_RENDER); + ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(QRCodeColorSetByUser, bool, PROPERTY_UPDATE_RENDER); + ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(QRBackgroundColorSetByUser, bool, PROPERTY_UPDATE_RENDER); }; } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/qrcode/qrcode_pattern.cpp b/frameworks/core/components_ng/pattern/qrcode/qrcode_pattern.cpp index bf902b153d5a368d7041f5928abe923fb157831a..b94c88390b66b44f8ba56c811efb0519a2a52f80 100644 --- a/frameworks/core/components_ng/pattern/qrcode/qrcode_pattern.cpp +++ b/frameworks/core/components_ng/pattern/qrcode/qrcode_pattern.cpp @@ -167,4 +167,27 @@ void QRCodePattern::UpdateContentOpacity(double opacity, bool isFristLoad) host->MarkDirtyNode(PROPERTY_UPDATE_RENDER); } } + +void QRCodePattern::OnColorConfigurationUpdate() +{ + if (!SystemProperties::ConfigChangePerform()) { + return; + } + auto host = GetHost(); + CHECK_NULL_VOID(host); + auto pipeline = host->GetContextWithCheck(); + CHECK_NULL_VOID(pipeline); + auto theme = pipeline->GetTheme(); + CHECK_NULL_VOID(theme); + auto pops = host->GetPaintProperty(); + CHECK_NULL_VOID(pops); + if (!pops->HasQRCodeColorSetByUser() || + (pops->HasQRCodeColorSetByUser() && !pops->GetQRCodeColorSetByUserValue())) { + UpdateColor(theme->GetQrcodeColor(), false); + } + if (!pops->HasQRBackgroundColorSetByUser() || + (pops->HasQRBackgroundColorSetByUser() && !pops->GetQRBackgroundColorSetByUserValue())) { + UpdateBackgroundColor(theme->GetBackgroundColor(), false); + } +} } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/qrcode/qrcode_pattern.h b/frameworks/core/components_ng/pattern/qrcode/qrcode_pattern.h index f8cb576386c38ee024f73673ea4079a1de025034..960b59003810723206c645b1a0bc70249c51216c 100644 --- a/frameworks/core/components_ng/pattern/qrcode/qrcode_pattern.h +++ b/frameworks/core/components_ng/pattern/qrcode/qrcode_pattern.h @@ -64,6 +64,7 @@ public: private: void OnAttachToFrameNode() override; + void OnColorConfigurationUpdate() override; bool OnDirtyLayoutWrapperSwap(const RefPtr& dirty, bool skipMeasure, bool skipLayout) override; float qrCodeSize_ = 0.0f; diff --git a/frameworks/core/components_ng/pattern/text_clock/text_clock_layout_property.h b/frameworks/core/components_ng/pattern/text_clock/text_clock_layout_property.h index d6fb05e163f93d65dcab7c38de8a406750c06294..50083c2e072916816de11a7f0ff938b3fa609f9d 100644 --- a/frameworks/core/components_ng/pattern/text_clock/text_clock_layout_property.h +++ b/frameworks/core/components_ng/pattern/text_clock/text_clock_layout_property.h @@ -82,6 +82,7 @@ public: ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(TextShadow, std::vector, PROPERTY_UPDATE_MEASURE); ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(FontFeature, FONT_FEATURES_LIST, PROPERTY_UPDATE_MEASURE); ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(PrefixHour, ZeroPrefixType, PROPERTY_UPDATE_MEASURE); + ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(TextColorSetByUser, bool, PROPERTY_UPDATE_MEASURE); private: ACE_DISALLOW_COPY_AND_MOVE(TextClockLayoutProperty); diff --git a/frameworks/core/components_ng/pattern/text_clock/text_clock_model_ng.cpp b/frameworks/core/components_ng/pattern/text_clock/text_clock_model_ng.cpp index 85e8e36c0e664a9ddeed522ee80b6ac294a81329..35d14cea35ff6d068ac13e0a659b60afe45be1b8 100644 --- a/frameworks/core/components_ng/pattern/text_clock/text_clock_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/text_clock/text_clock_model_ng.cpp @@ -38,6 +38,11 @@ RefPtr TextClockModelNG::Create() textNode->MarkModifyDone(); textNode->MountToParent(textClockNode); } + + auto layoutProperty = textClockNode->GetLayoutProperty(); + if (layoutProperty) { + layoutProperty->ResetTextColorSetByUser(); + } stack->Push(textClockNode); return pattern ? pattern->GetTextClockController() : nullptr; } @@ -100,6 +105,7 @@ void TextClockModelNG::SetFontSize(const Dimension& value) void TextClockModelNG::SetTextColor(const Color& value) { ACE_UPDATE_LAYOUT_PROPERTY(TextClockLayoutProperty, TextColor, value); + ACE_UPDATE_LAYOUT_PROPERTY(TextClockLayoutProperty, TextColorSetByUser, true); ACE_UPDATE_RENDER_CONTEXT(ForegroundColor, value); ACE_RESET_RENDER_CONTEXT(RenderContext, ForegroundColorStrategy); ACE_UPDATE_RENDER_CONTEXT(ForegroundColorFlag, true); @@ -108,6 +114,7 @@ void TextClockModelNG::SetTextColor(const Color& value) void TextClockModelNG::ResetTextColor() { ACE_RESET_LAYOUT_PROPERTY_WITH_FLAG(TextClockLayoutProperty, TextColor, PROPERTY_UPDATE_MEASURE_SELF); + ACE_UPDATE_LAYOUT_PROPERTY(TextClockLayoutProperty, TextColorSetByUser, false); ACE_RESET_RENDER_CONTEXT(RenderContext, ForegroundColor); ACE_RESET_RENDER_CONTEXT(RenderContext, ForegroundColorStrategy); ACE_RESET_RENDER_CONTEXT(RenderContext, ForegroundColorFlag); @@ -323,18 +330,20 @@ void TextClockModelNG::CreateWithTextColorResourceObj(const RefPtrRemoveResObj(key); + CHECK_NULL_VOID(resObj); auto&& updateFunc = [pattern, key](const RefPtr& resObj) { Color result; std::string color = pattern->GetResCacheMapByKey(key); if (color.empty()) { if (ResourceParseUtils::ParseResColor(resObj, result)) { pattern->AddResCache(key, result.ColorToString()); - pattern->UpdateTextClockColor(result); + pattern->UpdateTextClockColor(result, true); } } else { result = Color::ColorFromString(color); LOGE("litecache color cache is %s", key.c_str()); - pattern->UpdateTextClockColor(result); + pattern->UpdateTextClockColor(result, true); } }; updateFunc(resObj); diff --git a/frameworks/core/components_ng/pattern/text_clock/text_clock_pattern.cpp b/frameworks/core/components_ng/pattern/text_clock/text_clock_pattern.cpp index ed5bdedcd730063324c0599cef77f93d57bfcff4..40db3514b1580c1e34aeb21103477c926f0c046a 100644 --- a/frameworks/core/components_ng/pattern/text_clock/text_clock_pattern.cpp +++ b/frameworks/core/components_ng/pattern/text_clock/text_clock_pattern.cpp @@ -893,6 +893,26 @@ void TextClockPattern::DumpInfo() DumpLog::GetInstance().AddDesc("isStart: ", isStart_ ? "true" : "false"); } +void TextClockPattern::OnColorConfigurationUpdate() +{ + if (!SystemProperties::ConfigChangePerform()) { + return; + } + + auto host = GetHost(); + CHECK_NULL_VOID(host); + auto pipeline = host->GetContextWithCheck(); + CHECK_NULL_VOID(pipeline); + auto theme = pipeline->GetTheme(); + CHECK_NULL_VOID(theme); + auto pops = host->GetLayoutProperty(); + CHECK_NULL_VOID(pops); + + if (!pops->HasTextColorSetByUser() || (pops->HasTextColorSetByUser() && !pops->GetTextColorSetByUserValue())) { + UpdateTextClockColor(theme->GetTextStyleClock().GetTextColor(), false); + } +} + void TextClockPattern::ToJsonValue(std::unique_ptr& json, const InspectorFilter& filter) const { Pattern::ToJsonValue(json, filter); @@ -923,21 +943,22 @@ void TextClockPattern::OnColorModeChange(uint32_t colorMode) } } -void TextClockPattern::UpdateTextClockColor(const Color& color) +void TextClockPattern::UpdateTextClockColor(const Color& color, bool isFirstLoad) { auto host = GetHost(); CHECK_NULL_VOID(host); auto layoutProperty = host->GetLayoutProperty(); - if (layoutProperty) { - layoutProperty->UpdateTextColor(color); - } + CHECK_NULL_VOID(layoutProperty); auto renderContext = host->GetRenderContext(); - if (renderContext) { + CHECK_NULL_VOID(renderContext); + auto pipelineContext = host->GetContext(); + CHECK_NULL_VOID(pipelineContext); + if (isFirstLoad || pipelineContext->IsSystmColorChange()) { + layoutProperty->UpdateTextColor(color); renderContext->UpdateForegroundColor(color); renderContext->ResetForegroundColorStrategy(); renderContext->UpdateForegroundColorFlag(true); } - } void TextClockPattern::UpdateTextClockFontSize(const CalcDimension& fontSize) diff --git a/frameworks/core/components_ng/pattern/text_clock/text_clock_pattern.h b/frameworks/core/components_ng/pattern/text_clock/text_clock_pattern.h index 65a6a04a91f35ef7349b5510369beb7be8591d3b..603b7d49d8b9d8a0a665f55015580c824af93a47 100644 --- a/frameworks/core/components_ng/pattern/text_clock/text_clock_pattern.h +++ b/frameworks/core/components_ng/pattern/text_clock/text_clock_pattern.h @@ -130,7 +130,7 @@ public: void UpdateTextColor(const Color& color); void UpdateFontSize(const CalcDimension& fontSize); void UpdateFontFamily(const std::vector& fontFamilies); - void UpdateTextClockColor(const Color& color); + void UpdateTextClockColor(const Color& color, bool isFirstLoad = false); void UpdateTextClockFontSize(const CalcDimension& fontSize); void UpdateTextClockFontFamily(const std::vector& fontFamilies); @@ -141,6 +141,7 @@ private: void OnLanguageConfigurationUpdate() override; void DumpInfo() override; void DumpSimplifyInfo(std::unique_ptr& json) override {} + void OnColorConfigurationUpdate() override; void InitTextClockController(); void InitUpdateTimeTextCallBack(); diff --git a/frameworks/core/components_ng/pattern/texttimer/text_timer_layout_property.h b/frameworks/core/components_ng/pattern/texttimer/text_timer_layout_property.h index e96d8d411099db4daa6a8b9ba3f2d69253838ea8..60eae368dcc1b973139968cc6ccdf706e3f11488 100644 --- a/frameworks/core/components_ng/pattern/texttimer/text_timer_layout_property.h +++ b/frameworks/core/components_ng/pattern/texttimer/text_timer_layout_property.h @@ -74,6 +74,7 @@ public: ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(FontWeight, FontWeight, PROPERTY_UPDATE_MEASURE); ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(FontFamily, std::vector, PROPERTY_UPDATE_MEASURE); ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(TextShadow, std::vector, PROPERTY_UPDATE_MEASURE); + ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(TextColorSetByUser, bool, PROPERTY_UPDATE_MEASURE); private: void ResetCount(); diff --git a/frameworks/core/components_ng/pattern/texttimer/text_timer_model_ng.cpp b/frameworks/core/components_ng/pattern/texttimer/text_timer_model_ng.cpp index ec5647569f46d1006df291caec31c2c2e69d6db6..f74640bbb1702e1a98f8de14df41bca6985e6b4b 100644 --- a/frameworks/core/components_ng/pattern/texttimer/text_timer_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/texttimer/text_timer_model_ng.cpp @@ -41,6 +41,11 @@ RefPtr TextTimerModelNG::Create() textNode->MountToParent(textTimerNode); } stack->Push(textTimerNode); + auto textTimerLayoutProperty = textTimerNode->GetLayoutProperty(); + if (textTimerLayoutProperty) { + textTimerLayoutProperty->ResetTextColorSetByUser(); + } + return textTimerPattern ? textTimerPattern->GetTextTimerController() : nullptr; } @@ -67,6 +72,7 @@ void TextTimerModelNG::SetFontSize(const Dimension& value) void TextTimerModelNG::SetTextColor(const Color& value) { ACE_UPDATE_LAYOUT_PROPERTY(TextTimerLayoutProperty, TextColor, value); + ACE_UPDATE_LAYOUT_PROPERTY(TextTimerLayoutProperty, TextColorSetByUser, true); ACE_UPDATE_RENDER_CONTEXT(ForegroundColor, value); ACE_RESET_RENDER_CONTEXT(RenderContext, ForegroundColorStrategy); ACE_UPDATE_RENDER_CONTEXT(ForegroundColorFlag, true); @@ -212,6 +218,8 @@ void TextTimerModelNG::HandleTextColor(FrameNode* frameNode, const RefPtrGetPattern(); CHECK_NULL_VOID(pattern); + pattern->RemoveResObj(key); + CHECK_NULL_VOID(resObj); auto&& updateFunc = [pattern, key](const RefPtr& resObj, bool isFirstLoad = false) { Color result; if (!ResourceParseUtils::ParseResColor(resObj, result)) { diff --git a/frameworks/core/components_ng/pattern/texttimer/text_timer_pattern.cpp b/frameworks/core/components_ng/pattern/texttimer/text_timer_pattern.cpp index 8d67c69dae3dd83732d1533a452f2b118247dc55..ef7d16634417118fd4f1ceb9af5522ca7aed9df7 100644 --- a/frameworks/core/components_ng/pattern/texttimer/text_timer_pattern.cpp +++ b/frameworks/core/components_ng/pattern/texttimer/text_timer_pattern.cpp @@ -475,4 +475,26 @@ void TextTimerPattern::UpdateFontFamily(const std::vector& fontFami layoutProperty->UpdateFontFamily(fontFamilies); } } + +void TextTimerPattern::OnColorConfigurationUpdate() +{ + if (!SystemProperties::ConfigChangePerform()) { + return; + } + + auto host = GetHost(); + CHECK_NULL_VOID(host); + auto pipeline = host->GetContextWithCheck(); + CHECK_NULL_VOID(pipeline); + + auto theme = pipeline->GetTheme(); + CHECK_NULL_VOID(theme); + + auto pops = host->GetLayoutProperty(); + CHECK_NULL_VOID(pops); + + if (!pops->HasTextColorSetByUser() || (pops->HasTextColorSetByUser() && !pops->GetTextColorSetByUserValue())) { + UpdateTextColor(theme->GetTextStyle().GetTextColor(), false); + } +} } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/texttimer/text_timer_pattern.h b/frameworks/core/components_ng/pattern/texttimer/text_timer_pattern.h index bd7ed79bbdbb3355da6deaf955f12807c9afefd0..8239ff8233f68ef71c0ac8288335ed40a030640c 100644 --- a/frameworks/core/components_ng/pattern/texttimer/text_timer_pattern.h +++ b/frameworks/core/components_ng/pattern/texttimer/text_timer_pattern.h @@ -104,6 +104,7 @@ public: void DumpInfo() override; void DumpInfo(std::unique_ptr& json) override; void DumpSimplifyInfo(std::unique_ptr& json) override {} + void OnColorConfigurationUpdate() override; void UpdateTextColor(const Color& color, bool isFirstLoad = false); void UpdateFontWeight(const FontWeight& value, bool isFirstLoad = false); diff --git a/test/unittest/core/pattern/progress/progress_test_ng.cpp b/test/unittest/core/pattern/progress/progress_test_ng.cpp index de2890c38252e865f85e60239c1f2d4763930d7f..cf98085c7405c42e2b1d3725440ff0d9cb2facca 100644 --- a/test/unittest/core/pattern/progress/progress_test_ng.cpp +++ b/test/unittest/core/pattern/progress/progress_test_ng.cpp @@ -1667,6 +1667,26 @@ HWTEST_F(ProgressTestNg, ProgressPatternUpdateColorTest001, TestSize.Level1) EXPECT_EQ(paintProperty->GetColorValue(), testColor); } +/** + * @tc.name: ProgressPatternUpdateColorTest002 + * @tc.desc: Test UpdateColor function with first load scenario. + * @tc.type: FUNC + */ +HWTEST_F(ProgressTestNg, ProgressPatternUpdateColorTest002, TestSize.Level1) +{ + auto frameNode = AceType::DynamicCast(ViewStackProcessor::GetInstance()->Finish()); + ASSERT_NE(frameNode, nullptr); + auto pattern = frameNode->GetPattern(); + ASSERT_NE(pattern, nullptr); + + Color testColor(Color::BLACK); + pattern->UpdateColor(testColor, true); + + auto paintProperty = frameNode->GetPaintProperty(); + ASSERT_NE(paintProperty, nullptr); + EXPECT_EQ(paintProperty->GetColorValue(), testColor); +} + /** * @tc.name: ProgressPatternUpdateColorTest003 * @tc.desc: Test UpdateColor function without first load or system color change. @@ -1679,18 +1699,12 @@ HWTEST_F(ProgressTestNg, ProgressPatternUpdateColorTest003, TestSize.Level1) ASSERT_NE(frameNode, nullptr); auto pattern = frameNode->GetPattern(); ASSERT_NE(pattern, nullptr); - - // Set initial color Color initialColor(Color::GREEN); pattern->UpdateColor(initialColor, true); - - // Try to update without first load or system color change Color newColor(Color::BLUE); pattern->UpdateColor(newColor, false); - auto paintProperty = frameNode->GetPaintProperty(); ASSERT_NE(paintProperty, nullptr); - // Should keep the initial color EXPECT_EQ(paintProperty->GetColorValue(), initialColor); }