Merge branch 'mac-search-menu-check'

Fix check items state in wxSearchCtrl menu under macOS.

See https://github.com/wxWidgets/wxWidgets/pull/2304
This commit is contained in:
Vadim Zeitlin
2021-04-04 17:04:18 +02:00
6 changed files with 43 additions and 25 deletions

View File

@@ -44,8 +44,8 @@ public:
// implementation only from now on // implementation only from now on
// ------------------------------- // -------------------------------
bool HandleCommandUpdateStatus( wxMenuItem* menuItem, wxWindow* senderWindow = NULL); bool HandleCommandUpdateStatus( wxMenuItem* menuItem );
bool HandleCommandProcess( wxMenuItem* menuItem, wxWindow* senderWindow = NULL); bool HandleCommandProcess( wxMenuItem* menuItem );
void HandleMenuItemHighlighted( wxMenuItem* menuItem ); void HandleMenuItemHighlighted( wxMenuItem* menuItem );
void HandleMenuOpened(); void HandleMenuOpened();
void HandleMenuClosed(); void HandleMenuClosed();

View File

@@ -62,6 +62,10 @@ public:
wxSearchWidgetImpl * GetSearchPeer() const; wxSearchWidgetImpl * GetSearchPeer() const;
#if wxUSE_MENUS
virtual void OSXAfterMenuEvent() wxOVERRIDE;
#endif // wxUSE_MENUS
protected: protected:
wxSize DoGetBestSize() const wxOVERRIDE; wxSize DoGetBestSize() const wxOVERRIDE;

View File

@@ -299,6 +299,11 @@ public:
// Return the DPI corresponding to the given scale factor. // Return the DPI corresponding to the given scale factor.
static wxSize OSXMakeDPIFromScaleFactor(double scaleFactor); static wxSize OSXMakeDPIFromScaleFactor(double scaleFactor);
#if wxUSE_MENUS
// Called on the invoking window after handling the menu event.
virtual void OSXAfterMenuEvent() { }
#endif // wxUSE_MENUS
protected: protected:
// For controls like radio buttons which are genuinely composite // For controls like radio buttons which are genuinely composite
wxList m_subControls; wxList m_subControls;

View File

