Applied patch [ 791573 ] New feature for FL toorbar buttons

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@25125 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2004-01-11 16:03:19 +00:00
parent 10021d29fa
commit ab839dff60
2 changed files with 85 additions and 28 deletions

View File

@@ -74,6 +74,7 @@ protected:
bool mDragStarted; bool mDragStarted;
bool mIsPressed; bool mIsPressed;
bool mIsInFocus; bool mIsInFocus;
bool mIsToggled;
bool mHasFocusedBmp; bool mHasFocusedBmp;
@@ -106,6 +107,10 @@ protected:
// Returns TRUE if the given point is in the window. // Returns TRUE if the given point is in the window.
bool IsInWindow( int x, int y ); bool IsInWindow( int x, int y );
virtual void OnIdle(wxIdleEvent& event);
// (EVT_UPDATE_UI handler)
virtual void DoButtonUpdate();
public: public:
// Constructor. // Constructor.
@@ -176,6 +181,9 @@ public:
// Enables/disables button // Enables/disables button
virtual bool Enable(bool enable); virtual bool Enable(bool enable);
// Depress button
virtual bool Toggle(bool enable);
// Responds to a left mouse button down event. // Responds to a left mouse button down event.
void OnLButtonDown( wxMouseEvent& event ); void OnLButtonDown( wxMouseEvent& event );

View File

