From b0f5a5cba37f2e192bb062bb3c03b8742a98eaee Mon Sep 17 00:00:00 2001 From: zhanghang Date: Sat, 9 Aug 2025 17:17:39 +0800 Subject: [PATCH] =?UTF-8?q?popup=E5=92=8Cbutton=E7=BB=84=E4=BB=B6=E4=B8=80?= =?UTF-8?q?=E8=87=B4=E6=80=A7=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhanghang --- .../declarative_frontend/jsview/js_popups.cpp | 77 ++++++++++--------- .../declarative_frontend/jsview/js_popups.h | 10 +-- .../common/properties/popup_param.h | 42 +++++----- .../pattern/button/button_pattern.cpp | 6 +- .../button/button_function_test_ng.cpp | 13 ++-- 5 files changed, 76 insertions(+), 72 deletions(-) diff --git a/frameworks/bridge/declarative_frontend/jsview/js_popups.cpp b/frameworks/bridge/declarative_frontend/jsview/js_popups.cpp index 37726ca42af..6b7ebd3c8f4 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_popups.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_popups.cpp @@ -1044,8 +1044,15 @@ void JSViewPopups::ParseMenuBorderRadiusWithResourceObj(const RefPtr& resObj, NG::BorderRadiusProperty& borderRadiusProp) { CalcDimension radius; - ResourceParseUtils::ParseResDimensionVp(resObj, radius); - borderRadiusProp.SetRadius(radius); + auto state = ResourceParseUtils::ParseResDimensionVp(resObj, radius); + if (state && GreatOrEqual(radius.Value(), 0.0f)) { + borderRadiusProp.SetRadius(radius); + } else { + borderRadiusProp.radiusTopLeft = std::nullopt; + borderRadiusProp.radiusTopRight = std::nullopt; + borderRadiusProp.radiusBottomLeft = std::nullopt; + borderRadiusProp.radiusBottomRight = std::nullopt; + } borderRadiusProp.multiValued = false; }; menuBorderRadius.AddResource("borderRadius.radius", borderRadiusResObj, std::move(updateFunc)); @@ -1372,7 +1379,7 @@ void JSViewPopups::ParseMenuParam( auto offsetVal = menuOptions->GetProperty("offset"); if (offsetVal->IsObject()) { auto offsetObj = JSRef::Cast(offsetVal); - JSViewPopups::ParseMenuoffsetParam(offsetObj, menuParam); + JSViewPopups::ParseMenuOffsetParam(offsetObj, menuParam); } auto placementValue = menuOptions->GetProperty("placement"); @@ -1513,38 +1520,6 @@ void JSViewPopups::ParseMenuParam( } } -void JSViewPopups::ParseMenuoffsetParam(const JSRef& offsetObj, NG::MenuParam& menuParam) -{ - JSRef xVal = offsetObj->GetProperty(static_cast(ArkUIIndex::X)); - JSRef yVal = offsetObj->GetProperty(static_cast(ArkUIIndex::Y)); - CalcDimension dx; - CalcDimension dy; - RefPtr offsetDxResObj; - if (JSViewAbstract::ParseJsDimensionVp(xVal, dx, offsetDxResObj)) { - menuParam.positionOffset.SetX(dx.ConvertToPx()); - } - RefPtr offsetDyResObj; - if (JSViewAbstract::ParseJsDimensionVp(yVal, dy, offsetDyResObj)) { - menuParam.positionOffset.SetY(dy.ConvertToPx()); - } - if (offsetDxResObj) { - auto&& updateFunc = [](const RefPtr& resObj, NG::MenuParam& menuParam) { - CalcDimension dx; - ResourceParseUtils::ParseResDimensionVp(resObj, dx); - menuParam.positionOffset.SetX(dx.ConvertToPx()); - }; - menuParam.AddResource("offset.dx", offsetDxResObj, std::move(updateFunc)); - } - if (offsetDyResObj) { - auto&& updateFunc = [](const RefPtr& resObj, NG::MenuParam& menuParam) { - CalcDimension dy; - ResourceParseUtils::ParseResDimensionVp(resObj, dy); - menuParam.positionOffset.SetY(dy.ConvertToPx()); - }; - menuParam.AddResource("offset.dy", offsetDyResObj, std::move(updateFunc)); - } -} - void JSViewPopups::InitMenuParamColorMode(NG::MenuParam& menuParam) { auto node = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode(); @@ -1643,6 +1618,38 @@ void ParsePreviewBorderRadiusParam(const JSRef& menuContentOptions, NG menuParam.previewBorderRadius = previewBorderRadius; } +void JSViewPopups::ParseMenuOffsetParam(const JSRef& offsetObj, NG::MenuParam& menuParam) +{ + JSRef xVal = offsetObj->GetProperty(static_cast(ArkUIIndex::X)); + JSRef yVal = offsetObj->GetProperty(static_cast(ArkUIIndex::Y)); + CalcDimension dx; + CalcDimension dy; + RefPtr offsetDxResObj; + if (JSViewAbstract::ParseJsDimensionVp(xVal, dx, offsetDxResObj)) { + menuParam.positionOffset.SetX(dx.ConvertToPx()); + } + RefPtr offsetDyResObj; + if (JSViewAbstract::ParseJsDimensionVp(yVal, dy, offsetDyResObj)) { + menuParam.positionOffset.SetY(dy.ConvertToPx()); + } + if (offsetDxResObj) { + auto&& updateFunc = [](const RefPtr& resObj, NG::MenuParam& menuParam) { + CalcDimension dx; + ResourceParseUtils::ParseResDimensionVp(resObj, dx); + menuParam.positionOffset.SetX(dx.ConvertToPx()); + }; + menuParam.AddResource("offset.dx", offsetDxResObj, std::move(updateFunc)); + } + if (offsetDyResObj) { + auto&& updateFunc = [](const RefPtr& resObj, NG::MenuParam& menuParam) { + CalcDimension dy; + ResourceParseUtils::ParseResDimensionVp(resObj, dy); + menuParam.positionOffset.SetY(dy.ConvertToPx()); + }; + menuParam.AddResource("offset.dy", offsetDyResObj, std::move(updateFunc)); + } +} + void ParseBindContentOptionParam(const JSCallbackInfo& info, const JSRef& args, NG::MenuParam& menuParam, std::function& previewBuildFunc) { diff --git a/frameworks/bridge/declarative_frontend/jsview/js_popups.h b/frameworks/bridge/declarative_frontend/jsview/js_popups.h index cb58c05d730..b7010d5499a 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_popups.h +++ b/frameworks/bridge/declarative_frontend/jsview/js_popups.h @@ -36,9 +36,7 @@ public: static void ParseResLayoutRegionMargin(const RefPtr& resObj, std::optional& calcDimension); static void ParseMenuLayoutRegionMarginParam(const JSRef& menuOptions, NG::MenuParam& menuParam); - static void ParseMenuBlurStyleOption(const JSRef& menuOptions, NG::MenuParam& menuParam); static void ParseMenuBorderRadius(const JSRef& menuOptions, NG::MenuParam& menuParam); - static void ParseMenuEffectOption(const JSRef& menuOptions, NG::MenuParam& menuParam); static void ParseMenuParam( const JSCallbackInfo& info, const JSRef& menuOptions, NG::MenuParam& menuParam); static void ParseMenuAppearLifeCycleParam( @@ -46,14 +44,14 @@ public: static void ParseMenuDisappearLifeCycleParam( const JSCallbackInfo& info, const JSRef& menuOptions, NG::MenuParam& menuParam); static void ParseBindOptionParam(const JSCallbackInfo& info, NG::MenuParam& menuParam, size_t optionIndex); + static void ParseMenuBlurStyleOption(const JSRef& menuOptions, NG::MenuParam& menuParam); + static void ParseMenuEffectOption(const JSRef& menuOptions, NG::MenuParam& menuParam); static void ParseMenuHapticFeedbackMode(const JSRef& menuOptions, NG::MenuParam& menuParam); static void ParseMenuOutlineWidth(const JSRef& outlineWidthValue, NG::MenuParam& menuParam); static void ParseMenuOutlineColor(const JSRef& outlineColorValue, NG::MenuParam& menuParam); - static void ParseMenuPreviewScaleMode(const JSRef& menuOptions, NG::MenuParam& menuParam); - static void ParseMenuAvailableLayoutArea(const JSRef& menuOptions, NG::MenuParam& menuParam); static void ParseMenuMaskType(const JSRef& menuOptions, NG::MenuParam& menuParam); static void ParseMenuModalMode(const JSRef& menuOptions, NG::MenuParam& menuParam); - static void ParseMenuoffsetParam(const JSRef& offsetObj, NG::MenuParam& menuParam); + static void ParseMenuOffsetParam(const JSRef& offsetObj, NG::MenuParam& menuParam); static void InitMenuParamColorMode(NG::MenuParam& menuParam); static void ParseMenuPreviewBorderRadius(const JSRef& args, NG::BorderRadiusProperty& radius); private: @@ -73,6 +71,8 @@ private: const RefPtr& bottomResObj, NG::BorderWidthProperty& outlineWidth); static void ParseMenuBorderRadiusWithResourceObj(const RefPtr& borderRadiusResObj, NG::BorderRadiusProperty& menuBorderRadius); + static void ParseMenuPreviewScaleMode(const JSRef& menuOptions, NG::MenuParam& menuParam); + static void ParseMenuAvailableLayoutArea(const JSRef& menuOptions, NG::MenuParam& menuParam); static bool ParseMenuPreviewBorderRadiusObject(const JSRef& args, NG::BorderRadiusProperty& props); static void ParseMenuPreviewBorderRadiusMultiObject(const JSRef& object, NG::BorderRadiusProperty& props); static void SetBorderRadiusProps(const CalcDimension& dim, NG::BorderRadiusProperty& props, const char* propName); diff --git a/frameworks/core/components/common/properties/popup_param.h b/frameworks/core/components/common/properties/popup_param.h index f550fc73985..d351584b181 100644 --- a/frameworks/core/components/common/properties/popup_param.h +++ b/frameworks/core/components/common/properties/popup_param.h @@ -571,6 +571,16 @@ public: return isCaretMode_; } + StateChangeFunc GetDoubleBindCallback() + { + return doubleBindCallback_; + } + + void SetDoubleBindCallback(StateChangeFunc&& callback) + { + doubleBindCallback_ = callback; + } + void SetKeyBoardAvoidMode (PopupKeyboardAvoidMode keyboardAvoidMode) { keyboardAvoidMode_ = keyboardAvoidMode; @@ -585,22 +595,12 @@ public: { avoidTarget_ = avoidTarget; } - + std::optional GetAvoidTarget() const { return avoidTarget_; } - StateChangeFunc GetDoubleBindCallback() - { - return doubleBindCallback_; - } - - void SetDoubleBindCallback(StateChangeFunc&& callback) - { - doubleBindCallback_ = callback; - } - void SetFollowTransformOfTarget (bool followTransformOfTarget) { followTransformOfTarget_ = followTransformOfTarget; @@ -670,6 +670,16 @@ public: return innerBorderWidth_; } + void SetAnchorType(TipsAnchorType anchorType) + { + anchorType_ = anchorType; + } + + TipsAnchorType GetAnchorType() const + { + return anchorType_; + } + void SetTextColorResourceObject(RefPtr& obj) { resourceTextColorObj_ = obj; @@ -710,16 +720,6 @@ public: return resourceMaskObj_; } - void SetAnchorType(TipsAnchorType anchorType) - { - anchorType_ = anchorType; - } - - TipsAnchorType GetAnchorType() const - { - return anchorType_; - } - void SetWidthResourceObject(RefPtr& obj) { resourceWidthObj_ = obj; diff --git a/frameworks/core/components_ng/pattern/button/button_pattern.cpp b/frameworks/core/components_ng/pattern/button/button_pattern.cpp index 97874ea90aa..50b8104c86a 100644 --- a/frameworks/core/components_ng/pattern/button/button_pattern.cpp +++ b/frameworks/core/components_ng/pattern/button/button_pattern.cpp @@ -409,15 +409,11 @@ void ButtonPattern::UpdateComponentColor(const Color& color, const ButtonColorTy CHECK_NULL_VOID(textRenderContext); auto renderContext = host->GetRenderContext(); CHECK_NULL_VOID(renderContext); - auto layoutProperty = GetLayoutProperty(); - CHECK_NULL_VOID(layoutProperty); if (pipelineContext->IsSystmColorChange()) { switch (buttonColorType) { case ButtonColorType::FONT_COLOR: - layoutProperty->UpdateFontColor(color); textRenderContext->UpdateForegroundColor(color); - textNode->MarkModifyDone(); - textNode->MarkDirtyNode(PROPERTY_UPDATE_NORMAL); + textNode->MarkDirtyNode(PROPERTY_UPDATE_LAYOUT); break; case ButtonColorType::BACKGROUND_COLOR: renderContext->UpdateBackgroundColor(color); diff --git a/test/unittest/core/pattern/button/button_function_test_ng.cpp b/test/unittest/core/pattern/button/button_function_test_ng.cpp index b2eb76fc0f1..e9820cefe0e 100644 --- a/test/unittest/core/pattern/button/button_function_test_ng.cpp +++ b/test/unittest/core/pattern/button/button_function_test_ng.cpp @@ -2145,7 +2145,10 @@ HWTEST_F(ButtonFunctionTestNg, UpdateComponentColor, TestSize.Level1) ASSERT_NE(pattern, nullptr); auto renderContext = buttonNode->GetRenderContext(); ASSERT_NE(renderContext, nullptr); - + auto textNode = AceType::DynamicCast(buttonNode->GetFirstChild()); + ASSERT_NE(textNode, nullptr); + auto textRenderContext = textNode->GetRenderContext(); + ASSERT_NE(textRenderContext, nullptr); /** * @tc.steps: step2. Update component color with different conditions. * @tc.expected: step2. Color properties are updated correctly. @@ -2156,13 +2159,11 @@ HWTEST_F(ButtonFunctionTestNg, UpdateComponentColor, TestSize.Level1) buttonNode->SetRerenderable(pair.second); pattern->UpdateComponentColor(Color::RED, static_cast(2)); if (pipelineContext->IsSystmColorChange() && pair.second) { - auto color = layoutProperty->GetFontColor(); - ASSERT_NE(color.has_value(), true); pattern->UpdateComponentColor(Color::RED, ButtonColorType::FONT_COLOR); - color = layoutProperty->GetFontColor(); - EXPECT_EQ(color.value_or(Color::BLACK), Color::RED); + auto foregroundColor = textRenderContext->GetForegroundColor(); + EXPECT_EQ(foregroundColor, Color::RED); pattern->UpdateComponentColor(Color::RED, ButtonColorType::BACKGROUND_COLOR); - color = renderContext->GetBackgroundColor(); + auto color = renderContext->GetBackgroundColor(); EXPECT_EQ(color.value_or(Color::BLACK), Color::RED); } } -- Gitee