Use kControlContentIconRef in SetBitmapLabel for wxBORDER_NONE buttons.
Factor out code to create a standard sized bitmap so it can be used in SetBitmapLabel too. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_8_BRANCH@49358 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -23,6 +23,63 @@ IMPLEMENT_DYNAMIC_CLASS(wxBitmapButton, wxButton)
|
|||||||
|
|
||||||
#include "wx/mac/uma.h"
|
#include "wx/mac/uma.h"
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
// Helper functions
|
||||||
|
|
||||||
|
static wxBitmap wxMakeStdSizeBitmap(const wxBitmap& bitmap)
|
||||||
|
{
|
||||||
|
// in Mac OS X the icon controls (which are used for borderless bitmap
|
||||||
|
// buttons) can have only one of the few standard sizes and if they
|
||||||
|
// don't, the OS rescales them automatically resulting in really ugly
|
||||||
|
// images, so centre the image in a square of standard size instead
|
||||||
|
|
||||||
|
// the supported sizes, sorted in decreasng order
|
||||||
|
static const int stdSizes[] = { 128, 48, 32, 16, 0 };
|
||||||
|
|
||||||
|
const int width = bitmap.GetWidth();
|
||||||
|
const int height = bitmap.GetHeight();
|
||||||
|
|
||||||
|
wxBitmap newBmp(bitmap);
|
||||||
|
|
||||||
|
int n;
|
||||||
|
for ( n = 0; n < (int)WXSIZEOF(stdSizes); n++ )
|
||||||
|
{
|
||||||
|
const int sizeStd = stdSizes[n];
|
||||||
|
if ( width > sizeStd || height > sizeStd )
|
||||||
|
{
|
||||||
|
// it will become -1 if the bitmap is larger than the biggest
|
||||||
|
// supported size, this is intentional
|
||||||
|
n--;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( n != -1 )
|
||||||
|
{
|
||||||
|
const int sizeStd = stdSizes[n];
|
||||||
|
if ( width != sizeStd || height != sizeStd )
|
||||||
|
{
|
||||||
|
wxASSERT_MSG( width <= sizeStd && height <= sizeStd,
|
||||||
|
_T("bitmap shouldn't be cropped") );
|
||||||
|
|
||||||
|
newBmp.Create(sizeStd, sizeStd);
|
||||||
|
wxMemoryDC dcMem;
|
||||||
|
dcMem.SelectObject(newBmp);
|
||||||
|
dcMem.Clear();
|
||||||
|
|
||||||
|
dcMem.DrawBitmap(bitmap,
|
||||||
|
(sizeStd - width)/2, (sizeStd-height)/2,
|
||||||
|
true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//else: let the system rescale the bitmap
|
||||||
|
|
||||||
|
return newBmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
bool wxBitmapButton::Create( wxWindow *parent,
|
bool wxBitmapButton::Create( wxWindow *parent,
|
||||||
wxWindowID id, const wxBitmap& bitmap,
|
wxWindowID id, const wxBitmap& bitmap,
|
||||||
const wxPoint& pos,
|
const wxPoint& pos,
|
||||||
@@ -56,54 +113,8 @@ bool wxBitmapButton::Create( wxWindow *parent,
|
|||||||
m_peer = new wxMacControl( this );
|
m_peer = new wxMacControl( this );
|
||||||
|
|
||||||
if ( bitmap.Ok() && HasFlag(wxBORDER_NONE) )
|
if ( bitmap.Ok() && HasFlag(wxBORDER_NONE) )
|
||||||
{
|
m_bmpNormal = wxMakeStdSizeBitmap(bitmap);
|
||||||
// in Mac OS X the icon controls (which are used for borderless bitmap
|
else
|
||||||
// buttons) can have only one of the few standard sizes and if they
|
|
||||||
// don't, the OS rescales them automatically resulting in really ugly
|
|
||||||
// images, so centre the image in a square of standard size instead
|
|
||||||
|
|
||||||
// the supported sizes, sorted in decreasng order
|
|
||||||
static const int stdSizes[] = { 128, 48, 32, 16, 0 };
|
|
||||||
|
|
||||||
const int width = bitmap.GetWidth();
|
|
||||||
const int height = bitmap.GetHeight();
|
|
||||||
|
|
||||||
int n;
|
|
||||||
for ( n = 0; n < (int)WXSIZEOF(stdSizes); n++ )
|
|
||||||
{
|
|
||||||
const int sizeStd = stdSizes[n];
|
|
||||||
if ( width > sizeStd || height > sizeStd )
|
|
||||||
{
|
|
||||||
// it will become -1 if the bitmap is larger than the biggest
|
|
||||||
// supported size, this is intentional
|
|
||||||
n--;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( n != -1 )
|
|
||||||
{
|
|
||||||
const int sizeStd = stdSizes[n];
|
|
||||||
if ( width != sizeStd || height != sizeStd )
|
|
||||||
{
|
|
||||||
wxASSERT_MSG( width <= sizeStd && height <= sizeStd,
|
|
||||||
_T("bitmap shouldn't be cropped") );
|
|
||||||
|
|
||||||
m_bmpNormal.Create(sizeStd, sizeStd);
|
|
||||||
wxMemoryDC dcMem;
|
|
||||||
dcMem.SelectObject(m_bmpNormal);
|
|
||||||
dcMem.Clear();
|
|
||||||
|
|
||||||
dcMem.DrawBitmap(bitmap,
|
|
||||||
(sizeStd - width)/2, (sizeStd-height)/2,
|
|
||||||
true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//else: let the system rescale the bitmap
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !m_bmpNormal.Ok() )
|
|
||||||
m_bmpNormal = bitmap;
|
m_bmpNormal = bitmap;
|
||||||
|
|
||||||
|
|
||||||
@@ -138,7 +149,11 @@ bool wxBitmapButton::Create( wxWindow *parent,
|
|||||||
|
|
||||||
void wxBitmapButton::SetBitmapLabel( const wxBitmap& bitmap )
|
void wxBitmapButton::SetBitmapLabel( const wxBitmap& bitmap )
|
||||||
{
|
{
|
||||||
m_bmpNormal = bitmap;
|
if ( HasFlag( wxBORDER_NONE ) )
|
||||||
|
m_bmpNormal = wxMakeStdSizeBitmap(bitmap);
|
||||||
|
else
|
||||||
|
m_bmpNormal = bitmap;
|
||||||
|
|
||||||
InvalidateBestSize();
|
InvalidateBestSize();
|
||||||
|
|
||||||
ControlButtonContentInfo info;
|
ControlButtonContentInfo info;
|
||||||
@@ -146,7 +161,7 @@ void wxBitmapButton::SetBitmapLabel( const wxBitmap& bitmap )
|
|||||||
#ifdef __WXMAC_OSX__
|
#ifdef __WXMAC_OSX__
|
||||||
if ( HasFlag( wxBORDER_NONE ) )
|
if ( HasFlag( wxBORDER_NONE ) )
|
||||||
{
|
{
|
||||||
wxMacCreateBitmapButton( &info, m_bmpNormal );
|
wxMacCreateBitmapButton( &info, m_bmpNormal, kControlContentIconRef );
|
||||||
if ( info.contentType != kControlNoContent )
|
if ( info.contentType != kControlNoContent )
|
||||||
m_peer->SetData( kControlIconPart, kControlIconContentTag, info );
|
m_peer->SetData( kControlIconPart, kControlIconContentTag, info );
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user