From e7c09b52f4d7432145308121c1b8bcaba42c612c Mon Sep 17 00:00:00 2001 From: quchongchong Date: Wed, 7 May 2025 23:23:14 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8F=9C=E5=8D=95=E8=92=99=E5=B1=82=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: quchongchong Change-Id: Icee112587e9c952591521a68eebcb144ca9bc9c8 --- .../entrance/subwindow/subwindow_ohos.cpp | 28 ------- .../ohos/entrance/subwindow/subwindow_ohos.h | 1 - .../components_ng/pattern/menu/menu_view.cpp | 48 +++++++---- .../menu/wrapper/menu_wrapper_pattern.cpp | 2 +- .../menu/wrapper/menu_wrapper_pattern.h | 11 +++ .../pattern/overlay/overlay_manager.cpp | 79 ++++++++++++++++--- .../pattern/overlay/overlay_manager.h | 6 ++ 7 files changed, 115 insertions(+), 60 deletions(-) diff --git a/adapter/ohos/entrance/subwindow/subwindow_ohos.cpp b/adapter/ohos/entrance/subwindow/subwindow_ohos.cpp index ada967c1bd4..9c89942d1a3 100644 --- a/adapter/ohos/entrance/subwindow/subwindow_ohos.cpp +++ b/adapter/ohos/entrance/subwindow/subwindow_ohos.cpp @@ -976,8 +976,6 @@ void SubwindowOhos::HideMenuNG(bool showPreviewAnimation, bool startDrag) overlay->HideMenuInSubWindow(showPreviewAnimation, startDrag); HideEventColumn(); HidePixelMap(startDrag, 0, 0, false); - HideFilter(false); - HideFilter(true); } void SubwindowOhos::HideMenuNG(const RefPtr& menu, int32_t targetId) @@ -992,8 +990,6 @@ void SubwindowOhos::HideMenuNG(const RefPtr& menu, int32_t target overlay->HideMenuInSubWindow(menu, targetId); HideEventColumn(); HidePixelMap(false, 0, 0, false); - HideFilter(false); - HideFilter(true); } void SubwindowOhos::UpdatePreviewPosition() @@ -1048,10 +1044,8 @@ void SubwindowOhos::ClearMenuNG(int32_t targetId, bool inWindow, bool showAnimat CHECK_NULL_VOID(overlay); if (showAnimation) { overlay->CleanMenuInSubWindowWithAnimation(); - HideFilter(true); } else { overlay->CleanMenuInSubWindow(targetId); - overlay->RemoveFilter(); } HideWindow(); if (overlay->GetMenuNode(targetId)) { @@ -1062,7 +1056,6 @@ void SubwindowOhos::ClearMenuNG(int32_t targetId, bool inWindow, bool showAnimat HideEventColumn(); } HidePixelMap(false, 0, 0, false); - HideFilter(false); } void SubwindowOhos::ClearPopupNG() @@ -2060,27 +2053,6 @@ bool SubwindowOhos::IsFocused() return window_->IsFocused(); } -void SubwindowOhos::HideFilter(bool isInSubWindow) -{ - TAG_LOGI(AceLogTag::ACE_SUB_WINDOW, "HideFilter enter, subWindow: %{public}d", isInSubWindow); - RefPtr aceContainer = nullptr; - if (isInSubWindow) { - aceContainer = Platform::AceContainer::GetContainer(childContainerId_); - } else { - aceContainer = Platform::AceContainer::GetContainer(parentContainerId_); - } - - CHECK_NULL_VOID(aceContainer); - auto pipelineContext = DynamicCast(aceContainer->GetPipelineContext()); - CHECK_NULL_VOID(pipelineContext); - auto overlayManager = pipelineContext->GetOverlayManager(); - CHECK_NULL_VOID(overlayManager); - - auto containerId = isInSubWindow ? childContainerId_ : parentContainerId_; - ContainerScope scope(containerId); - overlayManager->RemoveFilterAnimation(); -} - void SubwindowOhos::HidePixelMap(bool startDrag, double x, double y, bool showAnimation) { auto parentAceContainer = Platform::AceContainer::GetContainer(parentContainerId_); diff --git a/adapter/ohos/entrance/subwindow/subwindow_ohos.h b/adapter/ohos/entrance/subwindow/subwindow_ohos.h index 0ba75869061..23bccb4f6e3 100644 --- a/adapter/ohos/entrance/subwindow/subwindow_ohos.h +++ b/adapter/ohos/entrance/subwindow/subwindow_ohos.h @@ -258,7 +258,6 @@ private: std::function&& callback); void ContainerModalUnFocus(); - void HideFilter(bool isInSubWindow); void HidePixelMap(bool startDrag = false, double x = 0, double y = 0, bool showAnimation = true); void HideEventColumn(); Rosen::WindowType GetToastRosenType(bool IsSceneBoardEnabled); diff --git a/frameworks/core/components_ng/pattern/menu/menu_view.cpp b/frameworks/core/components_ng/pattern/menu/menu_view.cpp index 59447cdeb62..73277443129 100644 --- a/frameworks/core/components_ng/pattern/menu/menu_view.cpp +++ b/frameworks/core/components_ng/pattern/menu/menu_view.cpp @@ -806,8 +806,25 @@ void SetPixelMap(const RefPtr& target, const RefPtr& wrapp geometryNode->SetFrameOffset(imageOffset); } -void SetFilter(const RefPtr& targetNode, const RefPtr& menuWrapperNode) +static RefPtr CreateFilterColumnNode() { + auto columnNode = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), + AceType::MakeRefPtr(true)); + CHECK_NULL_RETURN(columnNode, nullptr); + auto layoutProperty = columnNode->GetLayoutProperty(); + CHECK_NULL_RETURN(layoutProperty, nullptr); + layoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT); + auto accessibilityProperty = columnNode->GetAccessibilityProperty(); + if (accessibilityProperty) { + accessibilityProperty->SetAccessibilityHoverPriority(true); // consume barrierfree hover event + } + + return columnNode; +} + +static void SetFilter(const RefPtr& targetNode, const RefPtr& menuWrapperNode) +{ + CHECK_NULL_VOID(targetNode && menuWrapperNode); auto parent = targetNode->GetParent(); CHECK_NULL_VOID(parent); while (parent->GetDepth() != 1) { @@ -831,24 +848,19 @@ void SetFilter(const RefPtr& targetNode, const RefPtr& men bool isBindOverlayValue = targetNode->GetLayoutProperty()->GetIsBindOverlayValue(false); CHECK_NULL_VOID(isBindOverlayValue && menuTheme->GetHasFilter()); // insert columnNode to rootNode - auto columnNode = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), - AceType::MakeRefPtr(true)); - columnNode->GetLayoutProperty()->UpdateMeasureType(MeasureType::MATCH_PARENT); - auto accessibilityProperty = columnNode->GetAccessibilityProperty(); - if (accessibilityProperty) { - accessibilityProperty->SetAccessibilityHoverPriority(true); // consume barrierfree hover event - } + auto columnNode = CreateFilterColumnNode(); + CHECK_NULL_VOID(columnNode); // set filter + auto menuWrapperPattern = menuWrapperNode->GetPattern(); + CHECK_NULL_VOID(menuWrapperPattern); + menuWrapperPattern->SetFilterColumnNode(columnNode); if (container->IsSceneBoardWindow()) { auto windowScene = manager->FindWindowScene(targetNode); manager->MountFilterToWindowScene(columnNode, windowScene); manager->ShowFilterAnimation(columnNode); } else if (container->IsUIExtensionWindow()) { // mount filter node on subwindow to ensure filter node's size equals to host window's size - CHECK_NULL_VOID(menuWrapperNode); - auto menuWrapperPattern = menuWrapperNode->GetPattern(); - CHECK_NULL_VOID(menuWrapperPattern); - menuWrapperPattern->SetFilterColumnNode(columnNode); + menuWrapperPattern->SetIsFilterInSubwindow(true); } else { columnNode->MountToParent(parent); columnNode->OnMountToParentDone(); @@ -902,11 +914,13 @@ void SetPreviewInfoToMenu(const RefPtr& targetNode, const RefPtrGetPattern(); CHECK_NULL_VOID(menuWrapperPattern); - auto columnNode = menuWrapperPattern->GetFilterColumnNode(); - CHECK_NULL_VOID(columnNode); - auto columnRenderContext = columnNode->GetRenderContext(); - CHECK_NULL_VOID(columnRenderContext); - columnRenderContext->UpdateZIndex(-1); + if (menuWrapperPattern->GetIsFilterInSubwindow()) { + auto columnNode = menuWrapperPattern->GetFilterColumnNode(); + CHECK_NULL_VOID(columnNode); + auto columnRenderContext = columnNode->GetRenderContext(); + CHECK_NULL_VOID(columnRenderContext); + columnRenderContext->UpdateZIndex(-1); + } } } diff --git a/frameworks/core/components_ng/pattern/menu/wrapper/menu_wrapper_pattern.cpp b/frameworks/core/components_ng/pattern/menu/wrapper/menu_wrapper_pattern.cpp index 41647b8a16e..f357251dcc3 100644 --- a/frameworks/core/components_ng/pattern/menu/wrapper/menu_wrapper_pattern.cpp +++ b/frameworks/core/components_ng/pattern/menu/wrapper/menu_wrapper_pattern.cpp @@ -673,7 +673,7 @@ void MenuWrapperPattern::SetHotAreas(const RefPtr& layoutWrapper) // If container is UIExtensionWindow, set hotArea size equals to subwindow's filterColumnNode's size if (IsContextMenu() && GetPreviewMode() != MenuPreviewMode::NONE) { auto filterNode = GetFilterColumnNode(); - if (filterNode) { + if (filterNode && GetIsFilterInSubwindow()) { auto filterNodeGeometryNode = filterNode->GetGeometryNode(); CHECK_NULL_VOID(filterNodeGeometryNode); auto frameRect = filterNodeGeometryNode->GetFrameRect(); diff --git a/frameworks/core/components_ng/pattern/menu/wrapper/menu_wrapper_pattern.h b/frameworks/core/components_ng/pattern/menu/wrapper/menu_wrapper_pattern.h index 22bd2b7b9ca..61a673aae83 100644 --- a/frameworks/core/components_ng/pattern/menu/wrapper/menu_wrapper_pattern.h +++ b/frameworks/core/components_ng/pattern/menu/wrapper/menu_wrapper_pattern.h @@ -400,6 +400,16 @@ public: return filterColumnNode_; } + void SetIsFilterInSubwindow(bool inSubwindow) + { + isFilterInSubWindow_ = inSubwindow; + } + + bool GetIsFilterInSubwindow() const + { + return isFilterInSubWindow_; + } + void DumpInfo() override; void DumpInfo(std::unique_ptr& json) override; void DumpSimplifyInfo(std::unique_ptr& json) override {} @@ -663,6 +673,7 @@ private: bool hasFoldModeChangeTransition_ = false; OffsetF previewDisappearStartOffset_; RefPtr filterColumnNode_; + bool isFilterInSubWindow_ = false; MenuDumpInfo dumpInfo_; bool hasCustomRadius_ = false; PreviewMenuAnimationInfo animationInfo_; diff --git a/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp b/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp index c182d4bbb3b..8067ce43a9e 100644 --- a/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp +++ b/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp @@ -2649,7 +2649,7 @@ void OverlayManager::ShowMenuInSubWindow(int32_t targetId, const NG::OffsetF& of CHECK_NULL_VOID(menuWrapperPattern); if (menuWrapperPattern->IsContextMenu() && menuWrapperPattern->GetPreviewMode() != MenuPreviewMode::NONE) { auto filterNode = menuWrapperPattern->GetFilterColumnNode(); - if (filterNode) { + if (filterNode && menuWrapperPattern->GetIsFilterInSubwindow()) { SetHasFilter(true); SetFilterColumnNode(filterNode); filterNode->MountToParent(rootNode); @@ -2671,7 +2671,7 @@ void OverlayManager::ShowMenuInSubWindow(int32_t targetId, const NG::OffsetF& of void OverlayManager::HideMenuInSubWindow(const RefPtr& menu, int32_t targetId) { - TAG_LOGI(AceLogTag::ACE_OVERLAY, "hide menu insubwindow enter"); + TAG_LOGI(AceLogTag::ACE_OVERLAY, "hide menu insubwindow enter, id: %{public}d", menu ? menu->GetId() : -1); CHECK_NULL_VOID(menu); if (menu && menu->GetTag() == V2::MENU_WRAPPER_ETS_TAG) { auto wrapperPattern = menu->GetPattern(); @@ -2679,6 +2679,7 @@ void OverlayManager::HideMenuInSubWindow(const RefPtr& menu, int32_t wrapperPattern->UpdateMenuAnimation(menu); } PopMenuAnimation(menu); + RemoveMenuFilter(menu); } void OverlayManager::HideMenuInSubWindow(bool showPreviewAnimation, bool startDrag) @@ -2692,6 +2693,7 @@ void OverlayManager::HideMenuInSubWindow(bool showPreviewAnimation, bool startDr auto node = DynamicCast(child); if (node->GetTag() == V2::MENU_WRAPPER_ETS_TAG) { PopMenuAnimation(node, showPreviewAnimation, startDrag); + RemoveMenuFilter(node); } } } @@ -2744,7 +2746,7 @@ void OverlayManager::HideMenu( CHECK_NULL_VOID(wrapperPattern); auto menuPreviewMode = wrapperPattern->GetPreviewMode(); if (menuPreviewMode != MenuPreviewMode::NONE) { - RemoveFilterAnimation(); + RemoveMenuFilter(menu); } } @@ -2823,6 +2825,7 @@ void OverlayManager::CleanMenuInSubWindowWithAnimation() wrapperPattern->UpdateMenuAnimation(menu); } PopMenuAnimation(menu); + RemoveMenuFilter(menu); } void OverlayManager::CleanHoverImagePreviewInSubWindow(const RefPtr& flexNode) @@ -2906,6 +2909,7 @@ void OverlayManager::CleanMenuInSubWindow(int32_t targetId) auto subwindowMgr = SubwindowManager::GetInstance(); subwindowMgr->DeleteHotAreas(Container::CurrentId(), node->GetId(), SubwindowType::TYPE_MENU); menuWrapperPattern->SetMenuStatus(MenuStatus::HIDE); + RemoveMenuFilter(node, false); break; } } @@ -6932,17 +6936,33 @@ void OverlayManager::UpdatePixelMapScale(float& scale) } } -void OverlayManager::RemoveFilterAnimation() +void OverlayManager::RemoveMenuFilter(const RefPtr& menuWrapper, bool hasAnimation) { - if (!hasFilter_) { - TAG_LOGD(AceLogTag::ACE_OVERLAY, "filter node is not exist"); + TAG_LOGI(AceLogTag::ACE_OVERLAY, "remove filter enter, hasAnimation: %{public}d", hasAnimation); + CHECK_NULL_VOID(menuWrapper); + auto warpperPattern = menuWrapper->GetPattern(); + CHECK_NULL_VOID(warpperPattern); + auto filterNode = warpperPattern->GetFilterColumnNode(); + CHECK_NULL_VOID(filterNode); + auto pipeline = filterNode->GetContextRefPtr(); + CHECK_NULL_VOID(pipeline); + auto overlayManager = pipeline->GetOverlayManager(); + CHECK_NULL_VOID(overlayManager); + if (overlayManager->IsFilterOnDisappear(filterNode->GetId())) { + TAG_LOGI(AceLogTag::ACE_OVERLAY, "filter is onDisappear, filterId: %{public}d", filterNode->GetId()); return; } - auto filterNode = filterColumnNodeWeak_.Upgrade(); - if (!filterNode) { - hasFilter_ = false; - return; + + if (hasAnimation) { + overlayManager->ShowFilterDisappearAnimation(filterNode); + } else { + overlayManager->RemoveFilterWithNode(filterNode); } +} + +void OverlayManager::ShowFilterDisappearAnimation(const RefPtr& filterNode) +{ + CHECK_NULL_VOID(filterNode); auto filterContext = filterNode->GetRenderContext(); CHECK_NULL_VOID(filterContext); auto pipelineContext = PipelineContext::GetCurrentContext(); @@ -6951,16 +6971,18 @@ void OverlayManager::RemoveFilterAnimation() CHECK_NULL_VOID(menuTheme); AnimationOption option; option.SetOnFinishEvent([weak = WeakClaim(this), filterWeak_ = WeakClaim(RawPtr(filterNode))] { - TAG_LOGI(AceLogTag::ACE_OVERLAY, "remove filter animation finish"); + TAG_LOGI(AceLogTag::ACE_OVERLAY, "show filter disappear animation finish"); auto overlayManager = weak.Upgrade(); CHECK_NULL_VOID(overlayManager); auto filterNode = filterWeak_.Upgrade(); CHECK_NULL_VOID(filterNode); overlayManager->RemoveFilterWithNode(filterNode); + overlayManager->RemoveFilterOnDisappear(filterNode->GetId()); }); option.SetDuration(menuTheme->GetFilterAnimationDuration()); option.SetCurve(Curves::SHARP); - TAG_LOGI(AceLogTag::ACE_OVERLAY, "start remove filter animation"); + TAG_LOGI(AceLogTag::ACE_OVERLAY, "start filter disappear animation, filterId: %{public}d", filterNode->GetId()); + AddFilterOnDisappear(filterNode->GetId()); AnimationUtils::Animate( option, [filterContext]() { @@ -6973,6 +6995,21 @@ void OverlayManager::RemoveFilterAnimation() option.GetOnFinishEvent()); } +void OverlayManager::RemoveFilterAnimation() +{ + if (!hasFilter_) { + TAG_LOGD(AceLogTag::ACE_OVERLAY, "filter node is not exist"); + return; + } + auto filterNode = filterColumnNodeWeak_.Upgrade(); + if (!filterNode) { + hasFilter_ = false; + return; + } + + ShowFilterDisappearAnimation(filterNode); +} + void OverlayManager::RemoveFilterWithNode(const RefPtr& filterNode) { CHECK_NULL_VOID(filterNode); @@ -6982,9 +7019,10 @@ void OverlayManager::RemoveFilterWithNode(const RefPtr& filterNode) auto columnNode = filterColumnNodeWeak_.Upgrade(); auto isRemoveCurrentFilter = columnNode && columnNode->GetId() == filterNode->GetId(); + TAG_LOGI(AceLogTag::ACE_OVERLAY, "remove filter sucessfully, filterId: %{public}d", filterNode->GetId()); + rootNode->RemoveChild(filterNode); rootNode->RebuildRenderContextTree(); - TAG_LOGI(AceLogTag::ACE_OVERLAY, "remove filter sucessfully"); if (isRemoveCurrentFilter) { hasFilter_ = false; @@ -8582,4 +8620,19 @@ bool OverlayManager::CheckSkipMenuShow(int32_t targetId) { return skipTargetIds_.find(targetId) != skipTargetIds_.end(); } + +void OverlayManager::AddFilterOnDisappear(int32_t filterId) +{ + onDisappearFilterIds_.insert(filterId); +} + +void OverlayManager::RemoveFilterOnDisappear(int32_t filterId) +{ + onDisappearFilterIds_.erase(filterId); +} + +bool OverlayManager::IsFilterOnDisappear(int32_t filterId) const +{ + return onDisappearFilterIds_.find(filterId) != onDisappearFilterIds_.end(); +} } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/overlay/overlay_manager.h b/frameworks/core/components_ng/pattern/overlay/overlay_manager.h index 193242ceba2..eaf321efdd6 100644 --- a/frameworks/core/components_ng/pattern/overlay/overlay_manager.h +++ b/frameworks/core/components_ng/pattern/overlay/overlay_manager.h @@ -418,6 +418,11 @@ public: void RemoveFilter(); void RemoveFilterWithNode(const RefPtr& filterNode); void RemoveFilterAnimation(); + void RemoveMenuFilter(const RefPtr& menuWrapper, bool hasAnimation = true); + void ShowFilterDisappearAnimation(const RefPtr& filterNode); + void AddFilterOnDisappear(int32_t filterId); + void RemoveFilterOnDisappear(int32_t filterId); + bool IsFilterOnDisappear(int32_t filterId) const; void RemoveEventColumn(); void UpdatePixelMapPosition(bool isSubwindowOverlay = false); void UpdateContextMenuDisappearPosition(const NG::OffsetF& offset, float menuScale = 1.0f, @@ -1024,6 +1029,7 @@ private: std::set curSessionIds_; std::set skipTargetIds_; std::optional overlayInfo_; + std::unordered_set onDisappearFilterIds_; }; } // namespace OHOS::Ace::NG -- Gitee