@@ -222,13 +222,15 @@ BEGIN_EVENT_TABLE( wxNewBitmapButton, wxPanel )
EVT_ERASE_BACKGROUND( wxNewBitmapButton::OnEraseBackground ) EVT_ERASE_BACKGROUND( wxNewBitmapButton::OnEraseBackground )
EVT_IDLE(wxNewBitmapButton::OnIdle)
END_EVENT_TABLE() END_EVENT_TABLE()
wxNewBitmapButton::wxNewBitmapButton( const wxBitmap& labelBitmap, wxNewBitmapButton::wxNewBitmapButton( const wxBitmap& labelBitmap,
const wxString& labelText, const wxString& labelText,
int alignText, int alignText,
bool isFlat, bool isFlat,
int firedEventType, int firedEventType,
int marginX, int marginX,
int marginY, int marginY,
int textToLabelGap, int textToLabelGap,
@@ -249,9 +251,10 @@ wxNewBitmapButton::wxNewBitmapButton( const wxBitmap& labelBitmap,
mpFocusedImg ( NULL ), mpFocusedImg ( NULL ),
mDragStarted ( FALSE ), mDragStarted ( FALSE ),
mIsPressed ( FALSE ), mIsPressed ( FALSE ),
mIsInFocus( FALSE ), mIsInFocus ( FALSE ),
mIsToggled ( FALSE ),
mHasFocusedBmp( FALSE ), mHasFocusedBmp( FALSE ),
mFiredEventType( firedEventType ), mFiredEventType( firedEventType ),
@@ -292,9 +295,10 @@ wxNewBitmapButton::wxNewBitmapButton( const wxString& bitmapFileName,
mpDisabledImg ( NULL ), mpDisabledImg ( NULL ),
mpFocusedImg ( NULL ), mpFocusedImg ( NULL ),
mDragStarted ( FALSE ), mDragStarted ( FALSE ),
mIsPressed ( FALSE ), mIsPressed ( FALSE ),
mIsInFocus ( FALSE ), mIsInFocus ( FALSE ),
mIsToggled ( FALSE ),
mHasFocusedBmp( FALSE ), mHasFocusedBmp( FALSE ),
mFiredEventType( wxEVT_COMMAND_MENU_SELECTED ), mFiredEventType( wxEVT_COMMAND_MENU_SELECTED ),
@@ -321,11 +325,11 @@ void wxNewBitmapButton::DrawShade( int outerLevel,
{ {
wxBitmap* pBmp = GetStateLabel(); wxBitmap* pBmp = GetStateLabel();
int x = mMarginX - (outerLevel + 1); int x = mMarginX - (outerLevel + 2);
int y = mMarginY - (outerLevel + 1); int y = mMarginY - (outerLevel + 2);
int height = pBmp->GetHeight() + (outerLevel + 1)*2 - 1; int height = pBmp->GetHeight() + (outerLevel + 2)*2 - 1;
int width = pBmp->GetWidth() + (outerLevel + 1)*2 - 1; int width = pBmp->GetWidth() + (outerLevel + 2)*2 - 1;
dc.SetPen( upperLeftSidePen ); dc.SetPen( upperLeftSidePen );
dc.DrawLine( x,y, x + width, y ); dc.DrawLine( x,y, x + width, y );
@@ -410,7 +414,7 @@ void wxNewBitmapButton::RenderLabelImage( wxBitmap*& destBmp, wxBitmap* srcBmp,
{ {
destDim.x = srcBmp->GetWidth() + 2*mTextToLabelGap + txtWidth; destDim.x = srcBmp->GetWidth() + 2*mTextToLabelGap + txtWidth;
destDim.y = destDim.y =
wxMax( srcBmp->GetHeight(), txtHeight ); wxMax( srcBmp->GetHeight(), txtHeight );
txtPos.x = srcBmp->GetWidth() + mTextToLabelGap; txtPos.x = srcBmp->GetWidth() + mTextToLabelGap;
@@ -421,7 +425,7 @@ void wxNewBitmapButton::RenderLabelImage( wxBitmap*& destBmp, wxBitmap* srcBmp,
else else
if ( mTextAlignment == NB_ALIGN_TEXT_BOTTOM ) if ( mTextAlignment == NB_ALIGN_TEXT_BOTTOM )
{ {
destDim.x = destDim.x =
wxMax( srcBmp->GetWidth(), txtWidth ); wxMax( srcBmp->GetWidth(), txtWidth );
destDim.y = srcBmp->GetHeight() + mTextToLabelGap + txtHeight; destDim.y = srcBmp->GetHeight() + mTextToLabelGap + txtHeight;
@@ -431,7 +435,7 @@ void wxNewBitmapButton::RenderLabelImage( wxBitmap*& destBmp, wxBitmap* srcBmp,
imgPos.x = (destDim.x - srcBmp->GetWidth())/2; imgPos.x = (destDim.x - srcBmp->GetWidth())/2;
imgPos.y = 0; imgPos.y = 0;
} }
else else
{ {
wxFAIL_MSG(wxT("Unsupported FL alignment type detected in wxNewBitmapButton::RenderLabelImage()")); wxFAIL_MSG(wxT("Unsupported FL alignment type detected in wxNewBitmapButton::RenderLabelImage()"));
} }
@@ -466,7 +470,7 @@ void wxNewBitmapButton::RenderLabelImage( wxBitmap*& destBmp, wxBitmap* srcBmp,
if ( hasImage ) if ( hasImage )
{ {
destDc.Blit( imgPos.x, imgPos.y, destDc.Blit( imgPos.x, imgPos.y,
srcBmp->GetWidth()+1, srcBmp->GetWidth()+1,
srcBmp->GetHeight()+1, srcBmp->GetHeight()+1,
&srcDc, 0,0, wxCOPY,TRUE ); &srcDc, 0,0, wxCOPY,TRUE );
@@ -502,7 +506,7 @@ void wxNewBitmapButton::RenderLabelImage( wxBitmap*& destBmp, wxBitmap* srcBmp,
} }
if ( !isEnabled ){ if ( !isEnabled ){
#ifdef __WXMSW__ // This is currently MSW specific #ifdef __WXMSW__ // This is currently MSW specific
gray_out_image_on_dc( destDc, destDim.x, destDim.y ); gray_out_image_on_dc( destDc, destDim.x, destDim.y );
#else #else
@@ -515,18 +519,18 @@ void wxNewBitmapButton::RenderLabelImage( wxBitmap*& destBmp, wxBitmap* srcBmp,
// adjust button size to fit the new dimensions of the label // adjust button size to fit the new dimensions of the label
if ( !mSizeIsSet && 0 ) if ( !mSizeIsSet && 0 )
{ {
mSizeIsSet = TRUE; mSizeIsSet = TRUE;
SetSize( -1,-1, SetSize( -1,-1,
destBmp->GetWidth() + mMarginX*2, destBmp->GetWidth() + mMarginX*2,
destBmp->GetHeight() + mMarginY*2, 0 destBmp->GetHeight() + mMarginY*2, 0
); );
} }
destDc.SelectObject( wxNullBitmap ); destDc.SelectObject( wxNullBitmap );
#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) #if defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
// Map to system colours // Map to system colours
(void) wxToolBar::MapBitmap(destBmp->GetHBITMAP(), destBmp->GetWidth(), destBmp->GetHeight()); (void) wxToolBar::MapBitmap(destBmp->GetHBITMAP(), destBmp->GetWidth(), destBmp->GetHeight());
#endif #endif
} }
void wxNewBitmapButton::RenderAllLabelImages() void wxNewBitmapButton::RenderAllLabelImages()
@@ -541,7 +545,7 @@ void wxNewBitmapButton::RenderAllLabelImages()
RenderLabelImage( mpFocusedImg, &mFocusedBmp, TRUE, FALSE ); RenderLabelImage( mpFocusedImg, &mFocusedBmp, TRUE, FALSE );
} }
} }
void wxNewBitmapButton::RenderLabelImages() void wxNewBitmapButton::RenderLabelImages()
{ {
@@ -554,7 +558,7 @@ void wxNewBitmapButton::RenderLabelImages()
} }
else else
if ( mIsPressed ) if ( mIsPressed )
RenderLabelImage( mpPressedImg, &mDepressedBmp, TRUE, TRUE ); RenderLabelImage( mpPressedImg, &mDepressedBmp, TRUE, TRUE );
else else
@@ -571,6 +575,19 @@ void wxNewBitmapButton::RenderLabelImages()
} }
} }
bool wxNewBitmapButton::Toggle(bool enable)
{
if ( mIsToggled == enable )
{
return FALSE;
}
mIsToggled = enable;
Refresh();
return TRUE;
}
bool wxNewBitmapButton::Enable(bool enable) bool wxNewBitmapButton::Enable(bool enable)
{ {
if ( enable != m_isEnabled ) if ( enable != m_isEnabled )
@@ -596,8 +613,11 @@ void wxNewBitmapButton::DrawDecorations( wxDC& dc )
if ( mIsFlat ) if ( mIsFlat )
{ {
DrawShade( 1, dc, mGrayPen, mGrayPen ); DrawShade( 1, dc, mGrayPen, mGrayPen );
if ( mIsToggled )
if ( mIsInFocus ) {
DrawShade( 0, dc, mDarkPen, mLightPen );
}
else if ( mIsInFocus )
{ {
if ( mIsPressed ) if ( mIsPressed )
DrawShade( 0, dc, mDarkPen, mLightPen ); DrawShade( 0, dc, mDarkPen, mLightPen );
@@ -609,7 +629,7 @@ void wxNewBitmapButton::DrawDecorations( wxDC& dc )
} }
else else
{ {
if ( mIsPressed ) if ( mIsPressed || mIsToggled )
{ {
DrawShade( 0, dc, mDarkPen, mGrayPen ); DrawShade( 0, dc, mDarkPen, mGrayPen );
DrawShade( 1, dc, mBlackPen, mLightPen ); DrawShade( 1, dc, mBlackPen, mLightPen );
@@ -622,7 +642,7 @@ void wxNewBitmapButton::DrawDecorations( wxDC& dc )
} }
} }
void wxNewBitmapButton::SetLabel(const wxBitmap& labelBitmap, void wxNewBitmapButton::SetLabel(const wxBitmap& labelBitmap,
const wxString& labelText ) const wxString& labelText )
{ {
DestroyLabels(); DestroyLabels();
@@ -799,3 +819,32 @@ void wxNewBitmapButton::OnKillFocus( wxFocusEvent& WXUNUSED(event) )
wxMessageBox(wxT("kill-focus for button!")); wxMessageBox(wxT("kill-focus for button!"));
} }
// ----------------------------------------------------------------------------
// UI updates
// ----------------------------------------------------------------------------
void wxNewBitmapButton::OnIdle(wxIdleEvent& event)
{
DoButtonUpdate();
event.Skip();
}
// Do the toolbar button updates (check for EVT_UPDATE_UI handlers)
void wxNewBitmapButton::DoButtonUpdate()
{
wxUpdateUIEvent event(GetId());
event.SetEventObject(this);
if ( GetParent()->ProcessEvent(event) )
{
if ( event.GetSetEnabled() )
{
bool enabled = event.GetEnabled();
if ( enabled != IsEnabled() )
Enable( enabled );
}
if ( event.GetSetChecked() )
Toggle( event.GetChecked() );
}
}