moving bitmapbutton functionality up to button for OSX

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62347 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Stefan Csomor
2009-10-09 12:24:35 +00:00
parent e77af0118e
commit b38dc31ffa
9 changed files with 108 additions and 124 deletions

View File

@@ -18,10 +18,10 @@
#include "wx/button.h"
// FIXME: right now only wxMSW and wxGTK implement bitmap support in wxButton
// FIXME: right now only wxMSW, wxGTK and wxOSX implement bitmap support in wxButton
// itself, this shouldn't be used for the other platforms neither
// when all of them do it
#if (defined(__WXMSW__) || defined(__WXGTK20__)) && !defined(__WXUNIVERSAL__)
#if (defined(__WXMSW__) || defined(__WXGTK20__) || defined(__WXOSX__)) && !defined(__WXUNIVERSAL__)
#define wxHAS_BUTTON_BITMAP
#endif

View File

@@ -40,15 +40,10 @@ public:
const wxString& name = wxButtonNameStr);
protected:
void OnEnterWindow( wxMouseEvent& event);
void OnLeaveWindow( wxMouseEvent& event);
virtual wxSize DoGetBestSize() const;
virtual void DoSetBitmap(const wxBitmap& bitmap, State which);
DECLARE_DYNAMIC_CLASS(wxBitmapButton)
DECLARE_EVENT_TABLE()
};
#endif // _WX_OSX_BMPBUTTN_H_

View File

@@ -54,13 +54,30 @@ public:
protected:
virtual wxSize DoGetBestSize() const ;
#if wxOSX_USE_COCOA
void OnEnterWindow( wxMouseEvent& event);
void OnLeaveWindow( wxMouseEvent& event);
virtual wxBitmap DoGetBitmap(State which) const;
virtual void DoSetBitmap(const wxBitmap& bitmap, State which);
virtual void DoSetBitmapPosition(wxDirection dir);
#endif // wxOSX_USE_COCOA
virtual void DoSetBitmapMargins(int x, int y)
{
m_marginX = x;
m_marginY = y;
}
// the margins around the bitmap
int m_marginX;
int m_marginY;
// the bitmaps for the different state of the buttons, all of them may be
// invalid and the button only shows a bitmap at all if State_Normal bitmap
// is valid
wxBitmap m_bitmaps[State_Max];
DECLARE_DYNAMIC_CLASS(wxButton)
DECLARE_EVENT_TABLE()
};
// OS X specific class, not part of public wx API
@@ -97,7 +114,6 @@ public:
protected:
virtual wxSize DoGetBestSize() const ;
};
#endif // _WX_OSX_BUTTON_H_

View File

@@ -588,14 +588,14 @@ public :
};
//
// common interface bitmapbuttons
// common interface for buttons
//
class wxBitmapButtonImpl
class wxButtonImpl
{
public :
wxBitmapButtonImpl(){}
virtual ~wxBitmapButtonImpl(){}
wxButtonImpl(){}
virtual ~wxButtonImpl(){}
virtual void SetPressedBitmap( const wxBitmap& bitmap ) = 0;
} ;

View File

