From 04bb06a298d3f6e685411859a982aade7016e148 Mon Sep 17 00:00:00 2001 From: caocan Date: Wed, 2 Nov 2022 23:42:40 +0800 Subject: [PATCH] =?UTF-8?q?ContextMenu=E5=AF=B9=E6=8E=A5close=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=9BContextMenu=E7=82=B9=E5=87=BB=E5=86=85?= =?UTF-8?q?=E9=83=A8=E5=8C=BA=E5=9F=9F=E6=97=B6=E6=B6=88=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: caocan Change-Id: Icab66d754c0320ed408c31744df8e40d64a04d3d --- .../dialog/js_custom_dialog_controller.cpp | 4 ++ .../jsview/menu/js_context_menu.cpp | 6 +- .../menu/wrapper/menu_wrapper_pattern.cpp | 59 +++++++++++++++---- .../menu/wrapper/menu_wrapper_pattern.h | 1 + 4 files changed, 58 insertions(+), 12 deletions(-) diff --git a/frameworks/bridge/declarative_frontend/jsview/dialog/js_custom_dialog_controller.cpp b/frameworks/bridge/declarative_frontend/jsview/dialog/js_custom_dialog_controller.cpp index a93bb43bea4..394d0247519 100644 --- a/frameworks/bridge/declarative_frontend/jsview/dialog/js_custom_dialog_controller.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/dialog/js_custom_dialog_controller.cpp @@ -322,6 +322,10 @@ void JSCustomDialogController::JsOpenDialog(const JSCallbackInfo& info) // NG if (Container::IsCurrentUseNewPipeline()) { auto container = Container::Current(); + if (container->IsSubContainer()) { + auto parentContainerId = SubwindowManager::GetInstance()->GetParentContainerId(Container::CurrentId()); + container = AceEngine::Get().GetContainer(parentContainerId); + } CHECK_NULL_VOID(container); auto pipelineContext = container->GetPipelineContext(); CHECK_NULL_VOID(pipelineContext); diff --git a/frameworks/bridge/declarative_frontend/jsview/menu/js_context_menu.cpp b/frameworks/bridge/declarative_frontend/jsview/menu/js_context_menu.cpp index 5bd33174b70..045f6049177 100644 --- a/frameworks/bridge/declarative_frontend/jsview/menu/js_context_menu.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/menu/js_context_menu.cpp @@ -31,7 +31,11 @@ void JSContextMenu::Close(const JSCallbackInfo& args) return; } #if defined(MULTIPLE_WINDOW_SUPPORTED) - SubwindowManager::GetInstance()->CloseMenu(); + if (Container::IsCurrentUseNewPipeline()) { + SubwindowManager::GetInstance()->HideMenuNG(); + } else { + SubwindowManager::GetInstance()->CloseMenu(); + } #else // Close context menu. auto container = Container::Current(); 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 dc2aa6f539a..f88d269831d 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 @@ -15,6 +15,7 @@ #include "core/components_ng/pattern/menu/wrapper/menu_wrapper_pattern.h" +#include "base/utils/utils.h" #include "core/components/common/properties/shadow_config.h" #include "core/components/select/select_theme.h" #include "core/components_ng/event/click_event.h" @@ -28,15 +29,14 @@ void MenuWrapperPattern::OnModifyDone() auto gestureHub = host->GetOrCreateGestureEventHub(); // close menu when clicked outside the menu region - auto callback = [targetId = targetId_, host](const TouchEventInfo& info) { + auto callback = [targetId = targetId_, host, weak = WeakClaim(this)](const TouchEventInfo& info) { + auto menu = weak.Upgrade(); + CHECK_NULL_VOID(menu); + if (info.GetTouches().empty()) { return; } auto touch = info.GetTouches().front(); - // only hide menu when touch DOWN occurs - if (touch.GetTouchType() != TouchType::DOWN) { - return; - } // get menuNode's touch region auto menuNode = host->GetChildAtIndex(0); @@ -52,15 +52,21 @@ void MenuWrapperPattern::OnModifyDone() auto menuZone = menuGeometryNode->GetFrameRect(); auto menuPattern = menuFrameNode->GetPattern(); CHECK_NULL_VOID(menuPattern); + std::vector rects; + rects.emplace_back(Rect(Offset(menuZone.GetX(), menuZone.GetY()), Size(menuZone.Width(), menuZone.Height()))); + auto position = touch.GetGlobalLocation(); - if (menuPattern->IsContextMenu()) { - std::vector rects; - rects.emplace_back( - Rect(Offset(menuZone.GetX(), menuZone.GetY()), Size(menuZone.Width(), menuZone.Height()))); - SubwindowManager::GetInstance()->SetHotAreas(rects); + if (touch.GetTouchType() == TouchType::UP && menuZone.IsInRegion(PointF(position.GetX(), position.GetY()))) { + if (menuPattern->IsContextMenu()) { + SubwindowManager::GetInstance()->HideMenuNG(targetId); + } + return; + } + + if (touch.GetTouchType() != TouchType::DOWN) { + return; } - auto position = touch.GetGlobalLocation(); // if DOWN-touched outside the menu region, then hide menu if (!menuZone.IsInRegion(PointF(position.GetX(), position.GetY()))) { if (menuPattern->IsContextMenu()) { @@ -80,4 +86,35 @@ void MenuWrapperPattern::OnModifyDone() gestureHub->AddTouchEvent(touchEvent); } +bool MenuWrapperPattern::OnDirtyLayoutWrapperSwap( + const RefPtr& /*dirty*/, bool /*skipMeasure*/, bool /*skipLayout*/) +{ + auto host = GetHost(); + CHECK_NULL_RETURN(host, false); + auto gestureHub = host->GetOrCreateGestureEventHub(); + + auto menuNode = host->GetChildAtIndex(0); + CHECK_NULL_RETURN(menuNode, false); + if (!InstanceOf(menuNode)) { + LOGW("MenuWrapper's child is not a Menu! type = %{public}s", menuNode->GetTag().c_str()); + return false; + } + auto menuFrameNode = DynamicCast(menuNode); + CHECK_NULL_RETURN(menuFrameNode, false); + auto menuGeometryNode = menuFrameNode->GetGeometryNode(); + CHECK_NULL_RETURN(menuGeometryNode, false); + auto menuZone = menuGeometryNode->GetFrameRect(); + auto menuPattern = menuFrameNode->GetPattern(); + CHECK_NULL_RETURN(menuPattern, false); + + if (menuPattern->IsContextMenu()) { + std::vector rects; + rects.emplace_back(Rect(Offset(menuFrameNode->GetOffsetRelativeToWindow().GetX(), + menuFrameNode->GetOffsetRelativeToWindow().GetY()), + Size(menuZone.Width(), menuZone.Height()))); + SubwindowManager::GetInstance()->SetHotAreas(rects); + } + return true; +} + } // namespace OHOS::Ace::NG 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 31e7d2f9667..32ece1ab5ef 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 @@ -51,6 +51,7 @@ public: private: void OnModifyDone() override; + bool OnDirtyLayoutWrapperSwap(const RefPtr& dirty, bool skipMeasure, bool skipLayout) override; // menuId in OverlayManager's map int32_t targetId_ = -1; -- Gitee