Improve wxCollapsiblePane appearance under OS X.

By default, don't use border in wxDisclosureTriangle because the native
applications do not. However do honour wxBORDER_XXX style if specified in case
this becomes useful in the future (this required no effort as the code was
already there for bitmap buttons and just had to be extracted into a reusable
function).

Don't expand the disclosure triangle in wxCollapsiblePane sizer, as this
resulted in the text being centered instead of remaining left-aligned.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62431 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2009-10-16 16:25:43 +00:00
parent 3d35ec88d9
commit 73b1b99623
3 changed files with 45 additions and 38 deletions

View File

@@ -89,7 +89,7 @@ public:
const wxString& label = wxEmptyString, const wxString& label = wxEmptyString,
const wxPoint& pos = wxDefaultPosition, const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize, const wxSize& size = wxDefaultSize,
long style = 0, long style = wxBORDER_NONE,
const wxValidator& validator = wxDefaultValidator, const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxButtonNameStr) const wxString& name = wxButtonNameStr)
{ {
@@ -101,7 +101,7 @@ public:
const wxString& label = wxEmptyString, const wxString& label = wxEmptyString,
const wxPoint& pos = wxDefaultPosition, const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize, const wxSize& size = wxDefaultSize,
long style = 0, long style = wxBORDER_NONE,
const wxValidator& validator = wxDefaultValidator, const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxButtonNameStr); const wxString& name = wxButtonNameStr);

View File

