From b99e673a5f3e4b3bdb9cbf3aa39bac57ff26156e Mon Sep 17 00:00:00 2001 From: wangxiuxiu96 Date: Sat, 21 Jun 2025 17:14:05 +0800 Subject: [PATCH] =?UTF-8?q?Fix:=E4=BF=AE=E5=A4=8Ddivider=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E9=A2=9C=E8=89=B2=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wangxiuxiu96 Change-Id: I056e592158b298845933a04a449469083605eaeb --- .../pattern/divider/divider_model_ng.cpp | 15 +++-- .../pattern/divider/divider_pattern.cpp | 18 ++++++ .../pattern/divider/divider_pattern.h | 2 + .../pattern/divider/divider_render_property.h | 64 ++++++++++++++++++- .../implementation/divider_modifier.cpp | 2 +- .../native/node/divider_modifier.cpp | 6 +- .../divider/old_cases/divider_test_ng.cpp | 30 +++++++++ 7 files changed, 127 insertions(+), 10 deletions(-) diff --git a/frameworks/core/components_ng/pattern/divider/divider_model_ng.cpp b/frameworks/core/components_ng/pattern/divider/divider_model_ng.cpp index df67078d16b..c3cafa7b13f 100644 --- a/frameworks/core/components_ng/pattern/divider/divider_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/divider/divider_model_ng.cpp @@ -46,6 +46,9 @@ void DividerModelNG::Vertical(bool value) void DividerModelNG::DividerColor(const Color& value) { ACE_UPDATE_PAINT_PROPERTY(DividerRenderProperty, DividerColor, value); + if (SystemProperties::ConfigChangePerform()) { + ACE_UPDATE_PAINT_PROPERTY(DividerRenderProperty, DividerColorSetByTheme, false); + } } void DividerModelNG::ResetResObj(const std::string& key) @@ -81,6 +84,7 @@ void DividerModelNG::DividerColor(const RefPtr& resObj) result = Color::ColorFromString(dividerColor); } ACE_UPDATE_NODE_PAINT_PROPERTY(DividerRenderProperty, DividerColor, result, frameNode); + ACE_UPDATE_NODE_PAINT_PROPERTY(DividerRenderProperty, DividerColorSetByTheme, false, frameNode); frameNode->MarkDirtyNode(PROPERTY_UPDATE_RENDER); }; updateFunc(resObj); @@ -115,7 +119,7 @@ void DividerModelNG::LineCap(FrameNode* frameNode, const std::optional colorOpt, bool isSetByUser) +void DividerModelNG::SetDividerColor(FrameNode* frameNode, std::optional colorOpt, bool isSetByTheme) { if (colorOpt) { ACE_UPDATE_NODE_PAINT_PROPERTY(DividerRenderProperty, DividerColor, colorOpt.value(), frameNode); @@ -123,11 +127,11 @@ void DividerModelNG::SetDividerColor(FrameNode* frameNode, std::optional ACE_RESET_NODE_PAINT_PROPERTY(DividerRenderProperty, DividerColor, frameNode); } if (SystemProperties::ConfigChangePerform()) { - ACE_UPDATE_NODE_PAINT_PROPERTY(DividerRenderProperty, DividerColorSetByUser, isSetByUser, frameNode); + ACE_UPDATE_NODE_PAINT_PROPERTY(DividerRenderProperty, DividerColorSetByTheme, isSetByTheme, frameNode); } } -void DividerModelNG::SetDividerColor(FrameNode* frameNode, const RefPtr& resObj, bool isSetByUser) +void DividerModelNG::SetDividerColor(FrameNode* frameNode, const RefPtr& resObj, bool isSetByTheme) { CHECK_NULL_VOID(frameNode); auto dividerPattern = frameNode->GetPattern(); @@ -150,7 +154,7 @@ void DividerModelNG::SetDividerColor(FrameNode* frameNode, const RefPtrAddResObj("divider.color", resObj, std::move(updateFunc)); - ACE_UPDATE_NODE_PAINT_PROPERTY(DividerRenderProperty, DividerColorSetByUser, isSetByUser, frameNode); + ACE_UPDATE_NODE_PAINT_PROPERTY(DividerRenderProperty, DividerColorSetByTheme, isSetByTheme, frameNode); } void DividerModelNG::ResetResObj(FrameNode* frameNode, const std::string& key) @@ -171,6 +175,9 @@ void DividerModelNG::SetVertical(FrameNode* frameNode, const bool& value) void DividerModelNG::ResetDividerColor() { + if (SystemProperties::ConfigChangePerform()) { + ACE_UPDATE_PAINT_PROPERTY(DividerRenderProperty, DividerColorSetByTheme, true); + } ACE_RESET_PAINT_PROPERTY_WITH_FLAG(DividerRenderProperty, DividerColor, PROPERTY_UPDATE_RENDER); } } // namespace OHOS::Ace::NG \ No newline at end of file diff --git a/frameworks/core/components_ng/pattern/divider/divider_pattern.cpp b/frameworks/core/components_ng/pattern/divider/divider_pattern.cpp index 7dab30faef9..6201c5a6fd9 100644 --- a/frameworks/core/components_ng/pattern/divider/divider_pattern.cpp +++ b/frameworks/core/components_ng/pattern/divider/divider_pattern.cpp @@ -65,4 +65,22 @@ void DividerPattern::DumpInfo(std::unique_ptr& json) { json->Put("DividerColor: ", DumpDividerColor().c_str()); } + +void DividerPattern::OnColorConfigurationUpdate() +{ + if (!SystemProperties::ConfigChangePerform()) { + return; + } + auto host = GetHost(); + CHECK_NULL_VOID(host); + auto pipeline = host->GetContextWithCheck(); + CHECK_NULL_VOID(pipeline); + auto theme = pipeline->GetTheme(host->GetThemeScopeId()); + CHECK_NULL_VOID(theme); + auto paintProperty = host->GetPaintProperty(); + CHECK_NULL_VOID(paintProperty); + if (paintProperty->GetDividerColorSetByTheme().value_or(true)) { + paintProperty->UpdateDividerColorByTheme(theme->GetColor()); + } +} } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/divider/divider_pattern.h b/frameworks/core/components_ng/pattern/divider/divider_pattern.h index f0a565d3a47..fc125a4177a 100644 --- a/frameworks/core/components_ng/pattern/divider/divider_pattern.h +++ b/frameworks/core/components_ng/pattern/divider/divider_pattern.h @@ -66,6 +66,8 @@ public: void DumpInfo(std::unique_ptr& json) override; + void OnColorConfigurationUpdate() override; + std::string DumpDividerColor(); bool IsEnableMatchParent() override diff --git a/frameworks/core/components_ng/pattern/divider/divider_render_property.h b/frameworks/core/components_ng/pattern/divider/divider_render_property.h index f26db929fb4..e0a79058cff 100644 --- a/frameworks/core/components_ng/pattern/divider/divider_render_property.h +++ b/frameworks/core/components_ng/pattern/divider/divider_render_property.h @@ -73,10 +73,70 @@ public: PaintProperty::FromJson(json); } - ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(DividerColor, Color, PROPERTY_UPDATE_RENDER); - ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(DividerColorSetByUser, bool, PROPERTY_UPDATE_RENDER); + const std::optional& GetDividerColor() const + { + return propDividerColor_; + } + + bool HasDividerColor() const + { + return propDividerColor_.has_value(); + } + + const Color& GetDividerColorValue() const + { + return propDividerColor_.value(); + } + + const Color& GetDividerColorValue(const Color& defaultValue) const + { + if (!HasDividerColor()) { + return defaultValue; + } + return propDividerColor_.value(); + } + + std::optional CloneDividerColor() const + { + return propDividerColor_; + } + + void ResetDividerColor() + { + return propDividerColor_.reset(); + } + + void UpdateDividerColor(const Color& value) + { + if (propDividerColor_.has_value()) { + if (NearEqual(propDividerColor_.value(), value)) { + return; + } + } + propDividerColor_ = value; + UpdatePropertyChangeFlag(PROPERTY_UPDATE_RENDER); + } + + void UpdateDividerColorByTheme(const Color& value) + { + if (SystemProperties::ConfigChangePerform()) { + UpdateDividerColorSetByTheme(true); + } + if (propDividerColor_.has_value()) { + if (NearEqual(propDividerColor_.value(), value)) { + return; + } + } + propDividerColor_ = value; + UpdatePropertyChangeFlag(PROPERTY_UPDATE_RENDER); + } + + ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(DividerColorSetByTheme, bool, PROPERTY_UPDATE_RENDER); ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(LineCap, LineCap, PROPERTY_UPDATE_RENDER); ACE_DISALLOW_COPY_AND_MOVE(DividerRenderProperty); + +protected: + std::optional propDividerColor_; }; } // namespace OHOS::Ace::NG #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_DIVIDER_DIVIDER_RENDER_PROPERTY_H diff --git a/frameworks/core/interfaces/native/implementation/divider_modifier.cpp b/frameworks/core/interfaces/native/implementation/divider_modifier.cpp index b62bc2afc74..726ac572adb 100644 --- a/frameworks/core/interfaces/native/implementation/divider_modifier.cpp +++ b/frameworks/core/interfaces/native/implementation/divider_modifier.cpp @@ -50,7 +50,7 @@ void ColorImpl(Ark_NativePointer node, { auto frameNode = reinterpret_cast(node); CHECK_NULL_VOID(frameNode); - DividerModelNG::SetDividerColor(frameNode, Converter::OptConvert(*value), true); + DividerModelNG::SetDividerColor(frameNode, Converter::OptConvert(*value), false); } void StrokeWidthImpl(Ark_NativePointer node, diff --git a/frameworks/core/interfaces/native/node/divider_modifier.cpp b/frameworks/core/interfaces/native/node/divider_modifier.cpp index c7ee8dc9f43..a139064ed58 100644 --- a/frameworks/core/interfaces/native/node/divider_modifier.cpp +++ b/frameworks/core/interfaces/native/node/divider_modifier.cpp @@ -67,9 +67,9 @@ void SetDividerColor(ArkUINodeHandle node, uint32_t color, void* colorRawPtr) if (SystemProperties::ConfigChangePerform() && colorRawPtr) { auto* color = reinterpret_cast(colorRawPtr); auto colorResObj = AceType::Claim(color); - DividerModelNG::SetDividerColor(frameNode, colorResObj, true); + DividerModelNG::SetDividerColor(frameNode, colorResObj, false); } else { - DividerModelNG::SetDividerColor(frameNode, Color(color), true); + DividerModelNG::SetDividerColor(frameNode, Color(color), false); } } @@ -81,7 +81,7 @@ void ResetDividerColor(ArkUINodeHandle node) auto theme = GetTheme(); CHECK_NULL_VOID(theme); Color dividerColor = theme->GetColor(); - DividerModelNG::SetDividerColor(frameNode, dividerColor, false); + DividerModelNG::SetDividerColor(frameNode, dividerColor, true); } void SetDividerVertical(ArkUINodeHandle node, ArkUI_Bool value) diff --git a/test/unittest/core/pattern/divider/old_cases/divider_test_ng.cpp b/test/unittest/core/pattern/divider/old_cases/divider_test_ng.cpp index 1357b24ba04..55a5adb5410 100644 --- a/test/unittest/core/pattern/divider/old_cases/divider_test_ng.cpp +++ b/test/unittest/core/pattern/divider/old_cases/divider_test_ng.cpp @@ -18,6 +18,7 @@ #define protected public #include "base/geometry/ng/size_t.h" +#include "core/common/resource/resource_parse_utils.h" #include "core/components/common/properties/color.h" #include "core/components_ng/base/view_stack_processor.h" #include "core/components_ng/pattern/divider/divider_layout_algorithm.h" @@ -25,6 +26,7 @@ #include "core/components_ng/pattern/divider/divider_model_ng.h" #include "core/components_ng/pattern/divider/divider_pattern.h" #include "core/components_ng/pattern/divider/divider_render_property.h" +#include "test/mock/base/mock_system_properties.h" #include "test/mock/core/rosen/mock_canvas.h" #include "test/mock/core/common/mock_theme_manager.h" #include "test/mock/core/pipeline/mock_pipeline_context.h" @@ -343,4 +345,32 @@ HWTEST_F(DividerTestNg, ResObjDividerColorTest1, TestSize.Level1) std::string divider = pattern->GetResCacheMapByKey("divider.Color"); EXPECT_EQ(divider, ""); } + +/** + * @tc.name: OnColorConfigurationUpdate + * @tc.desc: Test OnColorConfigurationUpdate of Divider + * @tc.type: FUNC + */ +HWTEST_F(DividerTestNg, OnColorConfigurationUpdateTest001, TestSize.Level1) +{ + testProperty.strokeWidth = STROKE_WIDTH; + testProperty.vertical = VERTICAL_TRUE; + LayoutConstraintF layoutConstraintF; + layoutConstraintF.maxSize = MAX_SIZE; + RefPtr dividerLayoutAlgorithm = AceType::MakeRefPtr(); + auto themeManager = AceType::MakeRefPtr(); + MockPipelineContext::GetCurrent()->SetThemeManager(themeManager); + + RefPtr frameNode = CreateDividerNode(testProperty); + ASSERT_NE(frameNode, nullptr); + auto pattern = frameNode->GetPattern(); + ASSERT_NE(pattern, nullptr); + g_isConfigChangePerform = true; + pattern->OnColorConfigurationUpdate(); + g_isConfigChangePerform = false; + auto paintProperty = frameNode->GetPaintProperty(); + ASSERT_NE(paintProperty, nullptr); + auto color = paintProperty->GetDividerColorValue(); + EXPECT_EQ(color.ColorToString(), "#FF000000"); +} } // namespace OHOS::Ace::NG -- Gitee