From 75056648629f53815eef6685a1369fe320609458 Mon Sep 17 00:00:00 2001 From: zhanghaibo Date: Mon, 15 Jan 2024 21:47:36 +0800 Subject: [PATCH] change position of popup and menu when safe area changed Signed-off-by: zhanghaibo Change-Id: Ia67b427e865b6d8868d77a8318b82578bb5800b7 --- .../pattern/bubble/bubble_pattern.cpp | 17 ++++++++-- .../pattern/menu/menu_pattern.cpp | 33 ++++++++++++------- 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/frameworks/core/components_ng/pattern/bubble/bubble_pattern.cpp b/frameworks/core/components_ng/pattern/bubble/bubble_pattern.cpp index e368da214ed..a9d64e62eee 100644 --- a/frameworks/core/components_ng/pattern/bubble/bubble_pattern.cpp +++ b/frameworks/core/components_ng/pattern/bubble/bubble_pattern.cpp @@ -106,9 +106,20 @@ void BubblePattern::OnAttachToFrameNode() OnAreaChangedFunc onAreaChangedFunc = [popupNodeWk = WeakPtr(host)](const RectF& /* oldRect */, const OffsetF& /* oldOrigin */, const RectF& /* rect */, const OffsetF& /* origin */) { - auto popupNode = popupNodeWk.Upgrade(); - CHECK_NULL_VOID(popupNode); - popupNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE); + auto pipelineContext = PipelineContext::GetCurrentContext(); + AnimationOption option; + option.SetCurve(pipelineContext->GetSafeAreaManager()->GetSafeAreaCurve()); + AnimationUtils::Animate( + option, + [weakPipeline = WeakPtr(pipelineContext), weakPopup = popupNodeWk]() { + auto popup = weakPopup.Upgrade(); + CHECK_NULL_VOID(popup); + auto pipeline = weakPipeline.Upgrade(); + CHECK_NULL_VOID(pipeline); + popup->MarkDirtyNode(PROPERTY_UPDATE_MEASURE); + pipeline->FlushUITasks(); + }); + pipelineContext->FlushPipelineImmediately(); }; eventHub->AddInnerOnAreaChangedCallback(host->GetId(), std::move(onAreaChangedFunc)); } diff --git a/frameworks/core/components_ng/pattern/menu/menu_pattern.cpp b/frameworks/core/components_ng/pattern/menu/menu_pattern.cpp index 2888da1e938..3b449994c54 100644 --- a/frameworks/core/components_ng/pattern/menu/menu_pattern.cpp +++ b/frameworks/core/components_ng/pattern/menu/menu_pattern.cpp @@ -169,17 +169,28 @@ void MenuPattern::OnAttachToFrameNode() OnAreaChangedFunc onAreaChangedFunc = [menuNodeWk = WeakPtr(host)](const RectF& /* oldRect */, const OffsetF& /* oldOrigin */, const RectF& /* rect */, const OffsetF& /* origin */) { - auto menuNode = menuNodeWk.Upgrade(); - CHECK_NULL_VOID(menuNode); - auto menuPattern = menuNode->GetPattern(); - CHECK_NULL_VOID(menuPattern); - auto menuWarpper = menuPattern->GetMenuWrapper(); - CHECK_NULL_VOID(menuWarpper); - auto warpperPattern = menuWarpper->GetPattern(); - CHECK_NULL_VOID(warpperPattern); - if (!warpperPattern->IsHided()) { - menuNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE); - } + auto pipelineContext = PipelineContext::GetCurrentContext(); + AnimationOption option; + option.SetCurve(pipelineContext->GetSafeAreaManager()->GetSafeAreaCurve()); + AnimationUtils::Animate( + option, + [weakPipeline = WeakPtr(pipelineContext), weakMenu = menuNodeWk]() { + auto menu = weakMenu.Upgrade(); + CHECK_NULL_VOID(menu); + auto menuPattern = menu->GetPattern(); + CHECK_NULL_VOID(menuPattern); + auto menuWarpper = menuPattern->GetMenuWrapper(); + CHECK_NULL_VOID(menuWarpper); + auto warpperPattern = menuWarpper->GetPattern(); + CHECK_NULL_VOID(warpperPattern); + if (!warpperPattern->IsHided()) { + auto pipeline = weakPipeline.Upgrade(); + CHECK_NULL_VOID(pipeline); + menu->MarkDirtyNode(PROPERTY_UPDATE_MEASURE); + pipeline->FlushUITasks(); + } + }); + pipelineContext->FlushPipelineImmediately(); }; eventHub->AddInnerOnAreaChangedCallback(host->GetId(), std::move(onAreaChangedFunc)); } -- Gitee