From 3d360344cb2c307615bad8f6c5080a1d8948abcc Mon Sep 17 00:00:00 2001 From: zhouchengchao Date: Mon, 4 Sep 2023 16:56:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=A0=87=E9=A2=98=E6=A0=8F?= =?UTF-8?q?=E5=AD=90=E7=AA=97=E5=8F=A3=E4=B8=8D=E8=83=BD=E5=BC=B9=E5=87=BA?= =?UTF-8?q?=E9=97=AE=E9=A2=98&=E4=BF=AE=E5=A4=8Dfloating=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E4=B8=8B=E8=87=AA=E7=AA=97=E5=8F=A3=E5=BC=B9=E5=87=BAfaloting?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhouchengchao --- .../container_modal_pattern.cpp | 8 +++- .../container_modal/container_modal_pattern.h | 6 +++ .../enhance/container_modal_view_enhance.cpp | 38 +++++++++++++------ .../enhance/container_modal_view_enhance.h | 3 +- 4 files changed, 40 insertions(+), 15 deletions(-) diff --git a/frameworks/core/components_ng/pattern/container_modal/container_modal_pattern.cpp b/frameworks/core/components_ng/pattern/container_modal/container_modal_pattern.cpp index e71e6f352d3..23a49016234 100644 --- a/frameworks/core/components_ng/pattern/container_modal/container_modal_pattern.cpp +++ b/frameworks/core/components_ng/pattern/container_modal/container_modal_pattern.cpp @@ -206,8 +206,12 @@ void ContainerModalPattern::InitContainerEvent() AnimationUtils::Animate(option, [context]() { context->OnTransformTranslateUpdate({ 0.0f, 0.0f, 0.0f }); }); } - if ((info.GetLocalLocation().GetY() >= titlePopupDistance || action == MouseAction::WINDOW_LEAVE) && - floatingLayoutProperty->GetVisibilityValue() == VisibleType::VISIBLE) { + if ((info.GetLocalLocation().GetY() >= titlePopupDistance || action == MouseAction::WINDOW_LEAVE) && + floatingLayoutProperty->GetVisibilityValue() == VisibleType::VISIBLE) { + if (action == MouseAction::WINDOW_LEAVE && container->onShowFloatingSubWindow_) { + container->SetOnShowFloatingSubWindow(false); + return; + } AnimationUtils::Animate( option, [context, titlePopupDistance]() { diff --git a/frameworks/core/components_ng/pattern/container_modal/container_modal_pattern.h b/frameworks/core/components_ng/pattern/container_modal/container_modal_pattern.h index 7a2668a6716..97b2a00014c 100644 --- a/frameworks/core/components_ng/pattern/container_modal/container_modal_pattern.h +++ b/frameworks/core/components_ng/pattern/container_modal/container_modal_pattern.h @@ -68,6 +68,11 @@ public: virtual void SetContainerButtonHide(bool hideSplit, bool hideMaximize, bool hideMinimize); void SetCloseButtonStatus(bool isEnabled); + + void SetOnShowFloatingSubWindow(bool onShowFloatingSubWindow) + { + onShowFloatingSubWindow_ = onShowFloatingSubWindow; + } protected: virtual RefPtr GetTitleItemByIndex(const RefPtr& titleNode, int32_t originIndex) @@ -97,6 +102,7 @@ private: bool hasDeco_ = true; bool isFocus_ = true; bool hideSplitButton_ = false; + bool onShowFloatingSubWindow_ = false; }; } // namespace OHOS::Ace::NG #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_CONTAINER_MODAL_CONTAINER_MODAL_PATTERN_H diff --git a/frameworks/core/components_ng/pattern/container_modal/enhance/container_modal_view_enhance.cpp b/frameworks/core/components_ng/pattern/container_modal/enhance/container_modal_view_enhance.cpp index 32792be43dc..c355a2b4221 100755 --- a/frameworks/core/components_ng/pattern/container_modal/enhance/container_modal_view_enhance.cpp +++ b/frameworks/core/components_ng/pattern/container_modal/enhance/container_modal_view_enhance.cpp @@ -18,6 +18,9 @@ #include "base/geometry/ng/offset_t.h" #include "base/i18n/localization.h" #include "base/memory/ace_type.h" +#include "base/subwindow/subwindow_manager.h" +#include "base/utils/utils.h" +#include "core/common/container.h" #include "core/components/common/layout/constants.h" #include "core/components/common/properties/color.h" #include "core/components_ng/base/frame_node.h" @@ -26,6 +29,7 @@ #include "core/components_ng/gestures/tap_gesture.h" #include "core/components_ng/pattern/button/button_layout_property.h" #include "core/components_ng/pattern/button/button_pattern.h" +#include "core/components_ng/pattern/container_modal/container_modal_pattern.h" #include "core/components_ng/pattern/container_modal/enhance/container_modal_pattern_enhance.h" #include "core/components_ng/pattern/divider/divider_layout_property.h" #include "core/components_ng/pattern/divider/divider_pattern.h" @@ -224,12 +228,12 @@ void ContainerModalViewEnhance::BondingMaxBtnGestureEvent(RefPtr& max hub->AddClickEvent(AceType::MakeRefPtr(std::move(event))); // add long press event - auto longPressCallback = [maximizeBtn](GestureEvent& info) { + auto longPressCallback = [containerNode, maximizeBtn](GestureEvent& info) { LOGD("maximize btn long press,call showMaxMenu func"); auto menuPosX = info.GetScreenLocation().GetX() - info.GetLocalLocation().GetX() - MENU_FLOAT_X.ConvertToPx(); auto menuPosY = info.GetScreenLocation().GetY() - info.GetLocalLocation().GetY() + MENU_FLOAT_Y.ConvertToPx(); OffsetF menuPosition { menuPosX, menuPosY }; - ShowMaxMenu(maximizeBtn, menuPosition); + ShowMaxMenu(containerNode, maximizeBtn, menuPosition); }; // diable mouse left! auto longPressEvent = AceType::MakeRefPtr(longPressCallback); @@ -248,19 +252,20 @@ void ContainerModalViewEnhance::BondingMaxBtnInputEvent(RefPtr& maxim auto pipeline = PipelineContext::GetCurrentContext(); auto windowManager = pipeline->GetWindowManager(); auto hub = maximizeBtn->GetOrCreateInputEventHub(); - auto hoverMoveFuc = [maximizeBtn, pipeline](MouseInfo& info) { + auto hoverMoveFuc = [containerNode, maximizeBtn, pipeline](MouseInfo& info) { LOGD("container window on hover event action_ = %{public}d sIsMenuPending_ %{public}d", info.GetAction(), sIsMenuPending_); if (!sIsMenuPending_ && info.GetAction() == MouseAction::MOVE) { - auto&& callback = [maximizeBtn, info]() { + auto&& callback = [containerNode, maximizeBtn, info]() { auto menuPosX = info.GetScreenLocation().GetX() - info.GetLocalLocation().GetX() - MENU_FLOAT_X.ConvertToPx(); auto menuPosY = info.GetScreenLocation().GetY() - info.GetLocalLocation().GetY() + MENU_FLOAT_Y.ConvertToPx(); OffsetF menuPosition {menuPosX, menuPosY}; - ShowMaxMenu(maximizeBtn, menuPosition); + ShowMaxMenu(containerNode, maximizeBtn, menuPosition); }; sContextTimer_.Reset(callback); + ACE_SCOPED_TRACE("ContainerModalEnhance::PendingMaxMenu"); pipeline->GetTaskExecutor()->PostDelayedTask(sContextTimer_, TaskExecutor::TaskType::UI, MENU_TASK_DELAY_TIME); sIsMenuPending_ = true; @@ -280,14 +285,16 @@ void ContainerModalViewEnhance::BondingMaxBtnInputEvent(RefPtr& maxim hub->AddOnHoverEvent(AceType::MakeRefPtr(std::move(hoverEventFuc))); } -RefPtr ContainerModalViewEnhance::ShowMaxMenu(const RefPtr& targetNode, OffsetF menuPosition) +RefPtr ContainerModalViewEnhance::ShowMaxMenu(const RefPtr& containerNode, + const RefPtr& targetNode, OffsetF menuPosition) { LOGI("ShowMaxMenu called"); auto pipeline = PipelineContext::GetCurrentContext(); CHECK_NULL_RETURN(pipeline, nullptr); auto windowManager = pipeline->GetWindowManager(); CHECK_NULL_RETURN(windowManager, nullptr); - + auto pattern = containerNode->GetPattern(); + CHECK_NULL_RETURN(pattern, nullptr); // menu list auto menuList = FrameNode::CreateFrameNode( V2::LIST_COMPONENT_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr()); @@ -302,8 +309,12 @@ RefPtr ContainerModalViewEnhance::ShowMaxMenu(const RefPtr menuList->AddChild(BuildLeftSplitMenuItem()); menuList->AddChild(BuildRightSplitMenuItem()); } - if ((!SubwindowManager::GetInstance()->GetCurrentWindow() - || !SubwindowManager::GetInstance()->GetCurrentWindow()->GetShown())) { + auto subWindowManger = SubwindowManager::GetInstance(); + CHECK_NULL_RETURN(subWindowManger, nullptr); + if ((!subWindowManger->GetSubwindow(Container::CurrentId()) + || !subWindowManger->GetSubwindow(Container::CurrentId())->GetShown())) { + ACE_SCOPED_TRACE("ContainerModalViewEnhance::ShowMaxMenu"); + pattern->SetOnShowFloatingSubWindow(true); MenuParam menu {}; menu.isAboveApps = true; ViewAbstract::BindMenuWithCustomNode(menuList, targetNode, MenuType::CONTEXT_MENU, menuPosition, menu); @@ -330,6 +341,7 @@ RefPtr ContainerModalViewEnhance::BuildMaximizeMenuItem() if (MaximizeMode::MODE_AVOID_SYSTEM_BAR == windowManager->GetCurrentWindowMaximizeMode()) { windowManager->WindowRecover(); } else { + ACE_SCOPED_TRACE("ContainerModalViewEnhance::SwithToMaximize"); windowManager->SetWindowMaximizeMode(MaximizeMode::MODE_AVOID_SYSTEM_BAR); windowManager->WindowMaximize(true); } @@ -361,16 +373,18 @@ RefPtr ContainerModalViewEnhance::BuildFullScreenMenuItem() } ResetHoverTimer(); LOGD("Enhance Menu, MODE_FULLSCREEN selected"); - if (MaximizeMode::MODE_FULL_FILL == windowManager->GetCurrentWindowMaximizeMode()) { + if (MaximizeMode::MODE_FULL_FILL == windowManager->GetCurrentWindowMaximizeMode() && + WindowMode::WINDOW_MODE_FULLSCREEN == windowManager->GetWindowMode()) { windowManager->WindowRecover(); } else { + ACE_SCOPED_TRACE("ContainerModalViewEnhance::SwithToFULLFILL"); windowManager->SetWindowMaximizeMode(MaximizeMode::MODE_FULL_FILL); windowManager->WindowMaximize(true); } }; auto fullScreenEvent = AceType::MakeRefPtr(std::move(fullScreenClickFunc)); - auto curMaxMode = windowManager->GetCurrentWindowMaximizeMode(); - auto fullScreenTitle = Localization::GetInstance()->GetEntryLetters(curMaxMode == MaximizeMode::MODE_FULL_FILL ? + auto fullScreenTitle = Localization::GetInstance()->GetEntryLetters( + WindowMode::WINDOW_MODE_FULLSCREEN == windowManager->GetWindowMode() ? "window.exitFullScreen" : "window.fullScreen"); auto fullScreenRow = BuildMenuItem(fullScreenTitle, InternalResource::ResourceId::IC_WINDOW_MENU_FULLSCREEN, fullScreenEvent, windowManager->GetWindowMaximizeMode() == MaximizeMode::MODE_FULL_FILL); diff --git a/frameworks/core/components_ng/pattern/container_modal/enhance/container_modal_view_enhance.h b/frameworks/core/components_ng/pattern/container_modal/enhance/container_modal_view_enhance.h index 5255566cf2f..60da870550d 100755 --- a/frameworks/core/components_ng/pattern/container_modal/enhance/container_modal_view_enhance.h +++ b/frameworks/core/components_ng/pattern/container_modal/enhance/container_modal_view_enhance.h @@ -33,7 +33,8 @@ protected: static RefPtr AddControlButtons(RefPtr& containerNode, RefPtr& containerTitleRow); static void BondingMaxBtnGestureEvent(RefPtr& maximizeBtn, RefPtr& containerNode); static void BondingMaxBtnInputEvent(RefPtr& maximizeBtn, RefPtr& containerNode); - static RefPtr ShowMaxMenu(const RefPtr& targetNode, OffsetF menuPosition); + static RefPtr ShowMaxMenu(const RefPtr& containerNode, const RefPtr& targetNode, + OffsetF menuPosition); static void BondingMenuItemEvent(RefPtr item); static RefPtr BuildMenuItem(std::string title, InternalResource::ResourceId resourceId, RefPtr event, bool chooseCurrent); -- Gitee