@@ -87,22 +87,22 @@ bool wxGenericCollapsiblePane::Create(wxWindow *parent,
m_strLabel = label; m_strLabel = label;
#if defined( __WXMAC__ ) && !defined(__WXUNIVERSAL__) // sizer containing the expand button and possibly a static line
// on Mac we use the disclosure triangle
m_pStaticLine = NULL;
m_pButton = new wxDisclosureTriangle(this, wxID_ANY, GetBtnLabel(),
wxDefaultPosition, wxDefaultSize,
style & wxBORDER_MASK);
m_sz = new wxBoxSizer(wxHORIZONTAL); m_sz = new wxBoxSizer(wxHORIZONTAL);
m_sz->Add(m_pButton, wxSizerFlags(1).Expand());
#if defined( __WXMAC__ ) && !defined(__WXUNIVERSAL__)
// on Mac we use the special disclosure triangle button
m_pStaticLine = NULL;
m_pButton = new wxDisclosureTriangle(this, wxID_ANY, GetBtnLabel());
m_sz->Add(m_pButton);
#else #else
// create children and lay them out using a wxBoxSizer // create children and lay them out using a wxBoxSizer
// (so that we automatically get RTL features) // (so that we automatically get RTL features)
m_pButton = new wxButton(this, wxID_ANY, GetBtnLabel(), wxPoint(0, 0), m_pButton = new wxButton(this, wxID_ANY, GetBtnLabel(), wxPoint(0, 0),
wxDefaultSize, wxBU_EXACTFIT); wxDefaultSize, wxBU_EXACTFIT);
m_pStaticLine = new wxStaticLine(this, wxID_ANY); m_pStaticLine = new wxStaticLine(this, wxID_ANY);
// on other platforms we put the static line and the button horizontally // on other platforms we put the static line and the button horizontally
m_sz = new wxBoxSizer(wxHORIZONTAL);
m_sz->Add(m_pButton, 0, wxLEFT|wxTOP|wxBOTTOM, GetBorder()); m_sz->Add(m_pButton, 0, wxLEFT|wxTOP|wxBOTTOM, GetBorder());
m_sz->Add(m_pStaticLine, 1, wxALIGN_CENTER|wxLEFT|wxRIGHT, GetBorder()); m_sz->Add(m_pStaticLine, 1, wxALIGN_CENTER|wxLEFT|wxRIGHT, GetBorder());
#endif #endif

View File

@@ -130,6 +130,26 @@ private:
} }
}; };
// set bezel style depending on the wxBORDER_XXX flags specified by the style
void SetBezelStyleFromBorderFlags(NSButton *v, long style)
{
if ( style & wxBORDER_NONE )
{
[v setBezelStyle:NSShadowlessSquareBezelStyle];
[v setBordered:NO];
}
else // we do have a border
{
// see trac #11128 for a thorough discussion
if ( (style & wxBORDER_MASK) == wxBORDER_RAISED )
[v setBezelStyle:NSRegularSquareBezelStyle];
else if ( (style & wxBORDER_MASK) == wxBORDER_SUNKEN )
[v setBezelStyle:NSSmallSquareBezelStyle];
else
[v setBezelStyle:NSShadowlessSquareBezelStyle];
}
}
} // anonymous namespace } // anonymous namespace
wxWidgetImplType* wxWidgetImpl::CreateButton( wxWindowMac* wxpeer, wxWidgetImplType* wxWidgetImpl::CreateButton( wxWindowMac* wxpeer,
@@ -185,22 +205,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];
// trying to get as close as possible to flags SetBezelStyleFromBorderFlags(v, style);
if ( style & wxBORDER_NONE )
{
[v setBezelStyle:NSShadowlessSquareBezelStyle];
[v setBordered:NO];
}
else
{
// see trac #11128 for a thorough discussion
if ( (style & wxBORDER_MASK) == wxBORDER_RAISED )
[v setBezelStyle:NSRegularSquareBezelStyle];
else if ( (style & wxBORDER_MASK) == wxBORDER_SUNKEN )
[v setBezelStyle:NSSmallSquareBezelStyle];
else
[v setBezelStyle:NSShadowlessSquareBezelStyle];
}
if (bitmap.Ok()) if (bitmap.Ok())
[v setImage:bitmap.GetNSImage() ]; [v setImage:bitmap.GetNSImage() ];
@@ -210,7 +215,7 @@ wxWidgetImplType* wxWidgetImpl::CreateBitmapButton( wxWindowMac* wxpeer,
return c; return c;
} }
#endif #endif // wxUSE_BMPBUTTON
// //
// wxDisclosureButton implementation // wxDisclosureButton implementation
@@ -262,7 +267,6 @@ static const char * disc_triangle_xpm[] = {
- (id) initWithFrame:(NSRect) frame - (id) initWithFrame:(NSRect) frame
{ {
self = [super initWithFrame:frame]; self = [super initWithFrame:frame];
[self setBezelStyle:NSSmallSquareBezelStyle];
isOpen = NO; isOpen = NO;
[self setImagePosition:NSImageLeft]; [self setImagePosition:NSImageLeft];
[self updateImage]; [self updateImage];
@@ -348,16 +352,19 @@ public :
wxWidgetImplType* wxWidgetImpl::CreateDisclosureTriangle( wxWindowMac* wxpeer, wxWidgetImplType* wxWidgetImpl::CreateDisclosureTriangle( wxWindowMac* wxpeer,
wxWindowMac* WXUNUSED(parent), wxWindowMac* WXUNUSED(parent),
wxWindowID WXUNUSED(id), wxWindowID WXUNUSED(winid),
const wxString& label, const wxString& label,
const wxPoint& pos, const wxPoint& pos,
const wxSize& size, const wxSize& size,
long WXUNUSED(style), long style,
long WXUNUSED(extraStyle)) long WXUNUSED(extraStyle))
{ {
NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ; NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
wxDisclosureNSButton* v = [[wxDisclosureNSButton alloc] initWithFrame:r]; wxDisclosureNSButton* v = [[wxDisclosureNSButton alloc] initWithFrame:r];
[v setTitle:wxCFStringRef( label).AsNSString()]; if ( !label.empty() )
wxDisclosureTriangleCocoaImpl* c = new wxDisclosureTriangleCocoaImpl( wxpeer, v ); [v setTitle:wxCFStringRef(label).AsNSString()];
return c;
SetBezelStyleFromBorderFlags(v, style);
return new wxDisclosureTriangleCocoaImpl( wxpeer, v );
} }