esc close dialog popup

Signed-off-by: huangdong57 <huangdong57@huawei.com>
This commit is contained in:
huangdong57 2023-06-16 18:15:33 +08:00
parent 0189ccf345
commit 7b6bbdaac3
7 changed files with 37 additions and 15 deletions

View File

@ -1167,7 +1167,7 @@ void PageRouterManager::CleanPageOverlay()
sharedManager->StopSharedTransition();
}
if (overlayManager->RemoveOverlay()) {
if (overlayManager->RemoveOverlay(true)) {
LOGI("clean page overlay.");
}
}

View File

@ -648,10 +648,6 @@ bool DialogPattern::OnKeyEvent(const KeyEvent& event)
if (event.action != KeyAction::DOWN) {
return false;
}
if (event.code == KeyCode::KEY_ESCAPE) {
PopDialog();
return true;
}
return false;
}

View File

@ -230,10 +230,6 @@ bool MenuPattern::OnKeyEvent(const KeyEvent& event) const
wrapperPattern->HideSubMenu();
return true;
}
if (event.code == KeyCode::KEY_ESCAPE) {
HideMenu();
return true;
}
return false;
}

View File

@ -840,7 +840,7 @@ void OverlayManager::CloseDialog(const RefPtr<FrameNode>& dialogNode)
CallOnHideDialogCallback();
}
bool OverlayManager::RemoveOverlay()
bool OverlayManager::RemoveOverlay(bool isBackPressed)
{
auto rootNode = rootNodeWeak_.Upgrade();
CHECK_NULL_RETURN(rootNode, true);
@ -861,7 +861,9 @@ bool OverlayManager::RemoveOverlay()
hub->FireCancelEvent();
}
CloseDialog(overlay);
SetBackPressEvent(nullptr);
if (isBackPressed) {
SetBackPressEvent(nullptr);
}
return true;
} else if (AceType::DynamicCast<BubblePattern>(pattern)) {
auto popupNode = AceType::DynamicCast<NG::FrameNode>(rootNode->GetChildAtIndex(childrenSize - 1));
@ -1009,6 +1011,20 @@ void OverlayManager::FocusOverlayNode(const RefPtr<FrameNode>& overlayNode, bool
void OverlayManager::BlurOverlayNode(bool isInSubWindow)
{
LOGI("OverlayManager::BlurOverlayNode");
auto rootNode = rootNodeWeak_.Upgrade();
CHECK_NULL_VOID(rootNode);
if (rootNode->GetChildren().size() > 1) {
auto collection = rootNode->GetChildren();
for (auto iter = collection.rbegin(); iter != collection.rend(); ++iter) {
auto overlay = DynamicCast<FrameNode>(*iter);
CHECK_NULL_VOID(overlay);
auto pattern = overlay->GetPattern();
if (AceType::InstanceOf<DialogPattern>(pattern) || AceType::InstanceOf<MenuWrapperPattern>(pattern)) {
FocusOverlayNode(overlay, isInSubWindow);
return;
}
}
}
if (isInSubWindow) {
// no need to set page request focus in sub window.
return;

View File

@ -108,7 +108,7 @@ public:
*
* @return true if popup was removed, false if no overlay exists
*/
bool RemoveOverlay();
bool RemoveOverlay(bool isBackPressed);
bool RemoveModalInOverlay();
bool RemoveOverlayInSubwindow();

View File

@ -859,7 +859,7 @@ bool PipelineContext::OnBackPressed()
[weakOverlay = AceType::WeakClaim(AceType::RawPtr(overlayManager_)), &hasOverlay]() {
auto overlay = weakOverlay.Upgrade();
CHECK_NULL_VOID_NOLOG(overlay);
hasOverlay = overlay->RemoveOverlay();
hasOverlay = overlay->RemoveOverlay(true);
},
TaskExecutor::TaskType::UI);
if (hasOverlay) {
@ -1293,7 +1293,16 @@ bool PipelineContext::OnKeyEvent(const KeyEvent& event)
auto mainNode = lastPage ? lastPage : rootNode_;
CHECK_NULL_RETURN(mainNode, false);
if (!eventManager_->DispatchTabIndexEventNG(event, rootNode_, mainNode)) {
return eventManager_->DispatchKeyEventNG(event, rootNode_);
if (!eventManager_->DispatchKeyEventNG(event, rootNode_) && event.code == KeyCode::KEY_ESCAPE &&
event.action == KeyAction::DOWN) {
CHECK_NULL_RETURN(overlayManager_, false);
auto currentContainer = Container::Current();
if (currentContainer->IsSubContainer() || currentContainer->IsDialogContainer()) {
return overlayManager_->RemoveOverlayInSubwindow();
} else {
return overlayManager_->RemoveOverlay(false);
}
}
}
return true;
}

View File

@ -76,7 +76,12 @@ void OverlayManager::CloseDialog(const RefPtr<FrameNode>& dialogNode)
removeOverlayFlag = (dialogNode != nullptr);
}
bool OverlayManager::RemoveOverlay()
bool OverlayManager::RemoveOverlay(bool isBackPressed)
{
return removeOverlayFlag;
}
bool OverlayManager::RemoveOverlayInSubwindow()
{
return removeOverlayFlag;
}