@@ -53,7 +53,8 @@ enum
ID_CANCEL_CB, ID_CANCEL_CB,
ID_MENU_CB, ID_MENU_CB,
ID_SEARCHMENU ID_SEARCHMENU,
ID_SEARCHMENU_LAST = ID_SEARCHMENU + 5
}; };
@@ -82,6 +83,8 @@ protected:
void OnText(wxCommandEvent& event); void OnText(wxCommandEvent& event);
void OnTextEnter(wxCommandEvent& event); void OnTextEnter(wxCommandEvent& event);
void OnSearchMenu(wxCommandEvent& event);
void OnSearch(wxCommandEvent& event); void OnSearch(wxCommandEvent& event);
void OnSearchCancel(wxCommandEvent& event); void OnSearchCancel(wxCommandEvent& event);
@@ -113,6 +116,9 @@ wxBEGIN_EVENT_TABLE(SearchCtrlWidgetsPage, WidgetsPage)
EVT_TEXT(wxID_ANY, SearchCtrlWidgetsPage::OnText) EVT_TEXT(wxID_ANY, SearchCtrlWidgetsPage::OnText)
EVT_TEXT_ENTER(wxID_ANY, SearchCtrlWidgetsPage::OnTextEnter) EVT_TEXT_ENTER(wxID_ANY, SearchCtrlWidgetsPage::OnTextEnter)
EVT_MENU_RANGE(ID_SEARCHMENU, ID_SEARCHMENU_LAST,
SearchCtrlWidgetsPage::OnSearchMenu)
EVT_SEARCH(wxID_ANY, SearchCtrlWidgetsPage::OnSearch) EVT_SEARCH(wxID_ANY, SearchCtrlWidgetsPage::OnSearch)
EVT_SEARCH_CANCEL(wxID_ANY, SearchCtrlWidgetsPage::OnSearchCancel) EVT_SEARCH_CANCEL(wxID_ANY, SearchCtrlWidgetsPage::OnSearchCancel)
wxEND_EVENT_TABLE() wxEND_EVENT_TABLE()
@@ -187,14 +193,13 @@ void SearchCtrlWidgetsPage::RecreateWidget()
wxMenu* SearchCtrlWidgetsPage::CreateTestMenu() wxMenu* SearchCtrlWidgetsPage::CreateTestMenu()
{ {
wxMenu* menu = new wxMenu; wxMenu* menu = new wxMenu;
const int SEARCH_MENU_SIZE = 5;
wxMenuItem* menuItem = menu->Append(wxID_ANY, "Recent Searches", "", wxITEM_NORMAL); wxMenuItem* menuItem = menu->Append(wxID_ANY, "Recent Searches", "", wxITEM_NORMAL);
menuItem->Enable(false); menuItem->Enable(false);
for ( int i = 0; i < SEARCH_MENU_SIZE; i++ ) for ( int i = 0; i < ID_SEARCHMENU_LAST - ID_SEARCHMENU; i++ )
{ {
wxString itemText = wxString::Format("item %i",i); wxString itemText = wxString::Format("item %i",i);
wxString tipText = wxString::Format("tip %i",i); wxString tipText = wxString::Format("tip %i",i);
menu->Append(ID_SEARCHMENU+i, itemText, tipText, wxITEM_NORMAL); menu->Append(ID_SEARCHMENU+i, itemText, tipText, wxITEM_CHECK);
} }
return menu; return menu;
} }
@@ -235,6 +240,13 @@ void SearchCtrlWidgetsPage::OnTextEnter(wxCommandEvent& event)
event.GetString()); event.GetString());
} }
void SearchCtrlWidgetsPage::OnSearchMenu(wxCommandEvent& event)
{
int id = event.GetId() - ID_SEARCHMENU;
wxLogMessage("Search menu: \"item %i\" selected (%s).",
id, event.IsChecked() ? "checked" : "unchecked");
}
void SearchCtrlWidgetsPage::OnSearch(wxCommandEvent& event) void SearchCtrlWidgetsPage::OnSearch(wxCommandEvent& event)
{ {
wxLogMessage("Search button: search for \"%s\".", event.GetString()); wxLogMessage("Search button: search for \"%s\".", event.GetString());

View File

@@ -318,7 +318,7 @@ void wxMenu::DoRearrange()
} }
bool wxMenu::HandleCommandUpdateStatus( wxMenuItem* item, wxWindow* senderWindow ) bool wxMenu::HandleCommandUpdateStatus( wxMenuItem* item )
{ {
int menuid = item ? item->GetId() : 0; int menuid = item ? item->GetId() : 0;
wxUpdateUIEvent event(menuid); wxUpdateUIEvent event(menuid);
@@ -329,11 +329,6 @@ bool wxMenu::HandleCommandUpdateStatus( wxMenuItem* item, wxWindow* senderWindow
bool processed = DoProcessEvent(this, event, GetWindow()); bool processed = DoProcessEvent(this, event, GetWindow());
if ( !processed && senderWindow != NULL)
{
processed = senderWindow->HandleWindowEvent(event);
}
if ( processed ) if ( processed )
{ {
// if anything changed, update the changed attribute // if anything changed, update the changed attribute
@@ -348,7 +343,7 @@ bool wxMenu::HandleCommandUpdateStatus( wxMenuItem* item, wxWindow* senderWindow
return processed; return processed;
} }
bool wxMenu::HandleCommandProcess( wxMenuItem* item, wxWindow* senderWindow ) bool wxMenu::HandleCommandProcess( wxMenuItem* item )
{ {
int menuid = item ? item->GetId() : 0; int menuid = item ? item->GetId() : 0;
bool processed = false; bool processed = false;
@@ -357,24 +352,18 @@ bool wxMenu::HandleCommandProcess( wxMenuItem* item, wxWindow* senderWindow )
if ( SendEvent( menuid , item->IsCheckable() ? item->IsChecked() : -1 ) ) if ( SendEvent( menuid , item->IsCheckable() ? item->IsChecked() : -1 ) )
processed = true ; processed = true ;
else
{
if ( senderWindow != NULL )
{
wxCommandEvent event(wxEVT_MENU , menuid);
event.SetEventObject(this);
event.SetInt(item->IsCheckable() ? item->IsChecked() : -1);
if ( senderWindow->HandleWindowEvent(event) )
processed = true ;
}
}
if(!processed && item) if(!processed && item)
{ {
processed = item->GetPeer()->DoDefault(); processed = item->GetPeer()->DoDefault();
} }
if (wxWindow* const w = GetInvokingWindow())
{
// Let the invoking window update itself if necessary.
w->OSXAfterMenuEvent();
}
return processed; return processed;
} }

View File

@@ -119,6 +119,14 @@ wxMenu* wxSearchCtrl::GetMenu()
return m_menu; return m_menu;
} }
void wxSearchCtrl::OSXAfterMenuEvent()
{
// The menu is used as a template for creating the actual menu shown by the
// control, so update this template with the latest menu state after a menu
// command as the state of check/radio items could have changed after it.
GetSearchPeer()->SetSearchMenu( m_menu );
}
#endif // wxUSE_MENUS #endif // wxUSE_MENUS
void wxSearchCtrl::ShowSearchButton( bool show ) void wxSearchCtrl::ShowSearchButton( bool show )