@@ -22,10 +22,6 @@
IMPLEMENT_DYNAMIC_CLASS(wxBitmapButton, wxButton)
BEGIN_EVENT_TABLE(wxBitmapButton, wxButton)
EVT_ENTER_WINDOW(wxBitmapButton::OnEnterWindow)
EVT_LEAVE_WINDOW(wxBitmapButton::OnLeaveWindow)
END_EVENT_TABLE()
#include "wx/osx/private.h"
@@ -66,23 +62,6 @@ bool wxBitmapButton::Create( wxWindow *parent,
return true;
}
void wxBitmapButton::DoSetBitmap(const wxBitmap& bitmap, State which)
{
wxBitmapButtonBase::DoSetBitmap(bitmap, which);
// we don't support any other states currently
if ( which == State_Normal )
{
m_peer->SetBitmap( bitmap );
}
else if ( which == State_Pressed )
{
wxBitmapButtonImpl* bi = dynamic_cast<wxBitmapButtonImpl*> (m_peer);
if ( bi )
bi->SetPressedBitmap(bitmap);
}
}
wxSize wxBitmapButton::DoGetBestSize() const
{
wxSize best(m_marginX, m_marginY);
@@ -97,16 +76,4 @@ wxSize wxBitmapButton::DoGetBestSize() const
return best;
}
void wxBitmapButton::OnEnterWindow( wxMouseEvent& WXUNUSED(event))
{
if ( DoGetBitmap( State_Current ).IsOk() )
m_peer->SetBitmap( DoGetBitmap( State_Current ) );
}
void wxBitmapButton::OnLeaveWindow( wxMouseEvent& WXUNUSED(event))
{
if ( DoGetBitmap( State_Current ).IsOk() )
m_peer->SetBitmap( DoGetBitmap( State_Normal ) );
}
#endif // wxUSE_BMPBUTTON

View File

@@ -25,6 +25,11 @@
IMPLEMENT_DYNAMIC_CLASS(wxButton, wxControl)
BEGIN_EVENT_TABLE(wxButton, wxControl)
EVT_ENTER_WINDOW(wxButton::OnEnterWindow)
EVT_LEAVE_WINDOW(wxButton::OnLeaveWindow)
END_EVENT_TABLE()
bool wxButton::Create(wxWindow *parent,
wxWindowID id,
const wxString& lbl,
@@ -34,6 +39,9 @@ bool wxButton::Create(wxWindow *parent,
const wxValidator& validator,
const wxString& name)
{
m_marginX =
m_marginY = 0;
// FIXME: this hack is needed because we're called from
// wxBitmapButton::Create() with this style and we currently use a
// different wxWidgetImpl method (CreateBitmapButton() rather than
@@ -79,19 +87,23 @@ void wxButton::SetLabel(const wxString& label)
wxButtonBase::SetLabel(label);
}
// there is no support for button bitmaps in wxOSX/Carbon so there is no need
// for these methods there
#if wxOSX_USE_COCOA
wxBitmap wxButton::DoGetBitmap(State which) const
{
return which == State_Normal ? m_peer->GetBitmap() : wxBitmap();
return m_bitmaps[which];
}
void wxButton::DoSetBitmap(const wxBitmap& bitmap, State which)
{
m_bitmaps[which] = bitmap;
if ( which == State_Normal )
m_peer->SetBitmap(bitmap);
else if ( which == State_Pressed )
{
wxButtonImpl* bi = dynamic_cast<wxButtonImpl*> (m_peer);
if ( bi )
bi->SetPressedBitmap(bitmap);
}
}
void wxButton::DoSetBitmapPosition(wxDirection dir)
@@ -99,8 +111,6 @@ void wxButton::DoSetBitmapPosition(wxDirection dir)
m_peer->SetBitmapPosition(dir);
}
#endif // wxOSX_USE_COCOA
wxWindow *wxButton::SetDefault()
{
wxWindow *btnOldDefault = wxButtonBase::SetDefault();
@@ -121,6 +131,18 @@ void wxButton::Command (wxCommandEvent & WXUNUSED(event))
// ProcessCommand(event);
}
void wxButton::OnEnterWindow( wxMouseEvent& WXUNUSED(event))
{
if ( DoGetBitmap( State_Current ).IsOk() )
m_peer->SetBitmap( DoGetBitmap( State_Current ) );
}
void wxButton::OnLeaveWindow( wxMouseEvent& WXUNUSED(event))
{
if ( DoGetBitmap( State_Current ).IsOk() )
m_peer->SetBitmap( DoGetBitmap( State_Normal ) );
}
bool wxButton::OSXHandleClicked( double WXUNUSED(timestampsec) )
{
wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, m_windowId);

View File

