Applied [ 516382 ] FL toolbar patch
This patch addresses following issues on FL dynamic toolbar: * Removes duplicate code in wxNewBitmapButton::RenderLabelImage(). (The code between line 452-500 and 502-550 is the same.) * Adds wxNewBitmapButton::Enable() own method to proper drawing of enabled/disabled buttons. * Changes "focused" state (of wxNewBitmapButton) implementation from EVT_MOTION to EVT_ENTER/LEAVE_WINDOW pair, because capturing mouse in EVT_MOTION handler blocks some key events (control characters, function keys), so underlynig app doesn't receive all key events when mouse pointer is above toolbar button. Also "prev" state member variables are removed by this patch (and IMHO they should be removed regardles on accepting this patch - they are initalized and used only in wxNewBitmapButton::OnMouseMove() method). (Note: Blocking some keys can be only MSW problem, but I can't verify it.) * Adds EVT_LEFT_DCLICK handler to wxNewBitmapButton - without this handler, toolbar button loses second clicks if user presses left mouse button "fast enough". Unfortunately, it doesn't handle drawing of pressed/released button - it's only one event in contrast to EVT_LEFT_UP/DOWN. * Enables tooltips (in proper wxDynamicToolBar::AddTool() method). git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14467 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -70,8 +70,6 @@ protected:
|
|||||||
bool mDragStarted;
|
bool mDragStarted;
|
||||||
bool mIsPressed;
|
bool mIsPressed;
|
||||||
bool mIsInFocus;
|
bool mIsInFocus;
|
||||||
bool mPrevPressedState;
|
|
||||||
bool mPrevInFocusState;
|
|
||||||
|
|
||||||
bool mHasFocusedBmp;
|
bool mHasFocusedBmp;
|
||||||
|
|
||||||
@@ -166,14 +164,23 @@ public:
|
|||||||
// Renders label images.
|
// Renders label images.
|
||||||
virtual void RenderAllLabelImages();
|
virtual void RenderAllLabelImages();
|
||||||
|
|
||||||
|
// Enables/disables button
|
||||||
|
virtual bool Enable(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 );
|
||||||
|
|
||||||
// Responds to a left mouse button up event.
|
// Responds to a left mouse button up event.
|
||||||
void OnLButtonUp( wxMouseEvent& event );
|
void OnLButtonUp( wxMouseEvent& event );
|
||||||
|
|
||||||
// Responds to a mouse move event.
|
// Responds to a left mouse button double click.
|
||||||
void OnMouseMove( wxMouseEvent& event );
|
void OnLButtonDClick( wxMouseEvent& event );
|
||||||
|
|
||||||
|
// Responds to mouse enter to window.
|
||||||
|
void OnMouseEnter( wxMouseEvent& event );
|
||||||
|
|
||||||
|
// Responds to mouse leave from window.
|
||||||
|
void OnMouseLeave( wxMouseEvent& event );
|
||||||
|
|
||||||
// Responds to a size event.
|
// Responds to a size event.
|
||||||
void OnSize( wxSizeEvent& event );
|
void OnSize( wxSizeEvent& event );
|
||||||
|
@@ -185,6 +185,10 @@ wxToolBarToolBase*
|
|||||||
|
|
||||||
pBmpBtn->Reshape();
|
pBmpBtn->Reshape();
|
||||||
|
|
||||||
|
#if wxUSE_TOOLTIPS
|
||||||
|
pBmpBtn->SetToolTip( helpString1 );
|
||||||
|
#endif // wxUSE_TOOLTIPS
|
||||||
|
|
||||||
AddTool( toolIndex, pBmpBtn );
|
AddTool( toolIndex, pBmpBtn );
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@@ -204,9 +204,11 @@ IMPLEMENT_DYNAMIC_CLASS(wxNewBitmapButton, wxPanel)
|
|||||||
|
|
||||||
BEGIN_EVENT_TABLE( wxNewBitmapButton, wxPanel )
|
BEGIN_EVENT_TABLE( wxNewBitmapButton, wxPanel )
|
||||||
|
|
||||||
EVT_LEFT_DOWN( wxNewBitmapButton::OnLButtonDown )
|
EVT_LEFT_DOWN ( wxNewBitmapButton::OnLButtonDown )
|
||||||
EVT_LEFT_UP ( wxNewBitmapButton::OnLButtonUp )
|
EVT_LEFT_UP ( wxNewBitmapButton::OnLButtonUp )
|
||||||
EVT_MOTION ( wxNewBitmapButton::OnMouseMove )
|
EVT_LEFT_DCLICK ( wxNewBitmapButton::OnLButtonDClick )
|
||||||
|
EVT_ENTER_WINDOW( wxNewBitmapButton::OnMouseEnter )
|
||||||
|
EVT_LEAVE_WINDOW( wxNewBitmapButton::OnMouseLeave )
|
||||||
|
|
||||||
EVT_SIZE ( wxNewBitmapButton::OnSize )
|
EVT_SIZE ( wxNewBitmapButton::OnSize )
|
||||||
EVT_PAINT( wxNewBitmapButton::OnPaint )
|
EVT_PAINT( wxNewBitmapButton::OnPaint )
|
||||||
@@ -245,8 +247,6 @@ wxNewBitmapButton::wxNewBitmapButton( const wxBitmap& labelBitmap,
|
|||||||
mDragStarted ( FALSE ),
|
mDragStarted ( FALSE ),
|
||||||
mIsPressed ( FALSE ),
|
mIsPressed ( FALSE ),
|
||||||
mIsInFocus( FALSE ),
|
mIsInFocus( FALSE ),
|
||||||
mPrevPressedState( FALSE ),
|
|
||||||
mPrevInFocusState( FALSE ),
|
|
||||||
mHasFocusedBmp( FALSE ),
|
mHasFocusedBmp( FALSE ),
|
||||||
mFiredEventType( firedEventType ),
|
mFiredEventType( firedEventType ),
|
||||||
|
|
||||||
@@ -290,8 +290,6 @@ wxNewBitmapButton::wxNewBitmapButton( const wxString& bitmapFileName,
|
|||||||
mDragStarted ( FALSE ),
|
mDragStarted ( FALSE ),
|
||||||
mIsPressed ( FALSE ),
|
mIsPressed ( FALSE ),
|
||||||
mIsInFocus ( FALSE ),
|
mIsInFocus ( FALSE ),
|
||||||
mPrevPressedState( FALSE ),
|
|
||||||
mPrevInFocusState( FALSE ),
|
|
||||||
mHasFocusedBmp( FALSE ),
|
mHasFocusedBmp( FALSE ),
|
||||||
mFiredEventType( wxEVT_COMMAND_MENU_SELECTED ),
|
mFiredEventType( wxEVT_COMMAND_MENU_SELECTED ),
|
||||||
|
|
||||||
@@ -449,56 +447,6 @@ void wxNewBitmapButton::RenderLabelImage( wxBitmap*& destBmp, wxBitmap* srcBmp,
|
|||||||
wxBrush grayBrush( wxSystemSettings::GetColour( wxSYS_COLOUR_3DFACE), wxSOLID );
|
wxBrush grayBrush( wxSystemSettings::GetColour( wxSYS_COLOUR_3DFACE), wxSOLID );
|
||||||
wxPen nullPen( wxColour(0,0,0), 1, wxTRANSPARENT );
|
wxPen nullPen( wxColour(0,0,0), 1, wxTRANSPARENT );
|
||||||
|
|
||||||
destDc.SetBrush( grayBrush );
|
|
||||||
destDc.SetPen( nullPen );
|
|
||||||
|
|
||||||
destDc.DrawRectangle( 0,0, destDim.x+1, destDim.y+1 );
|
|
||||||
|
|
||||||
if ( isPressed )
|
|
||||||
{
|
|
||||||
++imgPos.x; ++imgPos.y;
|
|
||||||
++txtPos.x; ++txtPos.y;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( hasImage )
|
|
||||||
{
|
|
||||||
|
|
||||||
destDc.Blit( imgPos.x, imgPos.y,
|
|
||||||
srcBmp->GetWidth()+1,
|
|
||||||
srcBmp->GetHeight()+1,
|
|
||||||
&srcDc, 0,0, wxCOPY,TRUE );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( hasText )
|
|
||||||
{
|
|
||||||
wxWindow* pTopWnd = this;
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
wxWindow* pParent = pTopWnd->GetParent();
|
|
||||||
|
|
||||||
if ( pParent == 0 )
|
|
||||||
break;
|
|
||||||
|
|
||||||
pTopWnd = pParent;
|
|
||||||
} while (1);
|
|
||||||
|
|
||||||
destDc.SetFont( wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT) );
|
|
||||||
|
|
||||||
if ( isEnabled )
|
|
||||||
{
|
|
||||||
destDc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_BTNTEXT) );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
destDc.SetTextForeground( wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW) );
|
|
||||||
}
|
|
||||||
destDc.SetTextBackground( wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE) );
|
|
||||||
|
|
||||||
destDc.DrawText( mLabelText, txtPos.x, txtPos.y );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
destDc.SetBrush( grayBrush );
|
destDc.SetBrush( grayBrush );
|
||||||
destDc.SetPen( nullPen );
|
destDc.SetPen( nullPen );
|
||||||
|
|
||||||
@@ -611,6 +559,26 @@ void wxNewBitmapButton::RenderLabelImages()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool wxNewBitmapButton::Enable(bool enable)
|
||||||
|
{
|
||||||
|
if ( enable != m_isEnabled )
|
||||||
|
{
|
||||||
|
if ( mIsInFocus )
|
||||||
|
{
|
||||||
|
mIsInFocus = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( mIsPressed )
|
||||||
|
{
|
||||||
|
mIsPressed = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
return wxPanel::Enable( enable );
|
||||||
|
}
|
||||||
|
|
||||||
void wxNewBitmapButton::DrawDecorations( wxDC& dc )
|
void wxNewBitmapButton::DrawDecorations( wxDC& dc )
|
||||||
{
|
{
|
||||||
if ( mIsFlat )
|
if ( mIsFlat )
|
||||||
@@ -674,13 +642,9 @@ void wxNewBitmapButton::SetAlignments( int alignText,
|
|||||||
|
|
||||||
void wxNewBitmapButton::OnLButtonDown( wxMouseEvent& event )
|
void wxNewBitmapButton::OnLButtonDown( wxMouseEvent& event )
|
||||||
{
|
{
|
||||||
mPrevPressedState = FALSE;
|
|
||||||
mDragStarted = TRUE;
|
mDragStarted = TRUE;
|
||||||
mIsPressed = TRUE;
|
mIsPressed = TRUE;
|
||||||
Refresh();
|
Refresh();
|
||||||
|
|
||||||
if ( !mIsInFocus )
|
|
||||||
CaptureMouse();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxNewBitmapButton::OnLButtonUp( wxMouseEvent& event )
|
void wxNewBitmapButton::OnLButtonUp( wxMouseEvent& event )
|
||||||
@@ -690,11 +654,8 @@ void wxNewBitmapButton::OnLButtonUp( wxMouseEvent& event )
|
|||||||
|
|
||||||
mDragStarted = FALSE;
|
mDragStarted = FALSE;
|
||||||
mIsPressed = FALSE;
|
mIsPressed = FALSE;
|
||||||
mIsInFocus = FALSE;
|
|
||||||
Refresh();
|
Refresh();
|
||||||
|
|
||||||
ReleaseMouse();
|
|
||||||
|
|
||||||
if ( IsInWindow( event.m_x, event.m_y ) )
|
if ( IsInWindow( event.m_x, event.m_y ) )
|
||||||
{
|
{
|
||||||
// fire event, if mouse was released
|
// fire event, if mouse was released
|
||||||
@@ -704,6 +665,21 @@ void wxNewBitmapButton::OnLButtonUp( wxMouseEvent& event )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxNewBitmapButton::OnLButtonDClick( wxMouseEvent& event )
|
||||||
|
{
|
||||||
|
if ( IsInWindow( event.m_x, event.m_y ) )
|
||||||
|
{
|
||||||
|
// fire event, if mouse was released
|
||||||
|
// within the bounds of button
|
||||||
|
wxCommandEvent cmd( mFiredEventType, GetId() );
|
||||||
|
GetParent()->ProcessEvent( cmd );
|
||||||
|
|
||||||
|
mDragStarted = FALSE;
|
||||||
|
mIsPressed = FALSE;
|
||||||
|
Refresh();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool wxNewBitmapButton::IsInWindow( int x, int y )
|
bool wxNewBitmapButton::IsInWindow( int x, int y )
|
||||||
{
|
{
|
||||||
int width, height;
|
int width, height;
|
||||||
@@ -714,37 +690,30 @@ bool wxNewBitmapButton::IsInWindow( int x, int y )
|
|||||||
y < height );
|
y < height );
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxNewBitmapButton::OnMouseMove( wxMouseEvent& event )
|
void wxNewBitmapButton::OnMouseEnter( wxMouseEvent& event )
|
||||||
{
|
{
|
||||||
mPrevPressedState=mIsPressed;
|
bool prevIsInFocus = mIsInFocus;
|
||||||
mPrevInFocusState=mIsInFocus;
|
|
||||||
if ( !mIsInFocus && IsInWindow( event.m_x, event.m_y ) )
|
|
||||||
{
|
|
||||||
if ( !mDragStarted )
|
|
||||||
CaptureMouse();
|
|
||||||
|
|
||||||
|
if ( !mIsInFocus )
|
||||||
|
{
|
||||||
mIsInFocus = TRUE;
|
mIsInFocus = TRUE;
|
||||||
}
|
}
|
||||||
else
|
if ( prevIsInFocus != mIsInFocus )
|
||||||
if ( mIsInFocus && !IsInWindow( event.m_x, event.m_y ) )
|
{
|
||||||
|
Refresh();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxNewBitmapButton::OnMouseLeave( wxMouseEvent& event )
|
||||||
|
{
|
||||||
|
bool prevIsInFocus = mIsInFocus;
|
||||||
|
bool prevIsPressed = mIsPressed;
|
||||||
|
if ( mIsInFocus )
|
||||||
{
|
{
|
||||||
mIsInFocus = FALSE;
|
mIsInFocus = FALSE;
|
||||||
|
|
||||||
if ( !mDragStarted )
|
|
||||||
ReleaseMouse();
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( mDragStarted )
|
|
||||||
{
|
|
||||||
if ( IsInWindow( event.m_x, event.m_y ) )
|
|
||||||
|
|
||||||
mIsPressed = TRUE;
|
|
||||||
else
|
|
||||||
mIsPressed = FALSE;
|
mIsPressed = FALSE;
|
||||||
}
|
}
|
||||||
|
if ( prevIsInFocus != mIsInFocus || prevIsPressed != mIsPressed )
|
||||||
if ((mIsPressed != mPrevPressedState) ||
|
|
||||||
(mIsInFocus!=mPrevInFocusState))
|
|
||||||
{
|
{
|
||||||
Refresh();
|
Refresh();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user