Make hack for button creation in wxOSX more robust.
Don't crash when creating a plain wxButton with wxBU_NOTEXT style. This happened because we skipped creating the peer (real implementation) in this case entirely on the assumption that we were creating a wxBitmapButton, but this is not necessarily the case. So now test that the creation of the peer is really disabled before skipping it (this required adding ShouldCreatePeer() accessor). Merging wxWidgetImpl::CreateButton() and CreateBitmapButton() (and the same thing for toggle buttons) would still be a better solution but while it's trivial to do for Cocoa, it isn't for Carbon. And we can't use a single function for Cocoa but different functions for Carbon, so for now just continue to use this hack. Closes #13622. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72896 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -259,7 +259,10 @@ public:
|
|||||||
// optimization to avoid creating a user pane in wxWindow::Create if we already know
|
// optimization to avoid creating a user pane in wxWindow::Create if we already know
|
||||||
// we will replace it with our own peer
|
// we will replace it with our own peer
|
||||||
void DontCreatePeer();
|
void DontCreatePeer();
|
||||||
|
|
||||||
|
// return true unless DontCreatePeer() had been called
|
||||||
|
bool ShouldCreatePeer() const;
|
||||||
|
|
||||||
// sets the native implementation wrapper, can replace an existing peer, use peer = NULL to
|
// sets the native implementation wrapper, can replace an existing peer, use peer = NULL to
|
||||||
// release existing peer
|
// release existing peer
|
||||||
void SetPeer(wxOSXWidgetImpl* peer);
|
void SetPeer(wxOSXWidgetImpl* peer);
|
||||||
|
@@ -51,23 +51,23 @@ bool wxButton::Create(wxWindow *parent,
|
|||||||
const wxValidator& validator,
|
const wxValidator& validator,
|
||||||
const wxString& name)
|
const wxString& name)
|
||||||
{
|
{
|
||||||
DontCreatePeer();
|
|
||||||
|
|
||||||
m_marginX =
|
|
||||||
m_marginY = 0;
|
|
||||||
|
|
||||||
// FIXME: this hack is needed because we're called from
|
// FIXME: this hack is needed because we're called from
|
||||||
// wxBitmapButton::Create() with this style and we currently use a
|
// wxBitmapButton::Create() with this style and we currently use a
|
||||||
// different wxWidgetImpl method (CreateBitmapButton() rather than
|
// different wxWidgetImpl method (CreateBitmapButton() rather than
|
||||||
// CreateButton()) for creating bitmap buttons, but we really ought
|
// CreateButton()) for creating bitmap buttons, but we really ought
|
||||||
// to unify the creation of buttons of all kinds and then remove
|
// to unify the creation of buttons of all kinds and then remove
|
||||||
// this check
|
// this check
|
||||||
if ( style & wxBU_NOTEXT )
|
if ( style & wxBU_NOTEXT && !ShouldCreatePeer() )
|
||||||
{
|
{
|
||||||
return wxControl::Create(parent, id, pos, size, style,
|
return wxControl::Create(parent, id, pos, size, style,
|
||||||
validator, name);
|
validator, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DontCreatePeer();
|
||||||
|
|
||||||
|
m_marginX =
|
||||||
|
m_marginY = 0;
|
||||||
|
|
||||||
wxString label;
|
wxString label;
|
||||||
|
|
||||||
// Ignore the standard label for help buttons if possible, they use "?"
|
// Ignore the standard label for help buttons if possible, they use "?"
|
||||||
|
@@ -301,6 +301,11 @@ wxOSXWidgetImpl* wxWindowMac::GetPeer() const
|
|||||||
return m_peer == kOSXNoWidgetImpl ? NULL : m_peer ;
|
return m_peer == kOSXNoWidgetImpl ? NULL : m_peer ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool wxWindowMac::ShouldCreatePeer() const
|
||||||
|
{
|
||||||
|
return m_peer != kOSXNoWidgetImpl;
|
||||||
|
}
|
||||||
|
|
||||||
void wxWindowMac::DontCreatePeer()
|
void wxWindowMac::DontCreatePeer()
|
||||||
{
|
{
|
||||||
m_peer = kOSXNoWidgetImpl;
|
m_peer = kOSXNoWidgetImpl;
|
||||||
|
Reference in New Issue
Block a user