Fix crash in ribbon sample
m_mutable_button_bar was used on multiple pages. When one of those pages is deleted, the pointer becomes invalid. Use the ButtonBar associated with the event instead. Closes #22459. Closes #22464.
This commit is contained in:
committed by
Vadim Zeitlin
parent
385acccebb
commit
b646f9d58e
@@ -178,7 +178,6 @@ protected:
|
|||||||
bool m_bChecked;
|
bool m_bChecked;
|
||||||
wxString m_new_text;
|
wxString m_new_text;
|
||||||
|
|
||||||
wxRibbonButtonBar* m_mutable_button_bar;
|
|
||||||
bool m_plus_minus_state;
|
bool m_plus_minus_state;
|
||||||
bool m_change_label_state;
|
bool m_change_label_state;
|
||||||
|
|
||||||
@@ -444,12 +443,12 @@ MyFrame::MyFrame()
|
|||||||
bar->AddButton(ID_SHOW_PAGES, "Show Pages", ribbon_xpm);
|
bar->AddButton(ID_SHOW_PAGES, "Show Pages", ribbon_xpm);
|
||||||
|
|
||||||
panel = new wxRibbonPanel(page, wxID_ANY, "Button bar manipulation", ribbon_xpm);
|
panel = new wxRibbonPanel(page, wxID_ANY, "Button bar manipulation", ribbon_xpm);
|
||||||
m_mutable_button_bar = new wxRibbonButtonBar(panel, wxID_ANY);
|
wxRibbonButtonBar* button_bar = new wxRibbonButtonBar(panel, wxID_ANY);
|
||||||
m_mutable_button_bar->AddButton(ID_PLUS_MINUS, "+/-",
|
button_bar->AddButton(ID_PLUS_MINUS, "+/-",
|
||||||
wxArtProvider::GetBitmap(wxART_PLUS, wxART_OTHER, wxSize(24, 24)));
|
wxArtProvider::GetBitmap(wxART_PLUS, wxART_OTHER, wxSize(24, 24)));
|
||||||
m_plus_minus_state = false;
|
m_plus_minus_state = false;
|
||||||
m_mutable_button_bar->AddButton(ID_CHANGE_LABEL, "short", ribbon_xpm);
|
button_bar->AddButton(ID_CHANGE_LABEL, "short", ribbon_xpm);
|
||||||
m_mutable_button_bar->SetButtonTextMinWidth(ID_CHANGE_LABEL, "some long text");
|
button_bar->SetButtonTextMinWidth(ID_CHANGE_LABEL, "some long text");
|
||||||
m_change_label_state = false;
|
m_change_label_state = false;
|
||||||
|
|
||||||
panel = new wxRibbonPanel(page, wxID_ANY, "Always medium buttons", ribbon_xpm);
|
panel = new wxRibbonPanel(page, wxID_ANY, "Always medium buttons", ribbon_xpm);
|
||||||
@@ -471,12 +470,12 @@ MyFrame::MyFrame()
|
|||||||
{
|
{
|
||||||
wxRibbonPage* page = new wxRibbonPage(m_ribbon, wxID_ANY, "Advanced", empty_xpm);
|
wxRibbonPage* page = new wxRibbonPage(m_ribbon, wxID_ANY, "Advanced", empty_xpm);
|
||||||
wxRibbonPanel* panel = new wxRibbonPanel(page, wxID_ANY, "Button bar manipulation", ribbon_xpm);
|
wxRibbonPanel* panel = new wxRibbonPanel(page, wxID_ANY, "Button bar manipulation", ribbon_xpm);
|
||||||
m_mutable_button_bar = new wxRibbonButtonBar(panel, wxID_ANY);
|
wxRibbonButtonBar* button_bar = new wxRibbonButtonBar(panel, wxID_ANY);
|
||||||
m_mutable_button_bar->AddButton(ID_PLUS_MINUS, "+/-",
|
button_bar->AddButton(ID_PLUS_MINUS, "+/-",
|
||||||
wxArtProvider::GetBitmap(wxART_PLUS, wxART_OTHER, wxSize(24, 24)));
|
wxArtProvider::GetBitmap(wxART_PLUS, wxART_OTHER, wxSize(24, 24)));
|
||||||
m_plus_minus_state = false;
|
m_plus_minus_state = false;
|
||||||
m_mutable_button_bar->AddButton(ID_CHANGE_LABEL, "short", ribbon_xpm);
|
button_bar->AddButton(ID_CHANGE_LABEL, "short", ribbon_xpm);
|
||||||
m_mutable_button_bar->SetButtonTextMinWidth(ID_CHANGE_LABEL, "some long text");
|
button_bar->SetButtonTextMinWidth(ID_CHANGE_LABEL, "some long text");
|
||||||
m_change_label_state = false;
|
m_change_label_state = false;
|
||||||
|
|
||||||
panel = new wxRibbonPanel(page, wxID_ANY, "Always medium buttons", ribbon_xpm);
|
panel = new wxRibbonPanel(page, wxID_ANY, "Always medium buttons", ribbon_xpm);
|
||||||
@@ -1109,32 +1108,32 @@ void MyFrame::OnShowPages(wxRibbonButtonBarEvent& WXUNUSED(evt))
|
|||||||
m_ribbon->Realize();
|
m_ribbon->Realize();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyFrame::OnPlusMinus(wxRibbonButtonBarEvent& WXUNUSED(evt))
|
void MyFrame::OnPlusMinus(wxRibbonButtonBarEvent& evt)
|
||||||
{
|
{
|
||||||
if(m_plus_minus_state)
|
if(m_plus_minus_state)
|
||||||
{
|
{
|
||||||
m_mutable_button_bar->SetButtonIcon(ID_PLUS_MINUS,
|
evt.GetBar()->SetButtonIcon(ID_PLUS_MINUS,
|
||||||
wxArtProvider::GetBitmap(wxART_PLUS, wxART_OTHER, wxSize(24, 24)));
|
wxArtProvider::GetBitmap(wxART_PLUS, wxART_OTHER, wxSize(24, 24)));
|
||||||
m_plus_minus_state = false;
|
m_plus_minus_state = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_mutable_button_bar->SetButtonIcon(ID_PLUS_MINUS,
|
evt.GetBar()->SetButtonIcon(ID_PLUS_MINUS,
|
||||||
wxArtProvider::GetBitmap(wxART_MINUS, wxART_OTHER, wxSize(24, 24)));
|
wxArtProvider::GetBitmap(wxART_MINUS, wxART_OTHER, wxSize(24, 24)));
|
||||||
m_plus_minus_state = true;
|
m_plus_minus_state = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyFrame::OnChangeLabel(wxRibbonButtonBarEvent& WXUNUSED(evt))
|
void MyFrame::OnChangeLabel(wxRibbonButtonBarEvent& evt)
|
||||||
{
|
{
|
||||||
if(m_change_label_state)
|
if(m_change_label_state)
|
||||||
{
|
{
|
||||||
m_mutable_button_bar->SetButtonText(ID_CHANGE_LABEL, "short");
|
evt.GetBar()->SetButtonText(ID_CHANGE_LABEL, "short");
|
||||||
m_change_label_state = false;
|
m_change_label_state = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_mutable_button_bar->SetButtonText(ID_CHANGE_LABEL, "some long text");
|
evt.GetBar()->SetButtonText(ID_CHANGE_LABEL, "some long text");
|
||||||
m_change_label_state = true;
|
m_change_label_state = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user