Fix wxEVT_UPDATE_UI propagation for popup menus in MDI windows too
This is similar to f74379c751
but specific to
wxMSW MDI code: also call wxMenu::UpdateUI() without any parameters from it
instead of overriding its logic for determining where to send the events.
Add code to the mdi sample demonstrating that the event handlers in the window
itself and its MDI frame parent get the events they're supposed to get.
See #17352.
This commit is contained in:
@@ -112,10 +112,14 @@ wxBEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
|
|||||||
EVT_MENU_HIGHLIGHT(wxID_ABOUT, MyCanvas::OnMenuHighlight)
|
EVT_MENU_HIGHLIGHT(wxID_ABOUT, MyCanvas::OnMenuHighlight)
|
||||||
EVT_MENU_HIGHLIGHT(MDI_REFRESH, MyCanvas::OnMenuHighlight)
|
EVT_MENU_HIGHLIGHT(MDI_REFRESH, MyCanvas::OnMenuHighlight)
|
||||||
EVT_MENU_CLOSE(MyCanvas::OnMenuClose)
|
EVT_MENU_CLOSE(MyCanvas::OnMenuClose)
|
||||||
|
|
||||||
|
EVT_UPDATE_UI(MDI_DISABLED_FROM_CANVAS, MyCanvas::OnUpdateUIDisable)
|
||||||
wxEND_EVENT_TABLE()
|
wxEND_EVENT_TABLE()
|
||||||
|
|
||||||
wxBEGIN_EVENT_TABLE(MyChild::EventHandler, wxEvtHandler)
|
wxBEGIN_EVENT_TABLE(MyChild::EventHandler, wxEvtHandler)
|
||||||
EVT_MENU(MDI_REFRESH, MyChild::EventHandler::OnRefresh)
|
EVT_MENU(MDI_REFRESH, MyChild::EventHandler::OnRefresh)
|
||||||
|
|
||||||
|
EVT_UPDATE_UI(MDI_DISABLED_FROM_CHILD, MyChild::OnUpdateUIDisable)
|
||||||
wxEND_EVENT_TABLE()
|
wxEND_EVENT_TABLE()
|
||||||
|
|
||||||
// ===========================================================================
|
// ===========================================================================
|
||||||
@@ -436,6 +440,8 @@ void MyCanvas::OnMenu(wxContextMenuEvent& event)
|
|||||||
{
|
{
|
||||||
wxMenu menu;
|
wxMenu menu;
|
||||||
menu.Append(MDI_REFRESH, "&Refresh picture");
|
menu.Append(MDI_REFRESH, "&Refresh picture");
|
||||||
|
menu.Append(MDI_DISABLED_FROM_CANVAS, "Item disabled by canvas");
|
||||||
|
menu.Append(MDI_DISABLED_FROM_CHILD, "Item disabled by child");
|
||||||
PopupMenu(&menu, ScreenToClient(event.GetPosition()));
|
PopupMenu(&menu, ScreenToClient(event.GetPosition()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -478,6 +484,9 @@ MyChild::MyChild(wxMDIParentFrame *parent)
|
|||||||
menuChild->Append(MDI_CHANGE_SIZE, "Resize frame\tCtrl-S");
|
menuChild->Append(MDI_CHANGE_SIZE, "Resize frame\tCtrl-S");
|
||||||
}
|
}
|
||||||
#if wxUSE_CLIPBOARD
|
#if wxUSE_CLIPBOARD
|
||||||
|
menuChild->AppendSeparator();
|
||||||
|
menuChild->Append(MDI_DISABLED_FROM_CANVAS, "Item not disabled by canvas");
|
||||||
|
menuChild->Append(MDI_DISABLED_FROM_CHILD, "Item disabled by child");
|
||||||
menuChild->AppendSeparator();
|
menuChild->AppendSeparator();
|
||||||
menuChild->Append(wxID_PASTE, "Copy text from clipboard\tCtrl-V");
|
menuChild->Append(wxID_PASTE, "Copy text from clipboard\tCtrl-V");
|
||||||
#endif // wxUSE_CLIPBOARD
|
#endif // wxUSE_CLIPBOARD
|
||||||
|
@@ -73,6 +73,8 @@ private:
|
|||||||
void OnMenuHighlight(wxMenuEvent& event) { LogMenuHighlight(event); }
|
void OnMenuHighlight(wxMenuEvent& event) { LogMenuHighlight(event); }
|
||||||
void OnMenuClose(wxMenuEvent& event) { LogMenuOpenClose(event, "closed"); }
|
void OnMenuClose(wxMenuEvent& event) { LogMenuOpenClose(event, "closed"); }
|
||||||
|
|
||||||
|
void OnUpdateUIDisable(wxUpdateUIEvent& event) { event.Enable(false); }
|
||||||
|
|
||||||
void OnMenu(wxContextMenuEvent& event);
|
void OnMenu(wxContextMenuEvent& event);
|
||||||
void OnEvent(wxMouseEvent& event);
|
void OnEvent(wxMouseEvent& event);
|
||||||
|
|
||||||
@@ -137,6 +139,7 @@ private:
|
|||||||
void OnMenuOpen(wxMenuEvent& event) { LogMenuOpenClose(event, "opened"); }
|
void OnMenuOpen(wxMenuEvent& event) { LogMenuOpenClose(event, "opened"); }
|
||||||
void OnMenuHighlight(wxMenuEvent& event) { LogMenuHighlight(event); }
|
void OnMenuHighlight(wxMenuEvent& event) { LogMenuHighlight(event); }
|
||||||
void OnMenuClose(wxMenuEvent& event) { LogMenuOpenClose(event, "closed"); }
|
void OnMenuClose(wxMenuEvent& event) { LogMenuOpenClose(event, "closed"); }
|
||||||
|
void OnUpdateUIDisable(wxUpdateUIEvent& event) { event.Enable(false); }
|
||||||
void OnCloseWindow(wxCloseEvent& event);
|
void OnCloseWindow(wxCloseEvent& event);
|
||||||
|
|
||||||
#if wxUSE_CLIPBOARD
|
#if wxUSE_CLIPBOARD
|
||||||
@@ -176,6 +179,8 @@ enum
|
|||||||
{
|
{
|
||||||
MDI_FULLSCREEN = 100,
|
MDI_FULLSCREEN = 100,
|
||||||
MDI_REFRESH,
|
MDI_REFRESH,
|
||||||
|
MDI_DISABLED_FROM_CANVAS,
|
||||||
|
MDI_DISABLED_FROM_CHILD,
|
||||||
MDI_CHANGE_TITLE,
|
MDI_CHANGE_TITLE,
|
||||||
MDI_CHANGE_POSITION,
|
MDI_CHANGE_POSITION,
|
||||||
MDI_CHANGE_SIZE
|
MDI_CHANGE_SIZE
|
||||||
|
@@ -410,12 +410,11 @@ void wxMDIParentFrame::DoMenuUpdates(wxMenu* menu)
|
|||||||
wxMDIChildFrame *child = GetActiveChild();
|
wxMDIChildFrame *child = GetActiveChild();
|
||||||
if ( child )
|
if ( child )
|
||||||
{
|
{
|
||||||
wxEvtHandler* source = child->GetEventHandler();
|
|
||||||
wxMenuBar* bar = child->GetMenuBar();
|
wxMenuBar* bar = child->GetMenuBar();
|
||||||
|
|
||||||
if (menu)
|
if (menu)
|
||||||
{
|
{
|
||||||
menu->UpdateUI(source);
|
menu->UpdateUI();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -423,7 +422,7 @@ void wxMDIParentFrame::DoMenuUpdates(wxMenu* menu)
|
|||||||
{
|
{
|
||||||
int nCount = bar->GetMenuCount();
|
int nCount = bar->GetMenuCount();
|
||||||
for (int n = 0; n < nCount; n++)
|
for (int n = 0; n < nCount; n++)
|
||||||
bar->GetMenu(n)->UpdateUI(source);
|
bar->GetMenu(n)->UpdateUI();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user