@@ -27,7 +27,7 @@ namespace
// define a derived class to override SetBitmap() and also to provide
// InitButtonContentInfo() helper used by CreateBitmapButton()
class wxMacBitmapButton : public wxMacControl, public wxBitmapButtonImpl
class wxMacBitmapButton : public wxMacControl, public wxButtonImpl
{
public:
wxMacBitmapButton(wxWindowMac* peer, const wxBitmap& bitmap, int style)

View File

@@ -9,69 +9,4 @@
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#include "wx/wxprec.h"
#if wxUSE_BMPBUTTON
#include "wx/bmpbuttn.h"
#include "wx/image.h"
#ifndef WX_PRECOMP
#include "wx/dcmemory.h"
#endif
#include "wx/osx/private.h"
class wxBitmapButtonCocoaImpl : public wxWidgetCocoaImpl, public wxBitmapButtonImpl
{
public :
wxBitmapButtonCocoaImpl( wxWindowMac* peer , WXWidget w) : wxWidgetCocoaImpl(peer,w)
{
}
void SetPressedBitmap( const wxBitmap& bitmap )
{
wxNSButton* button = (wxNSButton*) m_osxView;
[button setAlternateImage: bitmap.GetNSImage()];
[button setButtonType:NSMomentaryChangeButton];
}
} ;
wxWidgetImplType* wxWidgetImpl::CreateBitmapButton( wxWindowMac* wxpeer,
wxWindowMac* WXUNUSED(parent),
wxWindowID WXUNUSED(id),
const wxBitmap& bitmap,
const wxPoint& pos,
const wxSize& size,
long style,
long WXUNUSED(extraStyle))
{
NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
wxNSButton* v = [[wxNSButton alloc] initWithFrame:r];
// trying to get as close as possible to flags
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())
[v setImage:bitmap.GetNSImage() ];
[v setButtonType:NSMomentaryPushInButton];
wxWidgetCocoaImpl* c = new wxBitmapButtonCocoaImpl( wxpeer, v );
return c;
}
#endif
// everything is done in button.mm now

View File

@@ -97,7 +97,7 @@ wxSize wxButton::GetDefaultSize()
namespace
{
class wxButtonCocoaImpl : public wxWidgetCocoaImpl
class wxButtonCocoaImpl : public wxWidgetCocoaImpl, public wxButtonImpl
{
public:
wxButtonCocoaImpl(wxWindowMac *wxpeer, wxNSButton *v)
@@ -107,12 +107,20 @@ public:
virtual void SetBitmap(const wxBitmap& bitmap)
{
[GetNSButton() setBezelStyle:bitmap.IsOk() ? NSRegularSquareBezelStyle
: NSRoundedBezelStyle];
// switch bezel style for plain pushbuttons
if ( bitmap.IsOk() && [GetNSButton() bezelStyle] == NSRoundedBezelStyle )
[GetNSButton() setBezelStyle:NSRegularSquareBezelStyle ];
wxWidgetCocoaImpl::SetBitmap(bitmap);
}
void SetPressedBitmap( const wxBitmap& bitmap )
{
NSButton* button = GetNSButton();
[button setAlternateImage: bitmap.GetNSImage()];
[button setButtonType:NSMomentaryChangeButton];
}
private:
NSButton *GetNSButton() const
{
@@ -163,6 +171,47 @@ void wxWidgetCocoaImpl::PerformClick()
[(NSControl*)m_osxView performClick:nil];
}
#if wxUSE_BMPBUTTON
wxWidgetImplType* wxWidgetImpl::CreateBitmapButton( wxWindowMac* wxpeer,
wxWindowMac* WXUNUSED(parent),
wxWindowID WXUNUSED(id),
const wxBitmap& bitmap,
const wxPoint& pos,
const wxSize& size,
long style,
long WXUNUSED(extraStyle))
{
NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
wxNSButton* v = [[wxNSButton alloc] initWithFrame:r];
// trying to get as close as possible to flags
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())
[v setImage:bitmap.GetNSImage() ];
[v setButtonType:NSMomentaryPushInButton];
wxWidgetCocoaImpl* c = new wxButtonCocoaImpl( wxpeer, v );
return c;
}
#endif
//
// wxDisclosureButton implementation
//