No real change, just make bezel setting code in wxOSX more clear.

Avoid code duplication between SetAcceleratorFromLabel() and
wxWidgetImpl::CreateButton(), generalize the former to handle the special
cases taken into account only in the latter previously.

Also use a switch on border flags instead of series of nested ifs as this
seems to be more clear.

No changes in behaviour.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72884 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2012-11-04 23:50:05 +00:00
parent d6e9e15066
commit 04a6d8efe8
2 changed files with 69 additions and 72 deletions

View File

@@ -215,34 +215,71 @@ void wxButton::OSXSetAcceleratorFromLabel(const wxString& label)
impl->SetAcceleratorFromLabel(label); impl->SetAcceleratorFromLabel(label);
} }
extern "C" void SetBezelStyleFromBorderFlags(NSButton *v, long style); // Set bezel style depending on the wxBORDER_XXX flags specified by the style
// and also accounting for the label (bezels are different for multiline
// set bezel style depending on the wxBORDER_XXX flags specified by the style // buttons and normal ones) and the ID (special bezel is used for help button).
void SetBezelStyleFromBorderFlags(NSButton *v, long style) //
// This is extern because it's also used in src/osx/cocoa/tglbtn.mm.
extern "C"
void
SetBezelStyleFromBorderFlags(NSButton *v,
long style,
wxWindowID winid,
const wxString& label = wxString())
{ {
if ( style & wxBORDER_NONE ) // We can't display a custom label inside a button with help bezel style so
// we only use it if we are using the default label. wxButton itself checks
// if the label is just "Help" in which case it discards it and passes us
// an empty string.
if ( winid == wxID_HELP && label.empty() )
{ {
[v setBezelStyle:NSShadowlessSquareBezelStyle]; [v setBezelStyle:NSHelpButtonBezelStyle];
[v setBordered:NO];
} }
else // we do have a border else
{ {
// see trac #11128 for a thorough discussion // We can't use rounded bezel styles for multiline buttons as they are
if ( (style & wxBORDER_MASK) == wxBORDER_RAISED ) // only meant to be used at certain sizes, so the style used depends on
[v setBezelStyle:NSRegularSquareBezelStyle]; // whether the label is single or multi line.
else if ( (style & wxBORDER_MASK) == wxBORDER_SUNKEN ) const bool isSingleLine = label.find_first_of("\n\r") == wxString::npos;
[v setBezelStyle:NSSmallSquareBezelStyle];
else if ( (style & wxBORDER_MASK) == wxBORDER_SIMPLE ) NSBezelStyle bezel;
[v setBezelStyle:NSShadowlessSquareBezelStyle]; switch ( style & wxBORDER_MASK )
else {
[v setBezelStyle:NSRegularSquareBezelStyle]; case wxBORDER_NONE:
bezel = NSShadowlessSquareBezelStyle;
[v setBordered:NO];
break;
case wxBORDER_SIMPLE:
bezel = NSShadowlessSquareBezelStyle;
break;
case wxBORDER_SUNKEN:
bezel = isSingleLine ? NSTexturedRoundedBezelStyle
: NSSmallSquareBezelStyle;
break;
default:
wxFAIL_MSG( "Unknown border style" );
// fall through
case 0:
case wxBORDER_STATIC:
case wxBORDER_RAISED:
case wxBORDER_THEME:
bezel = isSingleLine ? NSRoundedBezelStyle
: NSRegularSquareBezelStyle;
break;
}
[v setBezelStyle:bezel];
} }
} }
wxWidgetImplType* wxWidgetImpl::CreateButton( wxWindowMac* wxpeer, wxWidgetImplType* wxWidgetImpl::CreateButton( wxWindowMac* wxpeer,
wxWindowMac* WXUNUSED(parent), wxWindowMac* WXUNUSED(parent),
wxWindowID id, wxWindowID winid,
const wxString& label, const wxString& label,
const wxPoint& pos, const wxPoint& pos,
const wxSize& size, const wxSize& size,
@@ -252,50 +289,7 @@ wxWidgetImplType* wxWidgetImpl::CreateButton( wxWindowMac* wxpeer,
NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ; NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
wxNSButton* v = [[wxNSButton alloc] initWithFrame:r]; wxNSButton* v = [[wxNSButton alloc] initWithFrame:r];
// We can't display a custom label inside a button with help bezel style so SetBezelStyleFromBorderFlags(v, style, winid, label);
// we only use it if we are using the default label. wxButton itself checks
// if the label is just "Help" in which case it discards it and passes us
// an empty string.
if ( id == wxID_HELP && label.empty() )
{
[v setBezelStyle:NSHelpButtonBezelStyle];
}
else
{
if ( style & wxBORDER_NONE )
{
[v setBezelStyle:NSShadowlessSquareBezelStyle];
[v setBordered:NO];
}
else
{
// the following styles only exist for certain sizes, so avoid them for
// multi-line
if ( label.Find('\n' ) == wxNOT_FOUND && label.Find('\r' ) == wxNOT_FOUND)
{
if ( (style & wxBORDER_MASK) == wxBORDER_RAISED )
[v setBezelStyle:NSRoundedBezelStyle];
else if ( (style & wxBORDER_MASK) == wxBORDER_SUNKEN )
[v setBezelStyle:NSTexturedRoundedBezelStyle];
else if ( (style & wxBORDER_MASK) == wxBORDER_SIMPLE )
[v setBezelStyle:NSShadowlessSquareBezelStyle];
else
[v setBezelStyle:NSRoundedBezelStyle];
}
else
{
if ( (style & wxBORDER_MASK) == wxBORDER_RAISED )
[v setBezelStyle:NSRegularSquareBezelStyle];
else if ( (style & wxBORDER_MASK) == wxBORDER_SUNKEN )
[v setBezelStyle:NSSmallSquareBezelStyle];
else if ( (style & wxBORDER_MASK) == wxBORDER_SIMPLE )
[v setBezelStyle:NSShadowlessSquareBezelStyle];
else
[v setBezelStyle:NSRegularSquareBezelStyle];
}
}
}
[v setButtonType:NSMomentaryPushInButton]; [v setButtonType:NSMomentaryPushInButton];
wxButtonCocoaImpl* const impl = new wxButtonCocoaImpl( wxpeer, v ); wxButtonCocoaImpl* const impl = new wxButtonCocoaImpl( wxpeer, v );
@@ -327,7 +321,7 @@ void wxWidgetCocoaImpl::PerformClick()
wxWidgetImplType* wxWidgetImpl::CreateBitmapButton( wxWindowMac* wxpeer, wxWidgetImplType* wxWidgetImpl::CreateBitmapButton( wxWindowMac* wxpeer,
wxWindowMac* WXUNUSED(parent), wxWindowMac* WXUNUSED(parent),
wxWindowID WXUNUSED(id), wxWindowID winid,
const wxBitmap& bitmap, const wxBitmap& bitmap,
const wxPoint& pos, const wxPoint& pos,
const wxSize& size, const wxSize& size,
@@ -337,7 +331,7 @@ wxWidgetImplType* wxWidgetImpl::CreateBitmapButton( wxWindowMac* wxpeer,
NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ; NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
wxNSButton* v = [[wxNSButton alloc] initWithFrame:r]; wxNSButton* v = [[wxNSButton alloc] initWithFrame:r];
SetBezelStyleFromBorderFlags(v, style); SetBezelStyleFromBorderFlags(v, style, winid);
if (bitmap.IsOk()) if (bitmap.IsOk())
[v setImage:bitmap.GetNSImage() ]; [v setImage:bitmap.GetNSImage() ];
@@ -484,7 +478,7 @@ public :
wxWidgetImplType* wxWidgetImpl::CreateDisclosureTriangle( wxWindowMac* wxpeer, wxWidgetImplType* wxWidgetImpl::CreateDisclosureTriangle( wxWindowMac* wxpeer,
wxWindowMac* WXUNUSED(parent), wxWindowMac* WXUNUSED(parent),
wxWindowID WXUNUSED(winid), wxWindowID winid,
const wxString& label, const wxString& label,
const wxPoint& pos, const wxPoint& pos,
const wxSize& size, const wxSize& size,
@@ -496,7 +490,7 @@ wxWidgetImplType* wxWidgetImpl::CreateDisclosureTriangle( wxWindowMac* wxpeer,
if ( !label.empty() ) if ( !label.empty() )
[v setTitle:wxCFStringRef(label).AsNSString()]; [v setTitle:wxCFStringRef(label).AsNSString()];
SetBezelStyleFromBorderFlags(v, style); SetBezelStyleFromBorderFlags(v, style, winid, label);
return new wxDisclosureTriangleCocoaImpl( wxpeer, v ); return new wxDisclosureTriangleCocoaImpl( wxpeer, v );
} }

View File

@@ -27,12 +27,15 @@
// from button.mm // from button.mm
extern "C" void SetBezelStyleFromBorderFlags(NSButton *v, long style); extern "C" void SetBezelStyleFromBorderFlags(NSButton *v,
long style,
wxWindowID winid = wxID_ANY,
const wxString& label = wxString());
wxWidgetImplType* wxWidgetImpl::CreateToggleButton( wxWindowMac* wxpeer, wxWidgetImplType* wxWidgetImpl::CreateToggleButton( wxWindowMac* wxpeer,
wxWindowMac* WXUNUSED(parent), wxWindowMac* WXUNUSED(parent),
wxWindowID WXUNUSED(id), wxWindowID winid,
const wxString& WXUNUSED(label), const wxString& label,
const wxPoint& pos, const wxPoint& pos,
const wxSize& size, const wxSize& size,
long style, long style,
@@ -41,7 +44,7 @@ wxWidgetImplType* wxWidgetImpl::CreateToggleButton( wxWindowMac* wxpeer,
NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ; NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
wxNSButton* v = [[wxNSButton alloc] initWithFrame:r]; wxNSButton* v = [[wxNSButton alloc] initWithFrame:r];
SetBezelStyleFromBorderFlags(v, style); SetBezelStyleFromBorderFlags(v, style, winid, label);
[v setButtonType:NSOnOffButton]; [v setButtonType:NSOnOffButton];
wxWidgetCocoaImpl* c = new wxButtonCocoaImpl( wxpeer, v ); wxWidgetCocoaImpl* c = new wxButtonCocoaImpl( wxpeer, v );
@@ -50,7 +53,7 @@ wxWidgetImplType* wxWidgetImpl::CreateToggleButton( wxWindowMac* wxpeer,
wxWidgetImplType* wxWidgetImpl::CreateBitmapToggleButton( wxWindowMac* wxpeer, wxWidgetImplType* wxWidgetImpl::CreateBitmapToggleButton( wxWindowMac* wxpeer,
wxWindowMac* WXUNUSED(parent), wxWindowMac* WXUNUSED(parent),
wxWindowID WXUNUSED(id), wxWindowID winid,
const wxBitmap& label, const wxBitmap& label,
const wxPoint& pos, const wxPoint& pos,
const wxSize& size, const wxSize& size,
@@ -60,7 +63,7 @@ wxWidgetImplType* wxWidgetImpl::CreateBitmapToggleButton( wxWindowMac* wxpeer,
NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ; NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
wxNSButton* v = [[wxNSButton alloc] initWithFrame:r]; wxNSButton* v = [[wxNSButton alloc] initWithFrame:r];
SetBezelStyleFromBorderFlags(v, style); SetBezelStyleFromBorderFlags(v, style, winid);
if (label.IsOk()) if (label.IsOk())
[v setImage:label.GetNSImage() ]; [v setImage:label.GetNSImage() ];