From 2209ec29f72df79fdb8466ba5c3e3b65a412d79d Mon Sep 17 00:00:00 2001 From: Kvaz1r Date: Sun, 27 Jun 2021 21:48:22 +0300 Subject: [PATCH] Add handling LEFT_UP --- include/wx/univ/menu.h | 1 + src/univ/menu.cpp | 55 ++++++++++++++++++++++++++++++++++++------ 2 files changed, 49 insertions(+), 7 deletions(-) diff --git a/include/wx/univ/menu.h b/include/wx/univ/menu.h index 169067915a..72becf3b06 100644 --- a/include/wx/univ/menu.h +++ b/include/wx/univ/menu.h @@ -187,6 +187,7 @@ protected: // event handlers void OnLeftDown(wxMouseEvent& event); + void OnLeftUp(wxMouseEvent& event); void OnMouseMove(wxMouseEvent& event); void OnKeyDown(wxKeyEvent& event); void OnKillFocus(wxFocusEvent& event); diff --git a/src/univ/menu.cpp b/src/univ/menu.cpp index c8c6321915..ac8769fe61 100644 --- a/src/univ/menu.cpp +++ b/src/univ/menu.cpp @@ -181,6 +181,7 @@ protected: // event handlers void OnLeftDown(wxMouseEvent& event); + void OnLeftUp(wxMouseEvent& event); void OnMouseMove(wxMouseEvent& event); void OnMouseLeave(wxMouseEvent& event); void OnKeyDown(wxKeyEvent& event); @@ -282,6 +283,7 @@ wxBEGIN_EVENT_TABLE(wxPopupMenuWindow, wxPopupTransientWindow) EVT_KEY_DOWN(wxPopupMenuWindow::OnKeyDown) EVT_LEFT_DOWN(wxPopupMenuWindow::OnLeftDown) + EVT_LEFT_UP(wxPopupMenuWindow::OnLeftUp) EVT_MOTION(wxPopupMenuWindow::OnMouseMove) EVT_LEAVE_WINDOW(wxPopupMenuWindow::OnMouseLeave) EVT_MOUSE_CAPTURE_LOST(wxPopupMenuWindow::OnCaptureLost) @@ -294,6 +296,7 @@ wxBEGIN_EVENT_TABLE(wxMenuBar, wxMenuBarBase) EVT_KILL_FOCUS(wxMenuBar::OnKillFocus) EVT_KEY_DOWN(wxMenuBar::OnKeyDown) EVT_LEFT_DOWN(wxMenuBar::OnLeftDown) + EVT_LEFT_UP(wxMenuBar::OnLeftUp) EVT_MOTION(wxMenuBar::OnMouseMove) EVT_MOUSE_CAPTURE_LOST(wxMenuBar::OnCaptureLost) wxEND_EVENT_TABLE() @@ -356,7 +359,7 @@ void wxPopupMenuWindow::ChangeCurrent(wxMenuItemIter node) wxCHECK_RET( item, wxT("no current item?") ); // if it was the currently opened menu, close it - if ( item->IsSubMenu() && item->GetSubMenu()->IsShown() ) + if ( node && item->IsSubMenu() && item->GetSubMenu()->IsShown() ) { item->GetSubMenu()->Dismiss(); OnSubmenuDismiss( false ); @@ -722,6 +725,18 @@ bool wxPopupMenuWindow::ProcessLeftDown(wxMouseEvent& event) } void wxPopupMenuWindow::OnLeftDown(wxMouseEvent& event) +{ + wxMenuBar* menubar = m_menu->GetMenuBar(); + if ( menubar && !GetMenuItemFromPoint(event.GetPosition()) && !ProcessLeftDown(event) ) + { + wxPoint pos = event.GetPosition(); + wxPoint posScreen = ClientToScreen(pos); + event.SetPosition(menubar->ScreenToClient(posScreen)); + menubar->ProcessEvent(event); + } +} + +void wxPopupMenuWindow::OnLeftUp(wxMouseEvent& event) { wxMenuItemIter node = GetMenuItemFromPoint(event.GetPosition()); if ( node ) @@ -733,6 +748,9 @@ void wxPopupMenuWindow::OnLeftDown(wxMouseEvent& event) wxMenuBar* menubar = m_menu->GetMenuBar(); if ( menubar && !ProcessLeftDown(event) ) { + wxPoint pos = event.GetPosition(); + wxPoint posScreen = ClientToScreen(pos); + event.SetPosition(menubar->ScreenToClient(posScreen)); menubar->ProcessEvent(event); } } @@ -2129,14 +2147,25 @@ void wxMenuBar::OnLeftDown(wxMouseEvent& event) } else // we didn't have mouse capture, capture it now { - m_current = GetMenuFromPoint(event.GetPosition()); - if ( m_current == -1 ) + int item = GetMenuFromPoint(event.GetPosition()); + if ( item == -1 ) { - DismissMenu(); // event outside menubar - dismiss - ReleaseMouseCapture(); // we could get capture back from popup window so release it + if ( IsShowingMenu() ) + { + DismissMenu(); // event outside menubar - dismiss + ReleaseMouseCapture(); // we could get capture back from popup window so release it + } + } + else if ( item == m_current && IsShowingMenu() ) + { + // double-click + DismissMenu(); + ReleaseMouseCapture(); } else // on item { + m_current = item; + wxLogTrace(wxT("mousecapture"), wxT("Capturing mouse from wxMenuBar::OnLeftDown")); CaptureMouse(); @@ -2149,6 +2178,15 @@ void wxMenuBar::OnLeftDown(wxMouseEvent& event) } } +void wxMenuBar::OnLeftUp(wxMouseEvent& event) +{ + if ( !HasCapture() && IsShowingMenu() && GetMenuFromPoint(event.GetPosition()) == -1 ) + { + DismissMenu(); + ReleaseMouseCapture(); + } +} + void wxMenuBar::OnMouseMove(wxMouseEvent& event) { if ( HasCapture() ) @@ -2332,9 +2370,12 @@ void wxMenuBar::OnKeyDown(wxKeyEvent& event) } } -void wxMenuBar::OnCaptureLost(wxMouseCaptureLostEvent& event) +void wxMenuBar::OnCaptureLost(wxMouseCaptureLostEvent& WXUNUSED(event)) { - DismissMenu(); + if ( IsShowingMenu() ) + { + DismissMenu(); + } } // ----------------------------------------------------------------------------