From 68024452e824f39f901543351265b16937de4395 Mon Sep 17 00:00:00 2001 From: limeng Date: Tue, 11 Apr 2023 18:04:21 +0800 Subject: [PATCH 1/9] =?UTF-8?q?bindContextMenu=E3=80=81bindMenu=E8=83=BD?= =?UTF-8?q?=E5=8A=9B=E5=A2=9E=E5=BC=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: limeng --- .../entrance/subwindow/subwindow_ohos.cpp | 10 + .../ohos/entrance/subwindow/subwindow_ohos.h | 2 + frameworks/base/geometry/ng/rect_t.h | 6 + frameworks/base/subwindow/subwindow.h | 1 + .../base/subwindow/subwindow_manager.cpp | 27 +++ frameworks/base/subwindow/subwindow_manager.h | 4 + .../jsview/js_view_abstract.cpp | 61 +++++- .../models/view_abstract_model_impl.cpp | 6 +- .../jsview/models/view_abstract_model_impl.h | 3 +- .../core/components_ng/base/view_abstract.cpp | 5 +- .../core/components_ng/base/view_abstract.h | 4 + .../components_ng/base/view_abstract_model.h | 7 +- .../base/view_abstract_model_ng.cpp | 80 +++++++- .../base/view_abstract_model_ng.h | 9 +- .../menu/menu_item/menu_item_pattern.cpp | 2 +- .../pattern/menu/menu_layout_algorithm.cpp | 173 +++++++++++++++++- .../pattern/menu/menu_layout_algorithm.h | 19 ++ .../pattern/menu/menu_layout_property.cpp | 2 + .../pattern/menu/menu_layout_property.h | 5 + .../components_ng/pattern/menu/menu_pattern.h | 8 +- .../components_ng/pattern/menu/menu_view.cpp | 31 ++-- .../components_ng/pattern/menu/menu_view.h | 8 +- .../pattern/navigation/navigation_view.cpp | 3 +- .../pattern/overlay/overlay_manager.cpp | 13 +- .../pattern/overlay/overlay_manager.h | 17 ++ .../view_abstract_model_test_ng.cpp | 5 +- .../menu_accessibility_property_test_ng.cpp | 2 +- .../menu/menu_layout_algorithm_test_ng.cpp | 4 +- .../menu/menu_layout_property_test_ng.cpp | 2 +- .../pattern/menu/menu_pattern_test_ng.cpp | 10 +- .../test/pattern/menu/menu_view_test_ng.cpp | 22 +-- 31 files changed, 479 insertions(+), 72 deletions(-) diff --git a/adapter/ohos/entrance/subwindow/subwindow_ohos.cpp b/adapter/ohos/entrance/subwindow/subwindow_ohos.cpp index 81719ba9c4d..3d1729e3a27 100644 --- a/adapter/ohos/entrance/subwindow/subwindow_ohos.cpp +++ b/adapter/ohos/entrance/subwindow/subwindow_ohos.cpp @@ -43,6 +43,7 @@ #ifdef ENABLE_DRAG_FRAMEWORK #include "core/components_ng/render/adapter/rosen_render_context.h" #endif // ENABLE_DRAG_FRAMEWORK +#include "core/components_ng/pattern/overlay/overlay_manager.h" #include "core/components_ng/render/adapter/rosen_window.h" #include "frameworks/bridge/common/utils/engine_helper.h" #include "frameworks/bridge/declarative_frontend/declarative_frontend.h" @@ -260,6 +261,15 @@ void SubwindowOhos::GetPopupInfoNG(int32_t targetId, NG::PopupInfo& popupInfo) popupInfo = overlayManager->GetPopupInfo(targetId); } +const RefPtr SubwindowOhos::GetOverlayManager() +{ + auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_); + CHECK_NULL_RETURN(aceContainer, nullptr); + auto context = DynamicCast(aceContainer->GetPipelineContext()); + CHECK_NULL_RETURN(context, nullptr); + return context->GetOverlayManager(); +} + void SubwindowOhos::ShowWindow() { LOGI("Show the subwindow"); diff --git a/adapter/ohos/entrance/subwindow/subwindow_ohos.h b/adapter/ohos/entrance/subwindow/subwindow_ohos.h index a7198fb7af2..870a35286d1 100644 --- a/adapter/ohos/entrance/subwindow/subwindow_ohos.h +++ b/adapter/ohos/entrance/subwindow/subwindow_ohos.h @@ -79,6 +79,8 @@ public: void ShowActionMenu(const std::string& title, const std::vector& button, std::function&& callback) override; void CloseDialog(int32_t instanceId) override; + const RefPtr GetOverlayManager() override; + int32_t GetChildContainerId() const { return childContainerId_; diff --git a/frameworks/base/geometry/ng/rect_t.h b/frameworks/base/geometry/ng/rect_t.h index 8c11d3d3a5d..38e0dc3ab8d 100644 --- a/frameworks/base/geometry/ng/rect_t.h +++ b/frameworks/base/geometry/ng/rect_t.h @@ -278,6 +278,12 @@ public: LessNotEqual(other.Bottom(), Top()) || GreatNotEqual(other.Top(), Bottom())); } + bool IsInnerIntersectWith(const RectT& other) const + { + return !(LessOrEqual(other.Right(), Left()) || GreatOrEqual(other.Left(), Right()) || + LessOrEqual(other.Bottom(), Top()) || GreatOrEqual(other.Top(), Bottom())); + } + RectT IntersectRectT(const RectT& other) const { T left = std::max(Left(), other.Left()); diff --git a/frameworks/base/subwindow/subwindow.h b/frameworks/base/subwindow/subwindow.h index 08526eca4df..a65f1dbde56 100644 --- a/frameworks/base/subwindow/subwindow.h +++ b/frameworks/base/subwindow/subwindow.h @@ -72,6 +72,7 @@ public: virtual void ShowActionMenu(const std::string& title, const std::vector& button, std::function&& callback) = 0; virtual void CloseDialog(int32_t instanceId) = 0; + virtual const RefPtr GetOverlayManager() = 0; private: int32_t subwindowId_ = 0; diff --git a/frameworks/base/subwindow/subwindow_manager.cpp b/frameworks/base/subwindow/subwindow_manager.cpp index efdb4d73803..64ec95d89b2 100644 --- a/frameworks/base/subwindow/subwindow_manager.cpp +++ b/frameworks/base/subwindow/subwindow_manager.cpp @@ -147,6 +147,13 @@ void SubwindowManager::SetCurrentSubwindow(const RefPtr& subwindow) { std::lock_guard lock(currentSubwindowMutex_); currentSubwindow_ = subwindow; + + if (onShowMenuCallback_) { + RegisterOnShowMenu(onShowMenuCallback_); + } + if (onHideMenuCallback_) { + RegisterOnHideMenu(onHideMenuCallback_); + } } const RefPtr& SubwindowManager::GetCurrentWindow() @@ -504,4 +511,24 @@ void SubwindowManager::HideSubWindowNG() subwindow->HideSubWindowNG(); } } + +void SubwindowManager::RegisterOnShowMenu(std::function callback) +{ + onShowMenuCallback_ = callback; + if (currentSubwindow_) { + auto overlayManager = currentSubwindow_->GetOverlayManager(); + CHECK_NULL_VOID(overlayManager); + overlayManager->RegisterOnShowMenu(callback); + } +} + +void SubwindowManager::RegisterOnHideMenu(std::function callback) +{ + onHideMenuCallback_ = callback; + if (currentSubwindow_) { + auto overlayManager = currentSubwindow_->GetOverlayManager(); + CHECK_NULL_VOID(overlayManager); + overlayManager->RegisterOnHideMenu(callback); + } +} } // namespace OHOS::Ace diff --git a/frameworks/base/subwindow/subwindow_manager.h b/frameworks/base/subwindow/subwindow_manager.h index bb927d9c71c..794348a9ab0 100644 --- a/frameworks/base/subwindow/subwindow_manager.h +++ b/frameworks/base/subwindow/subwindow_manager.h @@ -93,6 +93,8 @@ public: void ShowActionMenu(const std::string& title, const std::vector& button, std::function&& callback); void CloseDialog(int32_t instanceId); + void RegisterOnShowMenu(std::function callback); + void RegisterOnHideMenu(std::function callback); private: RefPtr GetOrCreateSubWindow(); @@ -120,6 +122,8 @@ private: SubwindowMap dialogSubwindowMap_; std::mutex currentDialogSubwindowMutex_; RefPtr currentDialogSubwindow_; + std::function onShowMenuCallback_ = nullptr; + std::function onHideMenuCallback_ = nullptr; }; } // namespace OHOS::Ace diff --git a/frameworks/bridge/declarative_frontend/jsview/js_view_abstract.cpp b/frameworks/bridge/declarative_frontend/jsview/js_view_abstract.cpp index 46ded66faf4..af715f379a1 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_view_abstract.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_view_abstract.cpp @@ -782,7 +782,7 @@ void ParseCustomPopupParam( auto placementValue = popupObj->GetProperty("placement"); if (placementValue->IsNumber()) { auto placement = placementValue->ToNumber(); - if (placement >= 0 && placement <= static_cast(PLACEMENT.size())) { + if (placement >= 0 && placement < static_cast(PLACEMENT.size())) { popupParam->SetPlacement(PLACEMENT[placement]); } } @@ -2085,10 +2085,8 @@ std::vector ParseBindOptionParam(const JSCallbackInfo& info) return params; } -void ParseBindOptionParam(const JSCallbackInfo& info, NG::MenuParam& menuParam) +void ParseMenuParam(const JSCallbackInfo& info, const JSRef& menuOptions, NG::MenuParam& menuParam) { - auto menuOptions = JSRef::Cast(info[1]); - JSViewAbstract::ParseJsString(menuOptions->GetProperty("title"), menuParam.title); auto offsetVal = menuOptions->GetProperty("offset"); if (offsetVal->IsObject()) { auto offsetObj = JSRef::Cast(offsetVal); @@ -2103,6 +2101,53 @@ void ParseBindOptionParam(const JSCallbackInfo& info, NG::MenuParam& menuParam) menuParam.positionOffset.SetY(dy.ConvertToPx()); } } + + auto placementValue = menuOptions->GetProperty("placement"); + if (placementValue->IsNumber()) { + auto placement = placementValue->ToNumber(); + if (placement >= 0 && placement < static_cast(PLACEMENT.size())) { + menuParam.placement = PLACEMENT[placement]; + } + } + + auto onAppearValue = menuOptions->GetProperty("onAppear"); + if (onAppearValue->IsFunction()) { + RefPtr jsOnAppearFunc = + AceType::MakeRefPtr(JSRef(), JSRef::Cast(onAppearValue)); + auto onAppear = [execCtx = info.GetExecutionContext(), func = std::move(jsOnAppearFunc)]() { + JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx); + LOGI("About to call onAppear method on js"); + ACE_SCORING_EVENT("onAppear"); + func->Execute(); + }; + menuParam.onAppear = std::move(onAppear); + } + + auto onDisappearValue = menuOptions->GetProperty("onDisappear"); + if (onDisappearValue->IsFunction()) { + RefPtr jsOnDisAppearFunc = + AceType::MakeRefPtr(JSRef(), JSRef::Cast(onDisappearValue)); + auto onDisappear = [execCtx = info.GetExecutionContext(), func = std::move(jsOnDisAppearFunc)]() { + JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx); + LOGI("About to call onAppear method on js"); + ACE_SCORING_EVENT("onDisappear"); + func->Execute(); + }; + menuParam.onDisappear = std::move(onDisappear); + } +} + +void ParseBindOptionParam(const JSCallbackInfo& info, NG::MenuParam& menuParam) +{ + auto menuOptions = JSRef::Cast(info[1]); + JSViewAbstract::ParseJsString(menuOptions->GetProperty("title"), menuParam.title); + ParseMenuParam(info, menuOptions, menuParam); +} + +void ParseBindContentOptionParam(const JSCallbackInfo& info, const JSRef& args, NG::MenuParam& menuParam) +{ + auto menuContentOptions = JSRef::Cast(args); + ParseMenuParam(info, menuContentOptions, menuParam); } void JSViewAbstract::JsBindMenu(const JSCallbackInfo& info) @@ -4484,7 +4529,13 @@ void JSViewAbstract::JsBindContextMenu(const JSCallbackInfo& info) ACE_SCORING_EVENT("BuildContextMenu"); func->Execute(); }; - ViewAbstractModel::GetInstance()->BindContextMenu(responseType, std::move(buildFunc)); + + NG::MenuParam menuParam; + if (info.Length() >= 3 && info[2]->IsObject()) { + ParseBindContentOptionParam(info, info[2], menuParam); + } + + ViewAbstractModel::GetInstance()->BindContextMenu(responseType, std::move(buildFunc), menuParam); } void JSViewAbstract::JsBindContentCover(const JSCallbackInfo& info) diff --git a/frameworks/bridge/declarative_frontend/jsview/models/view_abstract_model_impl.cpp b/frameworks/bridge/declarative_frontend/jsview/models/view_abstract_model_impl.cpp index 3855941eb3f..a20e0e7c076 100644 --- a/frameworks/bridge/declarative_frontend/jsview/models/view_abstract_model_impl.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/models/view_abstract_model_impl.cpp @@ -1495,8 +1495,8 @@ GestureEventFunc CreateMenuEventWithBuilder( }; } -void ViewAbstractModelImpl::BindMenu(std::vector&& params, std::function&& buildFunc, - const NG::MenuParam&) +void ViewAbstractModelImpl::BindMenu( + std::vector&& params, std::function&& buildFunc, const NG::MenuParam&) { ViewStackProcessor::GetInstance()->GetCoverageComponent(); auto menuComponent = ViewStackProcessor::GetInstance()->GetMenuComponent(true); @@ -1517,7 +1517,7 @@ void ViewAbstractModelImpl::BindMenu(std::vector&& params, std: click->SetOnClick(tapGesture); } -void ViewAbstractModelImpl::BindContextMenu(ResponseType type, std::function&& buildFunc) +void ViewAbstractModelImpl::BindContextMenu(ResponseType type, std::function&& buildFunc, const NG::MenuParam&) { ViewStackProcessor::GetInstance()->GetCoverageComponent(); auto menuComponent = ViewStackProcessor::GetInstance()->GetMenuComponent(true); diff --git a/frameworks/bridge/declarative_frontend/jsview/models/view_abstract_model_impl.h b/frameworks/bridge/declarative_frontend/jsview/models/view_abstract_model_impl.h index 209c2279bbd..ee6c4262818 100644 --- a/frameworks/bridge/declarative_frontend/jsview/models/view_abstract_model_impl.h +++ b/frameworks/bridge/declarative_frontend/jsview/models/view_abstract_model_impl.h @@ -171,7 +171,8 @@ public: void BindPopup(const RefPtr& param, const RefPtr& customNode) override; void BindMenu(std::vector&& params, std::function&& buildFunc, const NG::MenuParam& menuParam) override; - void BindContextMenu(ResponseType type, std::function&& buildFunc) override; + + void BindContextMenu(ResponseType type, std::function&& buildFunc, const NG::MenuParam& menuParam) override; void BindContentCover(bool isShow, std::function&& callback, std::function&& buildFunc, int32_t type) override {} diff --git a/frameworks/core/components_ng/base/view_abstract.cpp b/frameworks/core/components_ng/base/view_abstract.cpp index 25f7b82ebc6..e2286600570 100644 --- a/frameworks/core/components_ng/base/view_abstract.cpp +++ b/frameworks/core/components_ng/base/view_abstract.cpp @@ -939,7 +939,8 @@ void ViewAbstract::BindMenuWithItems(std::vector&& params, LOGD("menu params is empty"); return; } - auto menuNode = MenuView::Create(std::move(params), targetNode->GetId(), MenuType::MENU, menuParam); + auto menuNode = + MenuView::Create(std::move(params), targetNode->GetId(), targetNode->GetTag(), MenuType::MENU, menuParam); BindMenu(menuNode, targetNode->GetId(), offset); } @@ -954,7 +955,7 @@ void ViewAbstract::BindMenuWithCustomNode(const RefPtr& customNode, cons isContextMenu = false; #endif auto type = isContextMenu ? MenuType::CONTEXT_MENU : MenuType::MENU; - auto menuNode = MenuView::Create(customNode, targetNode->GetId(), type, menuParam); + auto menuNode = MenuView::Create(customNode, targetNode->GetId(), targetNode->GetTag(), type, menuParam); if (isContextMenu) { SubwindowManager::GetInstance()->ShowMenuNG(menuNode, targetNode->GetId(), offset); return; diff --git a/frameworks/core/components_ng/base/view_abstract.h b/frameworks/core/components_ng/base/view_abstract.h index 89f49bd81d7..e08f1d81425 100644 --- a/frameworks/core/components_ng/base/view_abstract.h +++ b/frameworks/core/components_ng/base/view_abstract.h @@ -34,6 +34,7 @@ #include "core/components/common/properties/clip_path.h" #include "core/components/common/properties/decoration.h" #include "core/components/common/properties/motion_path_option.h" +#include "core/components/common/properties/placement.h" #include "core/components/common/properties/popup_param.h" #include "core/components/common/properties/shared_transition_option.h" #include "core/components_ng/event/gesture_event_hub.h" @@ -68,6 +69,9 @@ struct OptionParam { struct MenuParam { std::string title; OffsetF positionOffset; + std::optional placement; + std::function onAppear; + std::function onDisappear; }; class ACE_EXPORT ViewAbstract { diff --git a/frameworks/core/components_ng/base/view_abstract_model.h b/frameworks/core/components_ng/base/view_abstract_model.h index dfb5e42c3c5..4d89cd1c32b 100644 --- a/frameworks/core/components_ng/base/view_abstract_model.h +++ b/frameworks/core/components_ng/base/view_abstract_model.h @@ -214,9 +214,10 @@ public: // popup and menu virtual void BindPopup(const RefPtr& param, const RefPtr& customNode) = 0; - virtual void BindMenu(std::vector&& params, std::function&& buildFunc, - const NG::MenuParam& menuParam) = 0; - virtual void BindContextMenu(ResponseType type, std::function&& buildFunc) = 0; + virtual void BindMenu( + std::vector&& params, std::function&& buildFunc, const NG::MenuParam& menuParam) = 0; + virtual void BindContextMenu( + ResponseType type, std::function&& buildFunc, const NG::MenuParam& menuParam) = 0; virtual void BindContentCover(bool isShow, std::function&& callback, std::function&& buildFunc, int32_t type) = 0; diff --git a/frameworks/core/components_ng/base/view_abstract_model_ng.cpp b/frameworks/core/components_ng/base/view_abstract_model_ng.cpp index 31235a14419..d1f02e75b4d 100644 --- a/frameworks/core/components_ng/base/view_abstract_model_ng.cpp +++ b/frameworks/core/components_ng/base/view_abstract_model_ng.cpp @@ -36,13 +36,18 @@ void ViewAbstractModelNG::BindMenu( #ifdef ENABLE_DRAG_FRAMEWORK ACE_UPDATE_LAYOUT_PROPERTY(LayoutProperty, IsBindOverlay, true); #endif // ENABLE_DRAG_FRAMEWORK + auto overlayManager = NG::PipelineContext::GetCurrentContext()->GetOverlayManager(); + CHECK_NULL_VOID(overlayManager); + RegisterMenuAppearCallback(std::move(params), std::move(buildFunc), menuParam); + GestureEventFunc showMenu; auto weakTarget = AceType::WeakClaim(AceType::RawPtr(targetNode)); if (!params.empty()) { showMenu = [params, weakTarget, menuParam](GestureEvent& info) mutable { auto targetNode = weakTarget.Upgrade(); CHECK_NULL_VOID(targetNode); - NG::OffsetF menuPosition { info.GetGlobalLocation().GetX(), info.GetGlobalLocation().GetY() }; + NG::OffsetF menuPosition { info.GetGlobalLocation().GetX() + menuParam.positionOffset.GetX(), + info.GetGlobalLocation().GetY() + menuParam.positionOffset.GetY() }; // menu already created if (params.empty()) { NG::ViewAbstract::ShowMenu(targetNode->GetId(), menuPosition); @@ -55,7 +60,8 @@ void ViewAbstractModelNG::BindMenu( showMenu = [builderFunc = std::move(buildFunc), weakTarget, menuParam](const GestureEvent& info) mutable { auto targetNode = weakTarget.Upgrade(); CHECK_NULL_VOID(targetNode); - NG::OffsetF menuPosition { info.GetGlobalLocation().GetX(), info.GetGlobalLocation().GetY() }; + NG::OffsetF menuPosition { info.GetGlobalLocation().GetX() + menuParam.positionOffset.GetX(), + info.GetGlobalLocation().GetY() + menuParam.positionOffset.GetY() }; CreateCustomMenu(builderFunc, targetNode, false, menuPosition, menuParam); }; } else { @@ -65,6 +71,8 @@ void ViewAbstractModelNG::BindMenu( auto gestureHub = targetNode->GetOrCreateGestureEventHub(); gestureHub->BindMenu(std::move(showMenu)); + RegisterMenuDisappearCallback(std::move(params), std::move(buildFunc), menuParam); + // delete menu when target node is removed from render tree auto eventHub = targetNode->GetEventHub(); auto destructor = [id = targetNode->GetId()]() { @@ -77,27 +85,31 @@ void ViewAbstractModelNG::BindMenu( eventHub->SetOnDisappear(destructor); } -void ViewAbstractModelNG::BindContextMenu(ResponseType type, std::function&& buildFunc) +void ViewAbstractModelNG::BindContextMenu( + ResponseType type, std::function&& buildFunc, const MenuParam& menuParam) { auto targetNode = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode(); CHECK_NULL_VOID(targetNode); #ifdef ENABLE_DRAG_FRAMEWORK ACE_UPDATE_LAYOUT_PROPERTY(LayoutProperty, IsBindOverlay, true); #endif // ENABLE_DRAG_FRAMEWORK + RegisterContextMenuAppearCallback(type, menuParam); + auto hub = targetNode->GetOrCreateGestureEventHub(); CHECK_NULL_VOID(hub); auto weakTarget = AceType::WeakClaim(AceType::RawPtr(targetNode)); if (type == ResponseType::RIGHT_CLICK) { - OnMouseEventFunc event = [builder = std::move(buildFunc), weakTarget](MouseInfo& info) mutable { + OnMouseEventFunc event = [builder = std::move(buildFunc), weakTarget, menuParam](MouseInfo& info) mutable { auto targetNode = weakTarget.Upgrade(); CHECK_NULL_VOID(targetNode); - NG::OffsetF menuPosition { info.GetGlobalLocation().GetX(), info.GetGlobalLocation().GetY() }; + NG::OffsetF menuPosition { info.GetGlobalLocation().GetX() + menuParam.positionOffset.GetX(), + info.GetGlobalLocation().GetY() + menuParam.positionOffset.GetY() }; auto pipelineContext = NG::PipelineContext::GetCurrentContext(); CHECK_NULL_VOID(pipelineContext); auto windowRect = pipelineContext->GetDisplayWindowRectInfo(); menuPosition += NG::OffsetF { windowRect.Left(), windowRect.Top() }; if (info.GetButton() == MouseButton::RIGHT_BUTTON && info.GetAction() == MouseAction::RELEASE) { - CreateCustomMenu(builder, targetNode, true, menuPosition); + CreateCustomMenu(builder, targetNode, true, menuPosition, menuParam); info.SetStopPropagation(true); } }; @@ -106,15 +118,16 @@ void ViewAbstractModelNG::BindContextMenu(ResponseType type, std::functionBindContextMenu(std::move(event)); } else if (type == ResponseType::LONG_PRESS) { // create or show menu on long press - auto event = [builder = std::move(buildFunc), weakTarget](const GestureEvent& info) mutable { + auto event = [builder = std::move(buildFunc), weakTarget, menuParam](const GestureEvent& info) mutable { auto targetNode = weakTarget.Upgrade(); CHECK_NULL_VOID(targetNode); - NG::OffsetF menuPosition { info.GetGlobalLocation().GetX(), info.GetGlobalLocation().GetY() }; + NG::OffsetF menuPosition { info.GetGlobalLocation().GetX() + menuParam.positionOffset.GetX(), + info.GetGlobalLocation().GetY() + menuParam.positionOffset.GetY() }; auto pipelineContext = NG::PipelineContext::GetCurrentContext(); CHECK_NULL_VOID(pipelineContext); auto windowRect = pipelineContext->GetDisplayWindowRectInfo(); menuPosition += NG::OffsetF { windowRect.Left(), windowRect.Top() }; - CreateCustomMenu(builder, targetNode, true, menuPosition); + CreateCustomMenu(builder, targetNode, true, menuPosition, menuParam); }; auto longPress = AceType::MakeRefPtr(std::move(event)); @@ -123,6 +136,8 @@ void ViewAbstractModelNG::BindContextMenu(ResponseType type, std::functionBindContentCover(isShow, std::move(callback), std::move(buildNodeFunc), type, targetNode->GetId()); } + +void ViewAbstractModelNG::RegisterMenuAppearCallback( + std::vector&& params, std::function&& buildFunc, const MenuParam& menuParam) +{ + auto overlayManager = NG::PipelineContext::GetCurrentContext()->GetOverlayManager(); + CHECK_NULL_VOID(overlayManager); + if (!params.empty() || buildFunc) { + overlayManager->RegisterOnShowMenu([menuParam]() { + if (menuParam.onAppear) { + menuParam.onAppear(); + } + }); + } +} + +void ViewAbstractModelNG::RegisterMenuDisappearCallback( + std::vector&& params, std::function&& buildFunc, const MenuParam& menuParam) +{ + auto overlayManager = NG::PipelineContext::GetCurrentContext()->GetOverlayManager(); + if (overlayManager) { + overlayManager->RegisterOnHideMenu([menuParam]() { + if (menuParam.onDisappear) { + menuParam.onDisappear(); + } + }); + } +} + +void ViewAbstractModelNG::RegisterContextMenuAppearCallback(ResponseType type, const MenuParam& menuParam) +{ + if (type == ResponseType::RIGHT_CLICK || type == ResponseType::LONG_PRESS) { + SubwindowManager::GetInstance()->RegisterOnShowMenu([menuParam]() { + if (menuParam.onAppear) { + menuParam.onAppear(); + } + }); + } +} + +void ViewAbstractModelNG::RegisterContextMenuDisappearCallback(const MenuParam& menuParam) +{ + SubwindowManager::GetInstance()->RegisterOnHideMenu([menuParam]() { + if (menuParam.onDisappear) { + menuParam.onDisappear(); + } + }); +} } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/base/view_abstract_model_ng.h b/frameworks/core/components_ng/base/view_abstract_model_ng.h index 7d6e1e13636..22f98806e14 100644 --- a/frameworks/core/components_ng/base/view_abstract_model_ng.h +++ b/frameworks/core/components_ng/base/view_abstract_model_ng.h @@ -711,7 +711,7 @@ public: void BindMenu( std::vector&& params, std::function&& buildFunc, const MenuParam& menuParam) override; - void BindContextMenu(ResponseType type, std::function&& buildFunc) override; + void BindContextMenu(ResponseType type, std::function&& buildFunc, const MenuParam& menuParam) override; void BindContentCover(bool isShow, std::function&& callback, std::function&& buildFunc, int32_t type) override; @@ -730,6 +730,13 @@ public: { ViewAbstract::SetForegroundColorStrategy(strategy); } +private: + void RegisterMenuAppearCallback( + std::vector&& params, std::function&& buildFunc, const MenuParam& menuParam); + void RegisterMenuDisappearCallback( + std::vector&& params, std::function&& buildFunc, const MenuParam& menuParam); + void RegisterContextMenuAppearCallback(ResponseType type, const MenuParam& menuParam); + void RegisterContextMenuDisappearCallback(const MenuParam& menuParam); }; } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/menu/menu_item/menu_item_pattern.cpp b/frameworks/core/components_ng/pattern/menu/menu_item/menu_item_pattern.cpp index a2542e6acdf..b76acecfdb2 100644 --- a/frameworks/core/components_ng/pattern/menu/menu_item/menu_item_pattern.cpp +++ b/frameworks/core/components_ng/pattern/menu/menu_item/menu_item_pattern.cpp @@ -187,7 +187,7 @@ void MenuItemPattern::ShowSubMenu() NG::ScopedViewStackProcessor builderViewStackProcessor; buildFunc(); auto customNode = NG::ViewStackProcessor::GetInstance()->Finish(); - auto subMenu = MenuView::Create(customNode, host->GetId(), MenuType::SUB_MENU); + auto subMenu = MenuView::Create(customNode, host->GetId(), host->GetTag(), MenuType::SUB_MENU); auto menuPattern = subMenu->GetPattern(); menuPattern->SetParentMenuItem(host); subMenuId_ = subMenu->GetId(); diff --git a/frameworks/core/components_ng/pattern/menu/menu_layout_algorithm.cpp b/frameworks/core/components_ng/pattern/menu/menu_layout_algorithm.cpp index 2e7c19b3e86..afa7b2e19d3 100644 --- a/frameworks/core/components_ng/pattern/menu/menu_layout_algorithm.cpp +++ b/frameworks/core/components_ng/pattern/menu/menu_layout_algorithm.cpp @@ -23,6 +23,8 @@ #include "base/subwindow/subwindow_manager.h" #include "base/utils/utils.h" #include "core/components/common/layout/grid_system_manager.h" +#include "core/components/common/properties/placement.h" +#include "core/components/container_modal/container_modal_constants.h" #include "core/components_ng/pattern/menu/menu_item/menu_item_pattern.h" #include "core/components_ng/pattern/menu/menu_layout_property.h" #include "core/components_ng/pattern/menu/menu_pattern.h" @@ -102,6 +104,7 @@ void MenuLayoutAlgorithm::Initialize(LayoutWrapper* layoutWrapper) pageOffset_ = page->GetOffsetRelativeToWindow(); topSpace_ -= pageOffset_.GetY(); leftSpace_ -= pageOffset_.GetX(); + placement_ = props->GetMenuPlacement().value_or(Placement::BOTTOM); } // Called to perform layout render node and child. @@ -148,6 +151,9 @@ void MenuLayoutAlgorithm::Measure(LayoutWrapper* layoutWrapper) void MenuLayoutAlgorithm::Layout(LayoutWrapper* layoutWrapper) { CHECK_NULL_VOID(layoutWrapper); + auto menuProp = DynamicCast(layoutWrapper->GetLayoutProperty()); + CHECK_NULL_VOID(menuProp); + InitTargetSizeAndPosition(menuProp); auto menuNode = layoutWrapper->GetHostNode(); CHECK_NULL_VOID(menuNode); @@ -159,11 +165,19 @@ void MenuLayoutAlgorithm::Layout(LayoutWrapper* layoutWrapper) } auto size = layoutWrapper->GetGeometryNode()->GetMarginFrameSize(); - float x = HorizontalLayout(size, position_.GetX(), menuPattern->IsSelectMenu()) + positionOffset_.GetX(); - float y = VerticalLayout(size, position_.GetY()) + positionOffset_.GetY(); - if (!menuPattern->IsContextMenu()) { - x -= pageOffset_.GetX(); - y -= pageOffset_.GetY(); + float x = 0.0; + float y = 0.0; + if (menuProp->GetMenuPlacement().has_value() && (targetSize_.Width() > 0.0 || targetSize_.Height() > 0.0)) { + auto childOffset = GetChildPosition(size, menuProp); + x = childOffset.GetX() + positionOffset_.GetX(); + y = childOffset.GetY() + positionOffset_.GetY(); + } else { + x = HorizontalLayout(size, position_.GetX(), menuPattern->IsSelectMenu()) + positionOffset_.GetX(); + y = VerticalLayout(size, position_.GetY()) + positionOffset_.GetY(); + if (!menuPattern->IsContextMenu()) { + x -= pageOffset_.GetX(); + y -= pageOffset_.GetY(); + } } x = std::clamp(x, 0.0f, wrapperSize_.Width() - size.Width() - margin_ * 2.0f); y = std::clamp(y, 0.0f, wrapperSize_.Height() - size.Height() - margin_ * 2.0f); @@ -413,4 +427,153 @@ float MenuLayoutAlgorithm::GetChildrenMaxWidth(LayoutWrapper* layoutWrapper, con return maxWidth; } +OffsetF MenuLayoutAlgorithm::GetPositionWithPlacement( + const SizeF& childSize, const OffsetF& topPosition, const OffsetF& bottomPosition) +{ + OffsetF childPosition; + float marginRight = 0.0f; + float marginBottom = 0.0f; + float marginTop = 0.0f; + float marginLeft = 0.0f; + double targetSpace = 0.0; + switch (placement_) { + case Placement::TOP: + childPosition = topPosition; + break; + case Placement::TOP_LEFT: + childPosition = OffsetF(targetOffset_.GetX() - marginRight, + targetOffset_.GetY() - childSize.Height() - marginBottom - targetSpace); + break; + case Placement::TOP_RIGHT: + childPosition = OffsetF(targetOffset_.GetX() + targetSize_.Width() - childSize.Width() + marginLeft, + targetOffset_.GetY() - childSize.Height() - targetSpace - marginBottom); + break; + case Placement::BOTTOM: + childPosition = bottomPosition; + break; + case Placement::BOTTOM_LEFT: + childPosition = OffsetF(targetOffset_.GetX() - marginRight, + targetOffset_.GetY() + targetSize_.Height() + targetSpace + marginTop); + break; + case Placement::BOTTOM_RIGHT: + childPosition = OffsetF(targetOffset_.GetX() + targetSize_.Width() - childSize.Width() + marginLeft, + targetOffset_.GetY() + targetSize_.Height() + targetSpace + marginTop); + break; + case Placement::LEFT: + childPosition = + OffsetF(targetOffset_.GetX() - targetSpace - childSize.Width() - marginRight, + targetOffset_.GetY() + targetSize_.Height() / 2.0 - childSize.Height() / 2.0); + break; + case Placement::LEFT_TOP: + childPosition = + OffsetF(targetOffset_.GetX() - targetSpace - childSize.Width() - marginRight, + targetOffset_.GetY() - marginBottom); + break; + case Placement::LEFT_BOTTOM: + childPosition = + OffsetF(targetOffset_.GetX() - targetSpace - childSize.Width() - marginRight, + targetOffset_.GetY() + targetSize_.Height() - childSize.Height() - marginTop); + break; + case Placement::RIGHT: + childPosition = + OffsetF(targetOffset_.GetX() + targetSize_.Width() + targetSpace + marginLeft, + targetOffset_.GetY() + targetSize_.Height() / 2.0 - childSize.Height() / 2.0); + break; + case Placement::RIGHT_TOP: + childPosition = + OffsetF(targetOffset_.GetX() + targetSize_.Width() + targetSpace + marginLeft, + targetOffset_.GetY() - marginBottom); + break; + case Placement::RIGHT_BOTTOM: + childPosition = + OffsetF(targetOffset_.GetX() + targetSize_.Width() + targetSpace + marginLeft, + targetOffset_.GetY() + targetSize_.Height() - childSize.Height() - marginTop); + break; + default: + break; + } + return childPosition; +} + +void MenuLayoutAlgorithm::InitTargetSizeAndPosition(const RefPtr& layoutProp) +{ + auto targetNode = FrameNode::GetFrameNode(targetTag_, targetNodeId_); + CHECK_NULL_VOID(targetNode); + auto geometryNode = targetNode->GetGeometryNode(); + CHECK_NULL_VOID(geometryNode); + targetSize_ = geometryNode->GetFrameSize(); + auto pipelineContext = PipelineContext::GetCurrentContext(); + CHECK_NULL_VOID(pipelineContext); + auto isContainerModal = pipelineContext->GetWindowModal() == WindowModal::CONTAINER_MODAL && + pipelineContext->GetWindowManager()->GetWindowMode() == WindowMode::WINDOW_MODE_FLOATING; + targetOffset_ = targetNode->GetPaintRectOffset(); + if (isContainerModal) { + auto newOffsetX = targetOffset_.GetX() - static_cast(CONTAINER_BORDER_WIDTH.ConvertToPx()) - + static_cast(CONTENT_PADDING.ConvertToPx()); + auto newOffsetY = targetOffset_.GetY() - static_cast(CONTAINER_TITLE_HEIGHT.ConvertToPx()); + targetOffset_.SetX(newOffsetX); + targetOffset_.SetY(newOffsetY); + } +} + +MenuLayoutAlgorithm::ErrorPositionType MenuLayoutAlgorithm::GetErrorPositionType( + const OffsetF& childOffset, const SizeF& childSize) +{ + RectF validRegion = RectF(targetOffset_, targetSize_); + RectF childRegion(childOffset, childSize); + if (validRegion.IsInnerIntersectWith(childRegion)) { + return ErrorPositionType::TOP_LEFT_ERROR; + } + return ErrorPositionType::NORMAL; +} + +OffsetF MenuLayoutAlgorithm::FitToScreen(const OffsetF& fitPosition, const SizeF& childSize) +{ + float x = fitPosition.GetX() + positionOffset_.GetX(); + float y = fitPosition.GetY() + positionOffset_.GetY(); + x = std::clamp(x, 0.0f, wrapperSize_.Width() - childSize.Width() - margin_ * 2.0f); + y = std::clamp(y, 0.0f, wrapperSize_.Height() - childSize.Height() - margin_ * 2.0f); + + return OffsetF(x, y); +} + +OffsetF MenuLayoutAlgorithm::GetChildPosition(const SizeF& childSize, const RefPtr& layoutProp) +{ + OffsetF bottomPosition = OffsetF(targetOffset_.GetX() + (targetSize_.Width() - childSize.Width()) / 2.0, + targetOffset_.GetY() + targetSize_.Height()); + OffsetF topPosition = OffsetF(targetOffset_.GetX() + (targetSize_.Width() - childSize.Width()) / 2.0, + targetOffset_.GetY() - childSize.Height()); + + OffsetF originOffset = GetPositionWithPlacement(childSize, topPosition, bottomPosition); + OffsetF childPosition = originOffset; + // Fit popup to screen range. + auto fitOffset = FitToScreen(childPosition, childSize); + ErrorPositionType errorType = GetErrorPositionType(fitOffset, childSize); + if (errorType == ErrorPositionType::NORMAL) { + return childPosition; + } + auto placement = placement_; + // If childPosition is error, adjust menu to bottom. + if (placement_ != Placement::BOTTOM) { + placement_ = Placement::BOTTOM; + childPosition = GetPositionWithPlacement(childSize, topPosition, bottomPosition); + fitOffset = FitToScreen(childPosition, childSize); + if (GetErrorPositionType(fitOffset, childSize) == ErrorPositionType::NORMAL) { + placement_ = placement; + return childPosition; + } + } + // If childPosition is error, adjust menu to top. + if (placement_ != Placement::TOP) { + placement_ = Placement::TOP; + childPosition = GetPositionWithPlacement(childSize, topPosition, bottomPosition); + fitOffset = FitToScreen(childPosition, childSize); + if (GetErrorPositionType(fitOffset, childSize) == ErrorPositionType::NORMAL) { + placement_ = placement; + return childPosition; + } + } + placement_ = placement; + return originOffset; +} } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/menu/menu_layout_algorithm.h b/frameworks/core/components_ng/pattern/menu/menu_layout_algorithm.h index 40f6ce4cda0..8e7e250f6d5 100644 --- a/frameworks/core/components_ng/pattern/menu/menu_layout_algorithm.h +++ b/frameworks/core/components_ng/pattern/menu/menu_layout_algorithm.h @@ -20,13 +20,17 @@ #include "base/geometry/ng/offset_t.h" #include "base/memory/referenced.h" +#include "core/components/common/properties/placement.h" #include "core/components_ng/layout/box_layout_algorithm.h" #include "core/components_ng/layout/layout_algorithm.h" +#include "core/components_ng/pattern/menu/menu_layout_property.h" namespace OHOS::Ace::NG { +class MenuLayoutProperty; class MenuLayoutAlgorithm : public BoxLayoutAlgorithm { DECLARE_ACE_TYPE(MenuLayoutAlgorithm, BoxLayoutAlgorithm) public: + MenuLayoutAlgorithm(int32_t id, const std::string& tag) : targetNodeId_(id), targetTag_(tag) {} MenuLayoutAlgorithm() = default; ~MenuLayoutAlgorithm() override = default; @@ -43,6 +47,11 @@ protected: OffsetF positionOffset_; private: + enum class ErrorPositionType { + NORMAL = 0, + TOP_LEFT_ERROR, + BOTTOM_RIGHT_ERROR, + }; void Initialize(LayoutWrapper* layoutWrapper); LayoutConstraintF CreateChildConstraint(LayoutWrapper* layoutWrapper); void UpdateConstraintWidth(LayoutWrapper* layoutWrapper, LayoutConstraintF& constraint); @@ -60,6 +69,16 @@ private: // get option LayoutWrapper for measure get max width std::list> GetOptionsLayoutWrappper(LayoutWrapper* layoutWrapper); + OffsetF GetPositionWithPlacement(const SizeF& childSize, const OffsetF& topPosition, const OffsetF& bottomPosition); + void InitTargetSizeAndPosition(const RefPtr& layoutProp); + OffsetF GetChildPosition(const SizeF& childSize, const RefPtr& layoutProp); + ErrorPositionType GetErrorPositionType(const OffsetF& childOffset, const SizeF& childSize); + OffsetF FitToScreen(const OffsetF& fitPosition, const SizeF& childSize); + OffsetF targetOffset_; + SizeF targetSize_; + Placement placement_ = Placement::BOTTOM; + int32_t targetNodeId_ = -1; + std::string targetTag_; SizeF wrapperSize_; // current page offset relative to window. diff --git a/frameworks/core/components_ng/pattern/menu/menu_layout_property.cpp b/frameworks/core/components_ng/pattern/menu/menu_layout_property.cpp index 209210a6a31..c4232af7a64 100644 --- a/frameworks/core/components_ng/pattern/menu/menu_layout_property.cpp +++ b/frameworks/core/components_ng/pattern/menu/menu_layout_property.cpp @@ -15,6 +15,7 @@ #include "core/components_ng/pattern/menu/menu_layout_property.h" +#include "core/components/common/properties/placement.h" #include "core/components_ng/pattern/menu/menu_pattern.h" namespace OHOS::Ace::NG { @@ -30,6 +31,7 @@ void MenuLayoutProperty::ToJsonValue(std::unique_ptr& json) const auto defaultFontColor = theme ? theme->GetMenuFontColor() : Color::BLACK; json->Put("fontColor", GetFontColor().value_or(defaultFontColor).ColorToString().c_str()); json->Put("fontWeight", V2::ConvertWrapFontWeightToStirng(GetFontWeight().value_or(FontWeight::REGULAR)).c_str()); + json->Put("placement", std::to_string((int)GetMenuPlacement().value_or(OHOS::Ace::Placement::BOTTOM)).c_str()); auto host = GetHost(); CHECK_NULL_VOID(host); auto menuPattern = host->GetPattern(); diff --git a/frameworks/core/components_ng/pattern/menu/menu_layout_property.h b/frameworks/core/components_ng/pattern/menu/menu_layout_property.h index 206fdfd494f..54c73fc31a3 100644 --- a/frameworks/core/components_ng/pattern/menu/menu_layout_property.h +++ b/frameworks/core/components_ng/pattern/menu/menu_layout_property.h @@ -52,6 +52,7 @@ public: value->propPositionOffset_ = ClonePositionOffset(); value->propMenuItemFontStyle_ = CloneMenuItemFontStyle(); value->propTitle_ = CloneTitle(); + value->propMenuPlacement_ = CloneMenuPlacement(); return value; } @@ -63,6 +64,7 @@ public: ResetPositionOffset(); ResetMenuItemFontStyle(); ResetTitle(); + ResetMenuPlacement(); } // target frameNode that this menu belongs to @@ -75,6 +77,9 @@ public: ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(Title, std::string, PROPERTY_UPDATE_LAYOUT); + // placement to menu + ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(MenuPlacement, Placement, PROPERTY_UPDATE_LAYOUT); + ACE_DEFINE_PROPERTY_GROUP(MenuItemFontStyle, MenuItemFontStyle); ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(MenuItemFontStyle, FontSize, Dimension, PROPERTY_UPDATE_MEASURE); ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(MenuItemFontStyle, FontColor, Color, PROPERTY_UPDATE_MEASURE); diff --git a/frameworks/core/components_ng/pattern/menu/menu_pattern.h b/frameworks/core/components_ng/pattern/menu/menu_pattern.h index 746e1b7c017..dd7cf553952 100644 --- a/frameworks/core/components_ng/pattern/menu/menu_pattern.h +++ b/frameworks/core/components_ng/pattern/menu/menu_pattern.h @@ -41,7 +41,9 @@ class MenuPattern : public Pattern { DECLARE_ACE_TYPE(MenuPattern, Pattern); public: - explicit MenuPattern(int32_t targetId, MenuType type) : targetId_(targetId), type_(type) {} + MenuPattern(int32_t targetId, const std::string& tag, MenuType type) + : targetId_(targetId), targetTag_(tag), type_(type) + {} ~MenuPattern() override = default; bool IsAtomicNode() const override @@ -72,7 +74,8 @@ public: RefPtr CreateLayoutAlgorithm() override { RefPtr navigationMenu = MakeRefPtr(); - return (type_ == MenuType::NAVIGATION_MENU) ? navigationMenu : MakeRefPtr(); + return (type_ == MenuType::NAVIGATION_MENU) ? navigationMenu + : MakeRefPtr(targetId_, targetTag_); } bool IsContextMenu() const @@ -169,6 +172,7 @@ private: RefPtr onTouch_; std::optional lastTouchOffset_; int32_t targetId_ = -1; + std::string targetTag_ = ""; MenuType type_ = MenuType::MENU; RefPtr parentMenuItem_; diff --git a/frameworks/core/components_ng/pattern/menu/menu_view.cpp b/frameworks/core/components_ng/pattern/menu/menu_view.cpp index cf65cdb0c9a..ff3d1beb6c6 100644 --- a/frameworks/core/components_ng/pattern/menu/menu_view.cpp +++ b/frameworks/core/components_ng/pattern/menu/menu_view.cpp @@ -19,7 +19,9 @@ #include "base/memory/ace_type.h" #include "base/memory/referenced.h" #include "base/utils/utils.h" +#include "core/components/common/properties/placement.h" #include "core/components_ng/base/frame_node.h" +#include "core/components_ng/base/view_abstract.h" #include "core/components_ng/base/view_stack_processor.h" #include "core/components_ng/pattern/linear_layout/linear_layout_pattern.h" #include "core/components_ng/pattern/menu/menu_pattern.h" @@ -45,15 +47,16 @@ namespace OHOS::Ace::NG { namespace { // create menuWrapper and menu node, update menu props -std::pair, RefPtr> CreateMenu(int32_t targetId, MenuType type = MenuType::MENU) +std::pair, RefPtr> CreateMenu( + int32_t targetId, const std::string& targetTag = "", MenuType type = MenuType::MENU) { // use wrapper to detect click events outside menu auto wrapperNode = FrameNode::CreateFrameNode(V2::MENU_WRAPPER_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr(targetId)); auto nodeId = ElementRegister::GetInstance()->MakeUniqueId(); - auto menuNode = - FrameNode::CreateFrameNode(V2::MENU_ETS_TAG, nodeId, AceType::MakeRefPtr(targetId, type)); + auto menuNode = FrameNode::CreateFrameNode( + V2::MENU_ETS_TAG, nodeId, AceType::MakeRefPtr(targetId, targetTag, type)); auto menuFrameNode = menuNode->GetPattern(); menuNode->MountToParent(wrapperNode); @@ -129,10 +132,10 @@ void OptionKeepMenu(RefPtr& option, WeakPtr& menuWeak) } // namespace // create menu with menuItems -RefPtr MenuView::Create( - std::vector&& params, int32_t targetId, MenuType type, const MenuParam& menuParam) +RefPtr MenuView::Create(std::vector&& params, int32_t targetId, const std::string& targetTag, + MenuType type, const MenuParam& menuParam) { - auto [wrapperNode, menuNode] = CreateMenu(targetId, type); + auto [wrapperNode, menuNode] = CreateMenu(targetId, targetTag, type); auto column = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr(true)); if (!menuParam.title.empty()) { @@ -158,6 +161,9 @@ RefPtr MenuView::Create( if (menuProperty) { menuProperty->UpdateTitle(menuParam.title); menuProperty->UpdatePositionOffset(menuParam.positionOffset); + if (menuParam.placement.has_value()) { + menuProperty->UpdateMenuPlacement(menuParam.placement.value_or(OHOS::Ace::Placement::BOTTOM)); + } } auto scroll = CreateMenuScroll(column); CHECK_NULL_RETURN(scroll, nullptr); @@ -168,10 +174,10 @@ RefPtr MenuView::Create( } // create menu with custom node from a builder -RefPtr MenuView::Create( - const RefPtr& customNode, int32_t targetId, MenuType type, const MenuParam& menuParam) +RefPtr MenuView::Create(const RefPtr& customNode, int32_t targetId, const std::string& targetTag, + MenuType type, const MenuParam& menuParam) { - auto [wrapperNode, menuNode] = CreateMenu(targetId, type); + auto [wrapperNode, menuNode] = CreateMenu(targetId, targetTag, type); // put custom node in a scroll to limit its height auto scroll = CreateMenuScroll(customNode); CHECK_NULL_RETURN(scroll, nullptr); @@ -184,6 +190,9 @@ RefPtr MenuView::Create( if (menuProperty) { menuProperty->UpdateTitle(menuParam.title); menuProperty->UpdatePositionOffset(menuParam.positionOffset); + if (menuParam.placement.has_value()) { + menuProperty->UpdateMenuPlacement(menuParam.placement.value()); + } } if (type == MenuType::SUB_MENU) { @@ -230,8 +239,8 @@ void MenuView::Create() LOGI("MenuView::Create"); auto* stack = ViewStackProcessor::GetInstance(); int32_t nodeId = (stack == nullptr ? 0 : stack->ClaimNodeId()); - auto menuNode = FrameNode::GetOrCreateFrameNode( - V2::MENU_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr(-1, MenuType::MULTI_MENU); }); + auto menuNode = FrameNode::GetOrCreateFrameNode(V2::MENU_ETS_TAG, nodeId, + []() { return AceType::MakeRefPtr(-1, V2::MENU_ETS_TAG, MenuType::MULTI_MENU); }); CHECK_NULL_VOID(menuNode); ViewStackProcessor::GetInstance()->Push(menuNode); } diff --git a/frameworks/core/components_ng/pattern/menu/menu_view.h b/frameworks/core/components_ng/pattern/menu/menu_view.h index 7acd13289e5..f370285ce4f 100644 --- a/frameworks/core/components_ng/pattern/menu/menu_view.h +++ b/frameworks/core/components_ng/pattern/menu/menu_view.h @@ -30,12 +30,12 @@ namespace OHOS::Ace::NG { class ACE_EXPORT MenuView { public: // create menu with menuItems - static RefPtr Create(std::vector&& params, - int32_t targetId, MenuType type = MenuType::MENU, const MenuParam& menuParam = MenuParam()); + static RefPtr Create(std::vector&& params, int32_t targetId, + const std::string& targetTag = "", MenuType type = MenuType::MENU, const MenuParam& menuParam = MenuParam()); // create menu with custom node from a builder - static RefPtr Create(const RefPtr& customNode, - int32_t targetId, MenuType type = MenuType::MENU, const MenuParam& menuParam = MenuParam()); + static RefPtr Create(const RefPtr& customNode, int32_t targetId, + const std::string& targetTag = "", MenuType type = MenuType::MENU, const MenuParam& menuParam = MenuParam()); // create select's popup menu static RefPtr Create(const std::vector& params, int32_t targetId); diff --git a/frameworks/core/components_ng/pattern/navigation/navigation_view.cpp b/frameworks/core/components_ng/pattern/navigation/navigation_view.cpp index 9537aa46f1c..1ba4b360937 100644 --- a/frameworks/core/components_ng/pattern/navigation/navigation_view.cpp +++ b/frameworks/core/components_ng/pattern/navigation/navigation_view.cpp @@ -583,7 +583,8 @@ void NavigationView::SetMenuItems(std::vector&& menuItems) BuildMoreIemNode(barItemNode); - auto barMenuNode = MenuView::Create(std::move(params), barItemNodeId, MenuType::NAVIGATION_MENU); + auto barMenuNode = + MenuView::Create(std::move(params), barItemNodeId, V2::BAR_ITEM_ETS_TAG, MenuType::NAVIGATION_MENU); BuildMoreItemNodeAction(barItemNode, barMenuNode); auto menuItemNode = FrameNode::CreateFrameNode(V2::MENU_ITEM_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr()); diff --git a/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp b/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp index 2ada6ee38c7..f0f9f6fb137 100644 --- a/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp +++ b/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp @@ -213,6 +213,9 @@ void OverlayManager::ShowMenuAnimation(const RefPtr& menu, bool isInS CHECK_NULL_VOID_NOLOG(menu && overlayManager); ContainerScope scope(id); overlayManager->FocusOverlayNode(menu, isInSubWindow); + if (overlayManager->GetOnShowMenuCallback()) { + overlayManager->GetOnShowMenuCallback()(); + } }); auto context = menu->GetRenderContext(); @@ -243,10 +246,16 @@ void OverlayManager::PopMenuAnimation(const RefPtr& menu) option.SetCurve(Curves::FAST_OUT_SLOW_IN); option.SetDuration(MENU_ANIMATION_DURATION); option.SetFillMode(FillMode::FORWARDS); - option.SetOnFinishEvent([rootWeak = rootNodeWeak_, menuWK = WeakClaim(RawPtr(menu)), id = Container::CurrentId()] { + option.SetOnFinishEvent([rootWeak = rootNodeWeak_, menuWK = WeakClaim(RawPtr(menu)), id = Container::CurrentId(), + weak = WeakClaim(this)] { auto menu = menuWK.Upgrade(); auto root = rootWeak.Upgrade(); - CHECK_NULL_VOID_NOLOG(menu && root); + auto overlayManager = weak.Upgrade(); + CHECK_NULL_VOID_NOLOG(menu && root && overlayManager); + if (overlayManager->GetOnHideMenuCallback()) { + overlayManager->GetOnHideMenuCallback()(); + } + ContainerScope scope(id); auto menuWrapperPattern = menu->GetPattern(); // clear contextMenu then return diff --git a/frameworks/core/components_ng/pattern/overlay/overlay_manager.h b/frameworks/core/components_ng/pattern/overlay/overlay_manager.h index 24e9403b474..8d7cf2e26bc 100644 --- a/frameworks/core/components_ng/pattern/overlay/overlay_manager.h +++ b/frameworks/core/components_ng/pattern/overlay/overlay_manager.h @@ -22,6 +22,7 @@ #include "base/memory/ace_type.h" #include "base/memory/referenced.h" #include "base/utils/noncopyable.h" +#include "core/components/common/properties/placement.h" #include "core/components/dialog/dialog_properties.h" #include "core/components/picker/picker_data.h" #include "core/components_ng/base/ui_node.h" @@ -113,6 +114,21 @@ public: onHideMenuCallback_ = callback; } + void RegisterOnShowMenu(std::function callback) + { + onShowMenuCallback_ = callback; + } + + std::function GetOnShowMenuCallback() + { + return onShowMenuCallback_; + } + + std::function GetOnHideMenuCallback() + { + return onHideMenuCallback_; + } + void SetBackPressEvent(std::function event) { backPressEvent_ = event; @@ -193,6 +209,7 @@ private: #endif // ENABLE_DRAG_FRAMEWORK std::function onHideMenuCallback_ = nullptr; + std::function onShowMenuCallback_ = nullptr; CancelableCallback continuousTask_; std::function backPressEvent_ = nullptr; diff --git a/frameworks/core/components_ng/test/base/view_abstract_model/view_abstract_model_test_ng.cpp b/frameworks/core/components_ng/test/base/view_abstract_model/view_abstract_model_test_ng.cpp index df7b091c60c..f0c5ac35e0f 100755 --- a/frameworks/core/components_ng/test/base/view_abstract_model/view_abstract_model_test_ng.cpp +++ b/frameworks/core/components_ng/test/base/view_abstract_model/view_abstract_model_test_ng.cpp @@ -63,7 +63,8 @@ HWTEST_F(ViewAbstractModelTestNg, ViewAbstractModelNgTest001, TestSize.Level1) }; ViewAbstractModelNG viewAbstractModelNG; - viewAbstractModelNG.BindContextMenu(ResponseType::RIGHT_CLICK, CreateBuildFunc); + MenuParam menuParam; + viewAbstractModelNG.BindContextMenu(ResponseType::RIGHT_CLICK, CreateBuildFunc, menuParam); auto targetNode = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode(); /** * @tc.expected: step1. expect targetNode is null @@ -147,4 +148,4 @@ HWTEST_F(ViewAbstractModelTestNg, ViewAbstractModelNgTest004, TestSize.Level1) */ EXPECT_EQ(targetNode, nullptr); } -} // namespace OHOS::Ace::NG \ No newline at end of file +} // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/test/pattern/menu/menu_accessibility_property_test_ng.cpp b/frameworks/core/components_ng/test/pattern/menu/menu_accessibility_property_test_ng.cpp index 1e680b64ee3..e5cf94cbbd0 100644 --- a/frameworks/core/components_ng/test/pattern/menu/menu_accessibility_property_test_ng.cpp +++ b/frameworks/core/components_ng/test/pattern/menu/menu_accessibility_property_test_ng.cpp @@ -55,7 +55,7 @@ void MenuAccessibilityPropertyTestNg::TearDown() void MenuAccessibilityPropertyTestNg::InitMenuTestNg() { frameNode_ = FrameNode::GetOrCreateFrameNode(V2::MENU_TAG, ViewStackProcessor::GetInstance()->ClaimNodeId(), - []() { return AceType::MakeRefPtr(TARGET_ID, TYPE); }); + []() { return AceType::MakeRefPtr(TARGET_ID, "", TYPE); }); ASSERT_NE(frameNode_, nullptr); menuAccessibilityProperty_ = frameNode_->GetAccessibilityProperty(); diff --git a/frameworks/core/components_ng/test/pattern/menu/menu_layout_algorithm_test_ng.cpp b/frameworks/core/components_ng/test/pattern/menu/menu_layout_algorithm_test_ng.cpp index f9d3c2c9ced..c4bd9ac0c99 100644 --- a/frameworks/core/components_ng/test/pattern/menu/menu_layout_algorithm_test_ng.cpp +++ b/frameworks/core/components_ng/test/pattern/menu/menu_layout_algorithm_test_ng.cpp @@ -259,7 +259,7 @@ HWTEST_F(MenuLayoutAlgorithmTestNg, MenuLayoutAlgorithmTestNg011, TestSize.Level auto themeManager = AceType::MakeRefPtr(); MockPipelineBase::GetCurrent()->SetThemeManager(themeManager); EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(AceType::MakeRefPtr())); - auto menuWrapperNode = MenuView::Create(std::move(optionParams), 1, MenuType::MENU, menuParam); + auto menuWrapperNode = MenuView::Create(std::move(optionParams), 1, "", MenuType::MENU, menuParam); ASSERT_NE(menuWrapperNode, nullptr); ASSERT_EQ(menuWrapperNode->GetChildren().size(), 1); auto menuNode = AceType::DynamicCast(menuWrapperNode->GetChildAtIndex(0)); @@ -303,7 +303,7 @@ HWTEST_F(MenuLayoutAlgorithmTestNg, MenuLayoutAlgorithmTestNg012, TestSize.Level auto themeManager = AceType::MakeRefPtr(); MockPipelineBase::GetCurrent()->SetThemeManager(themeManager); EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(AceType::MakeRefPtr())); - auto menuWrapperNode = MenuView::Create(std::move(optionParams), 1, MenuType::MENU, menuParam); + auto menuWrapperNode = MenuView::Create(std::move(optionParams), 1, "", MenuType::MENU, menuParam); ASSERT_NE(menuWrapperNode, nullptr); ASSERT_EQ(menuWrapperNode->GetChildren().size(), 1); auto menuNode = AceType::DynamicCast(menuWrapperNode->GetChildAtIndex(0)); diff --git a/frameworks/core/components_ng/test/pattern/menu/menu_layout_property_test_ng.cpp b/frameworks/core/components_ng/test/pattern/menu/menu_layout_property_test_ng.cpp index 3ef13c03ce2..d7546684fa0 100644 --- a/frameworks/core/components_ng/test/pattern/menu/menu_layout_property_test_ng.cpp +++ b/frameworks/core/components_ng/test/pattern/menu/menu_layout_property_test_ng.cpp @@ -229,7 +229,7 @@ HWTEST_F(MenuLayoutPropertyTestNg, MenuLayoutPropertyTestNg010, TestSize.Level1) auto themeManager = AceType::MakeRefPtr(); MockPipelineBase::GetCurrent()->SetThemeManager(themeManager); EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(AceType::MakeRefPtr())); - auto menuWrapperNode = MenuView::Create(std::move(optionParams), TARGET_ID, TYPE, menuParam); + auto menuWrapperNode = MenuView::Create(std::move(optionParams), TARGET_ID, "", TYPE, menuParam); ASSERT_NE(menuWrapperNode, nullptr); ASSERT_EQ(menuWrapperNode->GetChildren().size(), 1); auto menuNode = AceType::DynamicCast(menuWrapperNode->GetChildAtIndex(0)); diff --git a/frameworks/core/components_ng/test/pattern/menu/menu_pattern_test_ng.cpp b/frameworks/core/components_ng/test/pattern/menu/menu_pattern_test_ng.cpp index b0f244afcb3..6f3af375846 100644 --- a/frameworks/core/components_ng/test/pattern/menu/menu_pattern_test_ng.cpp +++ b/frameworks/core/components_ng/test/pattern/menu/menu_pattern_test_ng.cpp @@ -68,7 +68,7 @@ void MenuPatternTestNg::TearDown() {} */ HWTEST_F(MenuPatternTestNg, MenuPatternTestNg001, TestSize.Level1) { - RefPtr menuPattern = AceType::MakeRefPtr(TARGET_ID, TYPE); + RefPtr menuPattern = AceType::MakeRefPtr(TARGET_ID, "", TYPE); std::string type = "1"; TouchEventInfo info(type); menuPattern->RegisterOnTouch(); @@ -82,7 +82,7 @@ HWTEST_F(MenuPatternTestNg, MenuPatternTestNg001, TestSize.Level1) */ HWTEST_F(MenuPatternTestNg, MenuPatternTestNg002, TestSize.Level1) { - RefPtr menuPattern = AceType::MakeRefPtr(TARGET_ID, TYPE); + RefPtr menuPattern = AceType::MakeRefPtr(TARGET_ID, "", TYPE); std::string type = "1"; TouchType touchType = TouchType::UP; TouchEventInfo info(type); @@ -103,7 +103,7 @@ HWTEST_F(MenuPatternTestNg, MenuPatternTestNg002, TestSize.Level1) */ HWTEST_F(MenuPatternTestNg, MenuPatternTestNg003, TestSize.Level1) { - RefPtr menuPattern = AceType::MakeRefPtr(TARGET_ID, TYPE); + RefPtr menuPattern = AceType::MakeRefPtr(TARGET_ID, "", TYPE); std::string type = "1"; TouchType touchType = TouchType::UP; TouchEventInfo info(type); @@ -125,7 +125,7 @@ HWTEST_F(MenuPatternTestNg, MenuPatternTestNg003, TestSize.Level1) */ HWTEST_F(MenuPatternTestNg, MenuPatternTestNg004, TestSize.Level1) { - RefPtr menuPattern = AceType::MakeRefPtr(TARGET_ID, TYPE); + RefPtr menuPattern = AceType::MakeRefPtr(TARGET_ID, "", TYPE); std::string type = "1"; TouchEventInfo info(type); TouchLocationInfo locationInfo(TARGET_ID); @@ -144,7 +144,7 @@ HWTEST_F(MenuPatternTestNg, MenuPatternTestNg004, TestSize.Level1) */ HWTEST_F(MenuPatternTestNg, MenuPatternTestNg005, TestSize.Level1) { - RefPtr menuPattern = AceType::MakeRefPtr(TARGET_ID, TYPE); + RefPtr menuPattern = AceType::MakeRefPtr(TARGET_ID, "", TYPE); std::string type = "1"; TouchEventInfo info(type); TouchType touchType = TouchType::UP; diff --git a/frameworks/core/components_ng/test/pattern/menu/menu_view_test_ng.cpp b/frameworks/core/components_ng/test/pattern/menu/menu_view_test_ng.cpp index fb1b62956da..9fc6fadbb47 100644 --- a/frameworks/core/components_ng/test/pattern/menu/menu_view_test_ng.cpp +++ b/frameworks/core/components_ng/test/pattern/menu/menu_view_test_ng.cpp @@ -67,7 +67,7 @@ HWTEST_F(MenuViewTestNg, MenuViewTestNgCreate001, TestSize.Level1) auto themeManager = AceType::MakeRefPtr(); MockPipelineBase::GetCurrent()->SetThemeManager(themeManager); EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(AceType::MakeRefPtr())); - auto menuWrapperNode = MenuView::Create(std::move(optionParams), TARGET_ID, TYPE, menuParam); + auto menuWrapperNode = MenuView::Create(std::move(optionParams), TARGET_ID, "", TYPE, menuParam); ASSERT_NE(menuWrapperNode, nullptr); ASSERT_EQ(menuWrapperNode->GetChildren().size(), 1); auto menuNode = AceType::DynamicCast(menuWrapperNode->GetChildAtIndex(0)); @@ -107,7 +107,7 @@ HWTEST_F(MenuViewTestNg, MenuViewTestNgCreate002, TestSize.Level1) auto themeManager = AceType::MakeRefPtr(); MockPipelineBase::GetCurrent()->SetThemeManager(themeManager); EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(AceType::MakeRefPtr())); - auto menuWrapperNode = MenuView::Create(std::move(optionParams), TARGET_ID, TYPE, menuParam); + auto menuWrapperNode = MenuView::Create(std::move(optionParams), TARGET_ID, "", TYPE, menuParam); ASSERT_NE(menuWrapperNode, nullptr); ASSERT_EQ(menuWrapperNode->GetChildren().size(), 1); auto menuNode = AceType::DynamicCast(menuWrapperNode->GetChildAtIndex(0)); @@ -143,7 +143,7 @@ HWTEST_F(MenuViewTestNg, MenuViewTestNgCreate003, TestSize.Level1) auto themeManager = AceType::MakeRefPtr(); MockPipelineBase::GetCurrent()->SetThemeManager(themeManager); EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(AceType::MakeRefPtr())); - auto menuWrapperNode = MenuView::Create(textNode, TARGET_ID, TYPE, menuParam); + auto menuWrapperNode = MenuView::Create(textNode, TARGET_ID, "", TYPE, menuParam); ASSERT_NE(menuWrapperNode, nullptr); ASSERT_EQ(menuWrapperNode->GetChildren().size(), 1); auto menuNode = AceType::DynamicCast(menuWrapperNode->GetChildAtIndex(0)); @@ -167,7 +167,7 @@ HWTEST_F(MenuViewTestNg, MenuViewTestNgSetFontSize001, TestSize.Level1) auto themeManager = AceType::MakeRefPtr(); MockPipelineBase::GetCurrent()->SetThemeManager(themeManager); EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(AceType::MakeRefPtr())); - auto menuWrapperNode = MenuView::Create(std::move(optionParams), TARGET_ID, TYPE, menuParam); + auto menuWrapperNode = MenuView::Create(std::move(optionParams), TARGET_ID, "", TYPE, menuParam); ASSERT_NE(menuWrapperNode, nullptr); ASSERT_EQ(menuWrapperNode->GetChildren().size(), 1); auto menuNode = AceType::DynamicCast(menuWrapperNode->GetChildAtIndex(0)); @@ -194,7 +194,7 @@ HWTEST_F(MenuViewTestNg, MenuViewTestNgSetFontSize002, TestSize.Level1) auto themeManager = AceType::MakeRefPtr(); MockPipelineBase::GetCurrent()->SetThemeManager(themeManager); EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(AceType::MakeRefPtr())); - auto menuWrapperNode = MenuView::Create(std::move(optionParams), TARGET_ID, TYPE, menuParam); + auto menuWrapperNode = MenuView::Create(std::move(optionParams), TARGET_ID, "", TYPE, menuParam); ASSERT_NE(menuWrapperNode, nullptr); ASSERT_EQ(menuWrapperNode->GetChildren().size(), 1); auto menuNode = AceType::DynamicCast(menuWrapperNode->GetChildAtIndex(0)); @@ -220,7 +220,7 @@ HWTEST_F(MenuViewTestNg, MenuViewTestNgSetFontSize003, TestSize.Level1) auto themeManager = AceType::MakeRefPtr(); MockPipelineBase::GetCurrent()->SetThemeManager(themeManager); EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(AceType::MakeRefPtr())); - auto menuWrapperNode = MenuView::Create(std::move(optionParams), TARGET_ID, TYPE, menuParam); + auto menuWrapperNode = MenuView::Create(std::move(optionParams), TARGET_ID, "", TYPE, menuParam); ASSERT_NE(menuWrapperNode, nullptr); ASSERT_EQ(menuWrapperNode->GetChildren().size(), 1); auto menuNode = AceType::DynamicCast(menuWrapperNode->GetChildAtIndex(0)); @@ -244,7 +244,7 @@ HWTEST_F(MenuViewTestNg, MenuViewTestNgSetFontColor001, TestSize.Level1) auto themeManager = AceType::MakeRefPtr(); MockPipelineBase::GetCurrent()->SetThemeManager(themeManager); EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(AceType::MakeRefPtr())); - auto menuWrapperNode = MenuView::Create(std::move(optionParams), TARGET_ID, TYPE, menuParam); + auto menuWrapperNode = MenuView::Create(std::move(optionParams), TARGET_ID, "", TYPE, menuParam); ASSERT_NE(menuWrapperNode, nullptr); ASSERT_EQ(menuWrapperNode->GetChildren().size(), 1); auto menuNode = AceType::DynamicCast(menuWrapperNode->GetChildAtIndex(0)); @@ -271,7 +271,7 @@ HWTEST_F(MenuViewTestNg, MenuViewTestNgSetFontColor002, TestSize.Level1) auto themeManager = AceType::MakeRefPtr(); MockPipelineBase::GetCurrent()->SetThemeManager(themeManager); EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(AceType::MakeRefPtr())); - auto menuWrapperNode = MenuView::Create(std::move(optionParams), TARGET_ID, TYPE, menuParam); + auto menuWrapperNode = MenuView::Create(std::move(optionParams), TARGET_ID, "", TYPE, menuParam); ASSERT_NE(menuWrapperNode, nullptr); ASSERT_EQ(menuWrapperNode->GetChildren().size(), 1); auto menuNode = AceType::DynamicCast(menuWrapperNode->GetChildAtIndex(0)); @@ -295,7 +295,7 @@ HWTEST_F(MenuViewTestNg, MenuViewTestNgSetFontColor003, TestSize.Level1) auto themeManager = AceType::MakeRefPtr(); MockPipelineBase::GetCurrent()->SetThemeManager(themeManager); EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(AceType::MakeRefPtr())); - auto menuWrapperNode = MenuView::Create(std::move(optionParams), TARGET_ID, TYPE, menuParam); + auto menuWrapperNode = MenuView::Create(std::move(optionParams), TARGET_ID, "", TYPE, menuParam); ASSERT_NE(menuWrapperNode, nullptr); ASSERT_EQ(menuWrapperNode->GetChildren().size(), 1); auto menuNode = AceType::DynamicCast(menuWrapperNode->GetChildAtIndex(0)); @@ -324,7 +324,7 @@ HWTEST_F(MenuViewTestNg, MenuViewTestNgSetFontWeight001, TestSize.Level1) auto themeManager = AceType::MakeRefPtr(); MockPipelineBase::GetCurrent()->SetThemeManager(themeManager); EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(AceType::MakeRefPtr())); - auto menuWrapperNode = MenuView::Create(std::move(optionParams), TARGET_ID, TYPE, menuParam); + auto menuWrapperNode = MenuView::Create(std::move(optionParams), TARGET_ID, "", TYPE, menuParam); ASSERT_NE(menuWrapperNode, nullptr); ASSERT_EQ(menuWrapperNode->GetChildren().size(), 1); auto menuNode = AceType::DynamicCast(menuWrapperNode->GetChildAtIndex(0)); @@ -351,7 +351,7 @@ HWTEST_F(MenuViewTestNg, MenuViewTestNgSetFontWeight002, TestSize.Level1) auto themeManager = AceType::MakeRefPtr(); MockPipelineBase::GetCurrent()->SetThemeManager(themeManager); EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(AceType::MakeRefPtr())); - auto menuWrapperNode = MenuView::Create(std::move(optionParams), TARGET_ID, TYPE, menuParam); + auto menuWrapperNode = MenuView::Create(std::move(optionParams), TARGET_ID, "", TYPE, menuParam); ASSERT_NE(menuWrapperNode, nullptr); ASSERT_EQ(menuWrapperNode->GetChildren().size(), 1); auto menuNode = AceType::DynamicCast(menuWrapperNode->GetChildAtIndex(0)); -- Gitee From f3738d473225a1e679560ed29541e7316e23f7f5 Mon Sep 17 00:00:00 2001 From: limeng Date: Thu, 13 Apr 2023 07:25:55 +0000 Subject: [PATCH 2/9] update frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp. Signed-off-by: limeng --- .../core/components_ng/pattern/overlay/overlay_manager.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp b/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp index f0f9f6fb137..b47dedf19a9 100644 --- a/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp +++ b/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp @@ -662,9 +662,6 @@ void OverlayManager::HideMenu(int32_t targetId) return; } PopMenuAnimation(menuMap_[targetId]); - if (onHideMenuCallback_) { - onHideMenuCallback_(); - } BlurOverlayNode(); } -- Gitee From d12b5412c3acb21999af261cf14ce991e7e36d2d Mon Sep 17 00:00:00 2001 From: limeng Date: Sun, 16 Apr 2023 15:48:51 +0800 Subject: [PATCH 3/9] update for review comments Signed-off-by: limeng --- frameworks/base/subwindow/subwindow_manager.h | 4 +- .../base/view_abstract_model_ng.cpp | 9 +- .../pattern/menu/menu_layout_algorithm.cpp | 235 +++++++++++++----- .../pattern/menu/menu_layout_algorithm.h | 21 +- 4 files changed, 197 insertions(+), 72 deletions(-) diff --git a/frameworks/base/subwindow/subwindow_manager.h b/frameworks/base/subwindow/subwindow_manager.h index 794348a9ab0..d0a8dfb3000 100644 --- a/frameworks/base/subwindow/subwindow_manager.h +++ b/frameworks/base/subwindow/subwindow_manager.h @@ -122,8 +122,8 @@ private: SubwindowMap dialogSubwindowMap_; std::mutex currentDialogSubwindowMutex_; RefPtr currentDialogSubwindow_; - std::function onShowMenuCallback_ = nullptr; - std::function onHideMenuCallback_ = nullptr; + std::function onShowMenuCallback_; + std::function onHideMenuCallback_; }; } // namespace OHOS::Ace diff --git a/frameworks/core/components_ng/base/view_abstract_model_ng.cpp b/frameworks/core/components_ng/base/view_abstract_model_ng.cpp index d1f02e75b4d..3503d1949b3 100644 --- a/frameworks/core/components_ng/base/view_abstract_model_ng.cpp +++ b/frameworks/core/components_ng/base/view_abstract_model_ng.cpp @@ -38,7 +38,7 @@ void ViewAbstractModelNG::BindMenu( #endif // ENABLE_DRAG_FRAMEWORK auto overlayManager = NG::PipelineContext::GetCurrentContext()->GetOverlayManager(); CHECK_NULL_VOID(overlayManager); - RegisterMenuAppearCallback(std::move(params), std::move(buildFunc), menuParam); + RegisterMenuAppearCallback(params, std::move(buildFunc), menuParam); GestureEventFunc showMenu; auto weakTarget = AceType::WeakClaim(AceType::RawPtr(targetNode)); @@ -71,7 +71,7 @@ void ViewAbstractModelNG::BindMenu( auto gestureHub = targetNode->GetOrCreateGestureEventHub(); gestureHub->BindMenu(std::move(showMenu)); - RegisterMenuDisappearCallback(std::move(params), std::move(buildFunc), menuParam); + RegisterMenuDisappearCallback(std::move(buildFunc), menuParam); // delete menu when target node is removed from render tree auto eventHub = targetNode->GetEventHub(); @@ -181,7 +181,7 @@ void ViewAbstractModelNG::BindContentCover( } void ViewAbstractModelNG::RegisterMenuAppearCallback( - std::vector&& params, std::function&& buildFunc, const MenuParam& menuParam) + std::vector& params, std::function&& buildFunc, const MenuParam& menuParam) { auto overlayManager = NG::PipelineContext::GetCurrentContext()->GetOverlayManager(); CHECK_NULL_VOID(overlayManager); @@ -194,8 +194,7 @@ void ViewAbstractModelNG::RegisterMenuAppearCallback( } } -void ViewAbstractModelNG::RegisterMenuDisappearCallback( - std::vector&& params, std::function&& buildFunc, const MenuParam& menuParam) +void ViewAbstractModelNG::RegisterMenuDisappearCallback(std::function&& buildFunc, const MenuParam& menuParam) { auto overlayManager = NG::PipelineContext::GetCurrentContext()->GetOverlayManager(); if (overlayManager) { diff --git a/frameworks/core/components_ng/pattern/menu/menu_layout_algorithm.cpp b/frameworks/core/components_ng/pattern/menu/menu_layout_algorithm.cpp index afa7b2e19d3..5a256cca37b 100644 --- a/frameworks/core/components_ng/pattern/menu/menu_layout_algorithm.cpp +++ b/frameworks/core/components_ng/pattern/menu/menu_layout_algorithm.cpp @@ -66,6 +66,27 @@ uint32_t GetMaxGridCounts(const RefPtr& columnInfo) } } // namespace +MenuLayoutAlgorithm::MenuLayoutAlgorithm(int32_t id, const std::string& tag) : targetNodeId_(id), targetTag_(tag) +{ + placementFuncMap_[Placement::TOP] = &MenuLayoutAlgorithm::GetPositionWithPlacementTop; + placementFuncMap_[Placement::TOP_LEFT] = &MenuLayoutAlgorithm::GetPositionWithPlacementTopLeft; + placementFuncMap_[Placement::TOP_RIGHT] = &MenuLayoutAlgorithm::GetPositionWithPlacementTopRight; + placementFuncMap_[Placement::BOTTOM] = &MenuLayoutAlgorithm::GetPositionWithPlacementBottom; + placementFuncMap_[Placement::BOTTOM_LEFT] = &MenuLayoutAlgorithm::GetPositionWithPlacementBottomLeft; + placementFuncMap_[Placement::BOTTOM_RIGHT] = &MenuLayoutAlgorithm::GetPositionWithPlacementBottomRight; + placementFuncMap_[Placement::LEFT] = &MenuLayoutAlgorithm::GetPositionWithPlacementLeft; + placementFuncMap_[Placement::LEFT_TOP] = &MenuLayoutAlgorithm::GetPositionWithPlacementLeftTop; + placementFuncMap_[Placement::LEFT_BOTTOM] = &MenuLayoutAlgorithm::GetPositionWithPlacementLeftBottom; + placementFuncMap_[Placement::RIGHT] = &MenuLayoutAlgorithm::GetPositionWithPlacementRight; + placementFuncMap_[Placement::RIGHT_TOP] = &MenuLayoutAlgorithm::GetPositionWithPlacementRightTop; + placementFuncMap_[Placement::RIGHT_BOTTOM] = &MenuLayoutAlgorithm::GetPositionWithPlacementRightBottom; +} + +MenuLayoutAlgorithm::~MenuLayoutAlgorithm() +{ + placementFuncMap_.clear(); +} + void MenuLayoutAlgorithm::Initialize(LayoutWrapper* layoutWrapper) { CHECK_NULL_VOID(layoutWrapper); @@ -165,8 +186,8 @@ void MenuLayoutAlgorithm::Layout(LayoutWrapper* layoutWrapper) } auto size = layoutWrapper->GetGeometryNode()->GetMarginFrameSize(); - float x = 0.0; - float y = 0.0; + float x = 0.0f; + float y = 0.0f; if (menuProp->GetMenuPlacement().has_value() && (targetSize_.Width() > 0.0 || targetSize_.Height() > 0.0)) { auto childOffset = GetChildPosition(size, menuProp); x = childOffset.GetX() + positionOffset_.GetX(); @@ -431,67 +452,19 @@ OffsetF MenuLayoutAlgorithm::GetPositionWithPlacement( const SizeF& childSize, const OffsetF& topPosition, const OffsetF& bottomPosition) { OffsetF childPosition; - float marginRight = 0.0f; - float marginBottom = 0.0f; - float marginTop = 0.0f; - float marginLeft = 0.0f; - double targetSpace = 0.0; - switch (placement_) { - case Placement::TOP: - childPosition = topPosition; - break; - case Placement::TOP_LEFT: - childPosition = OffsetF(targetOffset_.GetX() - marginRight, - targetOffset_.GetY() - childSize.Height() - marginBottom - targetSpace); - break; - case Placement::TOP_RIGHT: - childPosition = OffsetF(targetOffset_.GetX() + targetSize_.Width() - childSize.Width() + marginLeft, - targetOffset_.GetY() - childSize.Height() - targetSpace - marginBottom); - break; - case Placement::BOTTOM: - childPosition = bottomPosition; - break; - case Placement::BOTTOM_LEFT: - childPosition = OffsetF(targetOffset_.GetX() - marginRight, - targetOffset_.GetY() + targetSize_.Height() + targetSpace + marginTop); - break; - case Placement::BOTTOM_RIGHT: - childPosition = OffsetF(targetOffset_.GetX() + targetSize_.Width() - childSize.Width() + marginLeft, - targetOffset_.GetY() + targetSize_.Height() + targetSpace + marginTop); - break; - case Placement::LEFT: - childPosition = - OffsetF(targetOffset_.GetX() - targetSpace - childSize.Width() - marginRight, - targetOffset_.GetY() + targetSize_.Height() / 2.0 - childSize.Height() / 2.0); - break; - case Placement::LEFT_TOP: - childPosition = - OffsetF(targetOffset_.GetX() - targetSpace - childSize.Width() - marginRight, - targetOffset_.GetY() - marginBottom); - break; - case Placement::LEFT_BOTTOM: - childPosition = - OffsetF(targetOffset_.GetX() - targetSpace - childSize.Width() - marginRight, - targetOffset_.GetY() + targetSize_.Height() - childSize.Height() - marginTop); - break; - case Placement::RIGHT: - childPosition = - OffsetF(targetOffset_.GetX() + targetSize_.Width() + targetSpace + marginLeft, - targetOffset_.GetY() + targetSize_.Height() / 2.0 - childSize.Height() / 2.0); - break; - case Placement::RIGHT_TOP: - childPosition = - OffsetF(targetOffset_.GetX() + targetSize_.Width() + targetSpace + marginLeft, - targetOffset_.GetY() - marginBottom); - break; - case Placement::RIGHT_BOTTOM: - childPosition = - OffsetF(targetOffset_.GetX() + targetSize_.Width() + targetSpace + marginLeft, - targetOffset_.GetY() + targetSize_.Height() - childSize.Height() - marginTop); - break; - default: - break; + + auto func = placementFuncMap_.find(placement_); + if (func != placementFuncMap_.end()) { + auto placementFunc = func->second; + if (placementFunc != nullptr) { + childPosition = (this->*placementFunc)(childSize, topPosition, bottomPosition); + } else { + LOGE("Invalid Placement of menu layout."); + } + } else { + LOGE("Invalid Placement of menu layout."); } + return childPosition; } @@ -576,4 +549,140 @@ OffsetF MenuLayoutAlgorithm::GetChildPosition(const SizeF& childSize, const RefP placement_ = placement; return originOffset; } -} // namespace OHOS::Ace::NG + +OffsetF MenuLayoutAlgorithm::GetPositionWithPlacementTop( + const SizeF& childSize, const OffsetF& topPosition, const OffsetF& bottomPosition) +{ + return topPosition; +} + +OffsetF MenuLayoutAlgorithm::GetPositionWithPlacementTopLeft( + const SizeF& childSize, const OffsetF& topPosition, const OffsetF& bottomPosition) +{ + OffsetF childPosition; + float marginRight = 0.0f; + float marginBottom = 0.0f; + double targetSpace = 0.0; + childPosition = OffsetF(targetOffset_.GetX() - marginRight, + targetOffset_.GetY() - childSize.Height() - marginBottom - targetSpace); + return childPosition; +} + +OffsetF MenuLayoutAlgorithm::GetPositionWithPlacementTopRight( + const SizeF& childSize, const OffsetF& topPosition, const OffsetF& bottomPosition) +{ + OffsetF childPosition; + float marginBottom = 0.0f; + float marginLeft = 0.0f; + double targetSpace = 0.0; + childPosition = OffsetF(targetOffset_.GetX() + targetSize_.Width() - childSize.Width() + marginLeft, + targetOffset_.GetY() - childSize.Height() - targetSpace - marginBottom); + return childPosition; +} + +OffsetF MenuLayoutAlgorithm::GetPositionWithPlacementBottom( + const SizeF& childSize, const OffsetF& topPosition, const OffsetF& bottomPosition) +{ + return bottomPosition; +} + +OffsetF MenuLayoutAlgorithm::GetPositionWithPlacementBottomLeft( + const SizeF& childSize, const OffsetF& topPosition, const OffsetF& bottomPosition) +{ + OffsetF childPosition; + float marginRight = 0.0f; + float marginTop = 0.0f; + double targetSpace = 0.0; + childPosition = OffsetF(targetOffset_.GetX() - marginRight, + targetOffset_.GetY() + targetSize_.Height() + targetSpace + marginTop); + return childPosition; +} + +OffsetF MenuLayoutAlgorithm::GetPositionWithPlacementBottomRight( + const SizeF& childSize, const OffsetF& topPosition, const OffsetF& bottomPosition) +{ + OffsetF childPosition; + float marginTop = 0.0f; + float marginLeft = 0.0f; + double targetSpace = 0.0; + childPosition = OffsetF(targetOffset_.GetX() + targetSize_.Width() - childSize.Width() + marginLeft, + targetOffset_.GetY() + targetSize_.Height() + targetSpace + marginTop); + return childPosition; +} + +OffsetF MenuLayoutAlgorithm::GetPositionWithPlacementLeft( + const SizeF& childSize, const OffsetF& topPosition, const OffsetF& bottomPosition) +{ + OffsetF childPosition; + float marginRight = 0.0f; + double targetSpace = 0.0; + childPosition = + OffsetF(targetOffset_.GetX() - targetSpace - childSize.Width() - marginRight, + targetOffset_.GetY() + targetSize_.Height() / 2.0 - childSize.Height() / 2.0); + return childPosition; +} + +OffsetF MenuLayoutAlgorithm::GetPositionWithPlacementLeftTop( + const SizeF& childSize, const OffsetF& topPosition, const OffsetF& bottomPosition) +{ + OffsetF childPosition; + float marginRight = 0.0f; + float marginBottom = 0.0f; + double targetSpace = 0.0; + childPosition = + OffsetF(targetOffset_.GetX() - targetSpace - childSize.Width() - marginRight, + targetOffset_.GetY() - marginBottom); + return childPosition; +} + +OffsetF MenuLayoutAlgorithm::GetPositionWithPlacementLeftBottom( + const SizeF& childSize, const OffsetF& topPosition, const OffsetF& bottomPosition) +{ + OffsetF childPosition; + float marginRight = 0.0f; + float marginTop = 0.0f; + double targetSpace = 0.0; + childPosition = + OffsetF(targetOffset_.GetX() - targetSpace - childSize.Width() - marginRight, + targetOffset_.GetY() + targetSize_.Height() - childSize.Height() - marginTop); + return childPosition; +} + +OffsetF MenuLayoutAlgorithm::GetPositionWithPlacementRight( + const SizeF& childSize, const OffsetF& topPosition, const OffsetF& bottomPosition) +{ + OffsetF childPosition; + float marginLeft = 0.0f; + double targetSpace = 0.0; + childPosition = + OffsetF(targetOffset_.GetX() + targetSize_.Width() + targetSpace + marginLeft, + targetOffset_.GetY() + targetSize_.Height() / 2.0 - childSize.Height() / 2.0); + return childPosition; +} + +OffsetF MenuLayoutAlgorithm::GetPositionWithPlacementRightTop( + const SizeF& childSize, const OffsetF& topPosition, const OffsetF& bottomPosition) +{ + OffsetF childPosition; + float marginBottom = 0.0f; + float marginLeft = 0.0f; + double targetSpace = 0.0; + childPosition = + OffsetF(targetOffset_.GetX() + targetSize_.Width() + targetSpace + marginLeft, + targetOffset_.GetY() - marginBottom); + return childPosition; +} + +OffsetF MenuLayoutAlgorithm::GetPositionWithPlacementRightBottom( + const SizeF& childSize, const OffsetF& topPosition, const OffsetF& bottomPosition) +{ + OffsetF childPosition; + float marginTop = 0.0f; + float marginLeft = 0.0f; + double targetSpace = 0.0; + childPosition = + OffsetF(targetOffset_.GetX() + targetSize_.Width() + targetSpace + marginLeft, + targetOffset_.GetY() + targetSize_.Height() - childSize.Height() - marginTop); + return childPosition; +} +} // namespace OHOS::Ace::NG \ No newline at end of file diff --git a/frameworks/core/components_ng/pattern/menu/menu_layout_algorithm.h b/frameworks/core/components_ng/pattern/menu/menu_layout_algorithm.h index 8e7e250f6d5..4bcb94f59b6 100644 --- a/frameworks/core/components_ng/pattern/menu/menu_layout_algorithm.h +++ b/frameworks/core/components_ng/pattern/menu/menu_layout_algorithm.h @@ -30,9 +30,9 @@ class MenuLayoutProperty; class MenuLayoutAlgorithm : public BoxLayoutAlgorithm { DECLARE_ACE_TYPE(MenuLayoutAlgorithm, BoxLayoutAlgorithm) public: - MenuLayoutAlgorithm(int32_t id, const std::string& tag) : targetNodeId_(id), targetTag_(tag) {} + MenuLayoutAlgorithm(int32_t id, const std::string& tag); MenuLayoutAlgorithm() = default; - ~MenuLayoutAlgorithm() override = default; + ~MenuLayoutAlgorithm() override; // override measureSelf and measureChildren. void Measure(LayoutWrapper* layoutWrapper) override; @@ -74,6 +74,20 @@ private: OffsetF GetChildPosition(const SizeF& childSize, const RefPtr& layoutProp); ErrorPositionType GetErrorPositionType(const OffsetF& childOffset, const SizeF& childSize); OffsetF FitToScreen(const OffsetF& fitPosition, const SizeF& childSize); + + OffsetF GetPositionWithPlacementTop(const SizeF&, const OffsetF&, const OffsetF&); + OffsetF GetPositionWithPlacementTopLeft(const SizeF&, const OffsetF&, const OffsetF&); + OffsetF GetPositionWithPlacementTopRight(const SizeF&, const OffsetF&, const OffsetF&); + OffsetF GetPositionWithPlacementBottom(const SizeF&, const OffsetF&, const OffsetF&); + OffsetF GetPositionWithPlacementBottomLeft(const SizeF&, const OffsetF&, const OffsetF&); + OffsetF GetPositionWithPlacementBottomRight(const SizeF&, const OffsetF&, const OffsetF&); + OffsetF GetPositionWithPlacementLeft(const SizeF&, const OffsetF&, const OffsetF&); + OffsetF GetPositionWithPlacementLeftTop(const SizeF&, const OffsetF&, const OffsetF&); + OffsetF GetPositionWithPlacementLeftBottom(const SizeF&, const OffsetF&, const OffsetF&); + OffsetF GetPositionWithPlacementRight(const SizeF&, const OffsetF&, const OffsetF&); + OffsetF GetPositionWithPlacementRightTop(const SizeF&, const OffsetF&, const OffsetF&); + OffsetF GetPositionWithPlacementRightBottom(const SizeF&, const OffsetF&, const OffsetF&); + OffsetF targetOffset_; SizeF targetSize_; Placement placement_ = Placement::BOTTOM; @@ -91,6 +105,9 @@ private: float margin_ = 0.0f; float optionPadding_ = 0.0f; + using PlacementFunc = OffsetF (MenuLayoutAlgorithm::*)(const SizeF&, const OffsetF&, const OffsetF&); + std::map placementFuncMap_; + ACE_DISALLOW_COPY_AND_MOVE(MenuLayoutAlgorithm); }; } // namespace OHOS::Ace::NG -- Gitee From 3b85bfbde517724289a8a567dd887637471285e7 Mon Sep 17 00:00:00 2001 From: limeng Date: Sun, 16 Apr 2023 16:13:00 +0800 Subject: [PATCH 4/9] commit for review Signed-off-by: limeng --- .../components_ng/base/view_abstract_model_ng.h | 5 ++--- .../pattern/overlay/overlay_manager.cpp | 8 ++------ .../pattern/overlay/overlay_manager.h | 16 ++++++++++------ 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/frameworks/core/components_ng/base/view_abstract_model_ng.h b/frameworks/core/components_ng/base/view_abstract_model_ng.h index 22f98806e14..f8c3bca9964 100644 --- a/frameworks/core/components_ng/base/view_abstract_model_ng.h +++ b/frameworks/core/components_ng/base/view_abstract_model_ng.h @@ -732,9 +732,8 @@ public: } private: void RegisterMenuAppearCallback( - std::vector&& params, std::function&& buildFunc, const MenuParam& menuParam); - void RegisterMenuDisappearCallback( - std::vector&& params, std::function&& buildFunc, const MenuParam& menuParam); + std::vector& params, std::function&& buildFunc, const MenuParam& menuParam); + void RegisterMenuDisappearCallback(std::function&& buildFunc, const MenuParam& menuParam); void RegisterContextMenuAppearCallback(ResponseType type, const MenuParam& menuParam); void RegisterContextMenuDisappearCallback(const MenuParam& menuParam); }; diff --git a/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp b/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp index 992ba3d987b..de04e520430 100644 --- a/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp +++ b/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp @@ -219,9 +219,7 @@ void OverlayManager::ShowMenuAnimation(const RefPtr& menu, bool isInS CHECK_NULL_VOID_NOLOG(menu && overlayManager); ContainerScope scope(id); overlayManager->FocusOverlayNode(menu, isInSubWindow); - if (overlayManager->GetOnShowMenuCallback()) { - overlayManager->GetOnShowMenuCallback()(); - } + overlayManager->CallOnShowMenuCallback(); }); auto context = menu->GetRenderContext(); @@ -258,9 +256,7 @@ void OverlayManager::PopMenuAnimation(const RefPtr& menu) auto root = rootWeak.Upgrade(); auto overlayManager = weak.Upgrade(); CHECK_NULL_VOID_NOLOG(menu && root && overlayManager); - if (overlayManager->GetOnHideMenuCallback()) { - overlayManager->GetOnHideMenuCallback()(); - } + overlayManager->CallOnHideMenuCallback(); ContainerScope scope(id); auto menuWrapperPattern = menu->GetPattern(); diff --git a/frameworks/core/components_ng/pattern/overlay/overlay_manager.h b/frameworks/core/components_ng/pattern/overlay/overlay_manager.h index 5879c8fe50a..4559a6cb4e5 100644 --- a/frameworks/core/components_ng/pattern/overlay/overlay_manager.h +++ b/frameworks/core/components_ng/pattern/overlay/overlay_manager.h @@ -114,19 +114,23 @@ public: onHideMenuCallback_ = callback; } - void RegisterOnShowMenu(std::function callback) + void RegisterOnShowMenu(const std::function& callback) { onShowMenuCallback_ = callback; } - std::function GetOnShowMenuCallback() + void CallOnShowMenuCallback() { - return onShowMenuCallback_; + if (onShowMenuCallback_) { + onShowMenuCallback_(); + } } - std::function GetOnHideMenuCallback() + void CallOnHideMenuCallback() { - return onHideMenuCallback_; + if (onHideMenuCallback_) { + onHideMenuCallback_(); + } } void SetBackPressEvent(std::function event) @@ -215,7 +219,7 @@ private: #endif // ENABLE_DRAG_FRAMEWORK std::function onHideMenuCallback_ = nullptr; - std::function onShowMenuCallback_ = nullptr; + std::function onShowMenuCallback_; CancelableCallback continuousTask_; std::function backPressEvent_ = nullptr; -- Gitee From 7887ef0ac3e3738e7d72fe24f0cdc6f7ae963bbe Mon Sep 17 00:00:00 2001 From: limeng Date: Sun, 16 Apr 2023 16:34:23 +0800 Subject: [PATCH 5/9] modify for code check Signed-off-by: limeng --- .../core/components_ng/pattern/menu/menu_layout_algorithm.h | 2 +- frameworks/core/components_ng/pattern/overlay/overlay_manager.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/core/components_ng/pattern/menu/menu_layout_algorithm.h b/frameworks/core/components_ng/pattern/menu/menu_layout_algorithm.h index 4bcb94f59b6..3e5f30a2e1e 100644 --- a/frameworks/core/components_ng/pattern/menu/menu_layout_algorithm.h +++ b/frameworks/core/components_ng/pattern/menu/menu_layout_algorithm.h @@ -106,7 +106,7 @@ private: float optionPadding_ = 0.0f; using PlacementFunc = OffsetF (MenuLayoutAlgorithm::*)(const SizeF&, const OffsetF&, const OffsetF&); - std::map placementFuncMap_; + std::map placementFuncMap_; ACE_DISALLOW_COPY_AND_MOVE(MenuLayoutAlgorithm); }; diff --git a/frameworks/core/components_ng/pattern/overlay/overlay_manager.h b/frameworks/core/components_ng/pattern/overlay/overlay_manager.h index 4559a6cb4e5..9d494b0c331 100644 --- a/frameworks/core/components_ng/pattern/overlay/overlay_manager.h +++ b/frameworks/core/components_ng/pattern/overlay/overlay_manager.h @@ -128,7 +128,7 @@ public: void CallOnHideMenuCallback() { - if (onHideMenuCallback_) { + if (onHideMenuCallback_) { onHideMenuCallback_(); } } -- Gitee From d6d0f866a097524b756bca3ee823eb25f936ce0e Mon Sep 17 00:00:00 2001 From: limeng Date: Mon, 17 Apr 2023 11:37:59 +0800 Subject: [PATCH 6/9] =?UTF-8?q?bindContextMenu=E3=80=81bindMenu=E8=83=BD?= =?UTF-8?q?=E5=8A=9B=E5=A2=9E=E5=BC=BA=E8=AF=84=E8=AE=BA=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: limeng --- frameworks/base/subwindow/subwindow_manager.cpp | 4 ++-- frameworks/base/subwindow/subwindow_manager.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/base/subwindow/subwindow_manager.cpp b/frameworks/base/subwindow/subwindow_manager.cpp index 64ec95d89b2..976a41fa656 100644 --- a/frameworks/base/subwindow/subwindow_manager.cpp +++ b/frameworks/base/subwindow/subwindow_manager.cpp @@ -512,7 +512,7 @@ void SubwindowManager::HideSubWindowNG() } } -void SubwindowManager::RegisterOnShowMenu(std::function callback) +void SubwindowManager::RegisterOnShowMenu(std::function& callback) { onShowMenuCallback_ = callback; if (currentSubwindow_) { @@ -522,7 +522,7 @@ void SubwindowManager::RegisterOnShowMenu(std::function callback) } } -void SubwindowManager::RegisterOnHideMenu(std::function callback) +void SubwindowManager::RegisterOnHideMenu(std::function& callback) { onHideMenuCallback_ = callback; if (currentSubwindow_) { diff --git a/frameworks/base/subwindow/subwindow_manager.h b/frameworks/base/subwindow/subwindow_manager.h index d0a8dfb3000..1b709b467d7 100644 --- a/frameworks/base/subwindow/subwindow_manager.h +++ b/frameworks/base/subwindow/subwindow_manager.h @@ -93,8 +93,8 @@ public: void ShowActionMenu(const std::string& title, const std::vector& button, std::function&& callback); void CloseDialog(int32_t instanceId); - void RegisterOnShowMenu(std::function callback); - void RegisterOnHideMenu(std::function callback); + void RegisterOnShowMenu(std::function& callback); + void RegisterOnHideMenu(std::function& callback); private: RefPtr GetOrCreateSubWindow(); -- Gitee From 772b4df7c6fb4718d754bb9c0e74c0ee53f1d785 Mon Sep 17 00:00:00 2001 From: limeng Date: Mon, 17 Apr 2023 16:28:52 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E4=B8=8D=E8=A7=A3=E6=9E=90=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: limeng --- .../declarative_frontend/jsview/js_view_abstract.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/frameworks/bridge/declarative_frontend/jsview/js_view_abstract.cpp b/frameworks/bridge/declarative_frontend/jsview/js_view_abstract.cpp index 1c5b44ead76..07fee16b497 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_view_abstract.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_view_abstract.cpp @@ -101,6 +101,9 @@ constexpr double ROUND_UNIT = 360.0; constexpr double VISIBLE_RATIO_MIN = 0.0; constexpr double VISIBLE_RATIO_MAX = 1.0; constexpr int32_t MIN_ROTATE_VECTOR_Z = 9; +constexpr int32_t PARAMETER_LENGTH_FIRST = 1; +constexpr int32_t PARAMETER_LENGTH_SECOND = 2; +constexpr int32_t PARAMETER_LENGTH_THIRD = 3; bool CheckJSCallbackInfo( const std::string& callerName, const JSCallbackInfo& info, std::vector& infoTypes) @@ -2153,7 +2156,7 @@ void ParseBindContentOptionParam(const JSCallbackInfo& info, const JSRef& void JSViewAbstract::JsBindMenu(const JSCallbackInfo& info) { NG::MenuParam menuParam; - if (info.Length() > 1 && info[1]->IsObject()) { + if (info.Length() > PARAMETER_LENGTH_FIRST && info[1]->IsObject()) { ParseBindOptionParam(info, menuParam); } if (info[0]->IsArray()) { @@ -4519,7 +4522,7 @@ void JSViewAbstract::JsBindContextMenu(const JSCallbackInfo& info) CHECK_NULL_VOID(builderFunc); ResponseType responseType = ResponseType::LONG_PRESS; - if (info.Length() == 2 && info[1]->IsNumber()) { + if (info.Length() >= PARAMETER_LENGTH_SECOND && info[1]->IsNumber()) { auto response = info[1]->ToNumber(); LOGI("Set the responseType is %{public}d.", response); responseType = static_cast(response); @@ -4531,7 +4534,7 @@ void JSViewAbstract::JsBindContextMenu(const JSCallbackInfo& info) }; NG::MenuParam menuParam; - if (info.Length() >= 3 && info[2]->IsObject()) { + if (info.Length() >= PARAMETER_LENGTH_THIRD && info[2]->IsObject()) { ParseBindContentOptionParam(info, info[2], menuParam); } -- Gitee From 7594088c7f245742ae242b34eb73212cb8992d58 Mon Sep 17 00:00:00 2001 From: limeng Date: Mon, 17 Apr 2023 17:49:35 +0800 Subject: [PATCH 8/9] =?UTF-8?q?=E4=BF=AE=E6=94=B9RegisterOnHideMenu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: limeng --- frameworks/base/subwindow/subwindow_manager.cpp | 2 +- frameworks/base/subwindow/subwindow_manager.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/base/subwindow/subwindow_manager.cpp b/frameworks/base/subwindow/subwindow_manager.cpp index 976a41fa656..fc01249a16f 100644 --- a/frameworks/base/subwindow/subwindow_manager.cpp +++ b/frameworks/base/subwindow/subwindow_manager.cpp @@ -522,7 +522,7 @@ void SubwindowManager::RegisterOnShowMenu(std::function& callback) } } -void SubwindowManager::RegisterOnHideMenu(std::function& callback) +void SubwindowManager::RegisterOnHideMenu(const std::function&& callback) { onHideMenuCallback_ = callback; if (currentSubwindow_) { diff --git a/frameworks/base/subwindow/subwindow_manager.h b/frameworks/base/subwindow/subwindow_manager.h index 1b709b467d7..a5f004a991d 100644 --- a/frameworks/base/subwindow/subwindow_manager.h +++ b/frameworks/base/subwindow/subwindow_manager.h @@ -94,7 +94,7 @@ public: std::function&& callback); void CloseDialog(int32_t instanceId); void RegisterOnShowMenu(std::function& callback); - void RegisterOnHideMenu(std::function& callback); + void RegisterOnHideMenu(const std::function&& callback); private: RefPtr GetOrCreateSubWindow(); -- Gitee From ff93aa23e4ff0ce48fce5fb5cbcd542991e4343c Mon Sep 17 00:00:00 2001 From: limeng Date: Mon, 17 Apr 2023 18:19:50 +0800 Subject: [PATCH 9/9] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: limeng --- frameworks/base/subwindow/subwindow_manager.cpp | 4 ++-- frameworks/base/subwindow/subwindow_manager.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/base/subwindow/subwindow_manager.cpp b/frameworks/base/subwindow/subwindow_manager.cpp index fc01249a16f..a4a275ede52 100644 --- a/frameworks/base/subwindow/subwindow_manager.cpp +++ b/frameworks/base/subwindow/subwindow_manager.cpp @@ -512,7 +512,7 @@ void SubwindowManager::HideSubWindowNG() } } -void SubwindowManager::RegisterOnShowMenu(std::function& callback) +void SubwindowManager::RegisterOnShowMenu(const std::function& callback) { onShowMenuCallback_ = callback; if (currentSubwindow_) { @@ -522,7 +522,7 @@ void SubwindowManager::RegisterOnShowMenu(std::function& callback) } } -void SubwindowManager::RegisterOnHideMenu(const std::function&& callback) +void SubwindowManager::RegisterOnHideMenu(const std::function& callback) { onHideMenuCallback_ = callback; if (currentSubwindow_) { diff --git a/frameworks/base/subwindow/subwindow_manager.h b/frameworks/base/subwindow/subwindow_manager.h index a5f004a991d..12993ef094c 100644 --- a/frameworks/base/subwindow/subwindow_manager.h +++ b/frameworks/base/subwindow/subwindow_manager.h @@ -93,8 +93,8 @@ public: void ShowActionMenu(const std::string& title, const std::vector& button, std::function&& callback); void CloseDialog(int32_t instanceId); - void RegisterOnShowMenu(std::function& callback); - void RegisterOnHideMenu(const std::function&& callback); + void RegisterOnShowMenu(const std::function& callback); + void RegisterOnHideMenu(const std::function& callback); private: RefPtr GetOrCreateSubWindow(); -- Gitee