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 a93bb43bea4f13a4ad026f4ff6456a04f639f71b..394d02475193dba9ba8a5dfbf231c95766a7123f 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 5bd33174b70a779bb150c45d93f2030dca143267..045f60491779934b019d936399c04dd8e5b1551c 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 dc2aa6f539aaa67fcde88c310430a524fefda641..f88d269831d5f0b88e6b8dd3a32e9acc3a670dda 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 31e7d2f96678c1b5546162896f6282adca44459a..32ece1ab5ef3725838afcd4cb7aaaca2baa1d4a8 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;