Implement image support for button states in wxQt
Closes https://github.com/wxWidgets/wxWidgets/pull/1224
This commit is contained in:
committed by
Vadim Zeitlin
parent
9a9ff29098
commit
fb00507fb5
@@ -27,6 +27,9 @@ public:
|
|||||||
|
|
||||||
virtual QWidget *GetHandle() const;
|
virtual QWidget *GetHandle() const;
|
||||||
|
|
||||||
|
// implementation only
|
||||||
|
void QtUpdateState();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual wxBitmap DoGetBitmap(State state) const wxOVERRIDE;
|
virtual wxBitmap DoGetBitmap(State state) const wxOVERRIDE;
|
||||||
virtual void DoSetBitmap(const wxBitmap& bitmap, State which) wxOVERRIDE;
|
virtual void DoSetBitmap(const wxBitmap& bitmap, State which) wxOVERRIDE;
|
||||||
@@ -37,8 +40,10 @@ protected:
|
|||||||
void QtSetBitmap( const wxBitmap &bitmap );
|
void QtSetBitmap( const wxBitmap &bitmap );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
State QtGetCurrentState() const;
|
||||||
|
|
||||||
typedef wxAnyButtonBase base_type;
|
typedef wxAnyButtonBase base_type;
|
||||||
wxBitmap m_bitmap;
|
wxBitmap m_bitmaps[State_Max];
|
||||||
|
|
||||||
wxDECLARE_NO_COPY_CLASS(wxAnyButton);
|
wxDECLARE_NO_COPY_CLASS(wxAnyButton);
|
||||||
};
|
};
|
||||||
|
@@ -27,6 +27,8 @@ public:
|
|||||||
wxQtPushButton( wxWindow *parent, wxAnyButton *handler);
|
wxQtPushButton( wxWindow *parent, wxAnyButton *handler);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
virtual bool event(QEvent* e) wxOVERRIDE;
|
||||||
|
void action(); // press, release
|
||||||
void clicked(bool);
|
void clicked(bool);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -34,6 +36,8 @@ wxQtPushButton::wxQtPushButton(wxWindow *parent, wxAnyButton *handler)
|
|||||||
: wxQtEventSignalHandler< QPushButton, wxAnyButton >( parent, handler )
|
: wxQtEventSignalHandler< QPushButton, wxAnyButton >( parent, handler )
|
||||||
{
|
{
|
||||||
connect(this, &QPushButton::clicked, this, &wxQtPushButton::clicked);
|
connect(this, &QPushButton::clicked, this, &wxQtPushButton::clicked);
|
||||||
|
connect(this, &QPushButton::pressed, this, &wxQtPushButton::action);
|
||||||
|
connect(this, &QPushButton::released, this, &wxQtPushButton::action);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxQtPushButton::clicked( bool WXUNUSED(checked) )
|
void wxQtPushButton::clicked( bool WXUNUSED(checked) )
|
||||||
@@ -46,6 +50,26 @@ void wxQtPushButton::clicked( bool WXUNUSED(checked) )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxQtPushButton::action()
|
||||||
|
{
|
||||||
|
GetHandler()->QtUpdateState();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxQtPushButton::event(QEvent* e)
|
||||||
|
{
|
||||||
|
switch ( e->type() )
|
||||||
|
{
|
||||||
|
case QEvent::EnabledChange:
|
||||||
|
case QEvent::Enter:
|
||||||
|
case QEvent::Leave:
|
||||||
|
case QEvent::FocusIn:
|
||||||
|
case QEvent::FocusOut:
|
||||||
|
GetHandler()->QtUpdateState();
|
||||||
|
}
|
||||||
|
|
||||||
|
return QPushButton::event(e);
|
||||||
|
}
|
||||||
|
|
||||||
wxAnyButton::wxAnyButton() :
|
wxAnyButton::wxAnyButton() :
|
||||||
m_qtPushButton(NULL)
|
m_qtPushButton(NULL)
|
||||||
{
|
{
|
||||||
@@ -60,15 +84,17 @@ void wxAnyButton::QtCreate(wxWindow *parent)
|
|||||||
|
|
||||||
void wxAnyButton::QtSetBitmap( const wxBitmap &bitmap )
|
void wxAnyButton::QtSetBitmap( const wxBitmap &bitmap )
|
||||||
{
|
{
|
||||||
|
wxCHECK_RET(m_qtPushButton, "Invalid button.");
|
||||||
|
|
||||||
// load the bitmap and resize the button:
|
// load the bitmap and resize the button:
|
||||||
QPixmap *pixmap = bitmap.GetHandle();
|
QPixmap *pixmap = bitmap.GetHandle();
|
||||||
if ( pixmap != NULL )
|
if ( pixmap != NULL )
|
||||||
{
|
{
|
||||||
m_qtPushButton->setIcon(QIcon(*pixmap));
|
m_qtPushButton->setIcon(QIcon(*pixmap));
|
||||||
m_qtPushButton->setIconSize(pixmap->rect().size());
|
m_qtPushButton->setIconSize(pixmap->rect().size());
|
||||||
}
|
|
||||||
|
|
||||||
m_bitmap = bitmap;
|
InvalidateBestSize();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxAnyButton::SetLabel( const wxString &label )
|
void wxAnyButton::SetLabel( const wxString &label )
|
||||||
@@ -83,38 +109,57 @@ QWidget *wxAnyButton::GetHandle() const
|
|||||||
|
|
||||||
wxBitmap wxAnyButton::DoGetBitmap(State state) const
|
wxBitmap wxAnyButton::DoGetBitmap(State state) const
|
||||||
{
|
{
|
||||||
return state == State_Normal ? m_bitmap : wxNullBitmap;
|
return state < State_Max ? m_bitmaps[state] : wxNullBitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxAnyButton::DoSetBitmap(const wxBitmap& bitmap, State which)
|
void wxAnyButton::DoSetBitmap(const wxBitmap& bitmap, State which)
|
||||||
{
|
{
|
||||||
switch ( which )
|
wxCHECK_RET(which < State_Max, "Invalid state");
|
||||||
|
|
||||||
|
// Cache the bitmap.
|
||||||
|
m_bitmaps[which] = bitmap;
|
||||||
|
|
||||||
|
// Replace current bitmap only if the button is in the same state.
|
||||||
|
if ( which == QtGetCurrentState() )
|
||||||
{
|
{
|
||||||
case State_Normal:
|
QtUpdateState();
|
||||||
QtSetBitmap(bitmap);
|
|
||||||
InvalidateBestSize();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case State_Pressed:
|
|
||||||
wxMISSING_IMPLEMENTATION( wxSTRINGIZE( State_Pressed ));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case State_Current:
|
|
||||||
wxMISSING_IMPLEMENTATION( wxSTRINGIZE( State_Current ));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case State_Focused:
|
|
||||||
wxMISSING_IMPLEMENTATION( wxSTRINGIZE( State_Focused ));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case State_Disabled:
|
|
||||||
wxMISSING_IMPLEMENTATION( wxSTRINGIZE( State_Disabled ));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case State_Max:
|
|
||||||
wxMISSING_IMPLEMENTATION( wxSTRINGIZE( State_Max ));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxAnyButton::State wxAnyButton::QtGetCurrentState() const
|
||||||
|
{
|
||||||
|
wxCHECK_MSG(m_qtPushButton, State_Normal, "Invalid button.");
|
||||||
|
|
||||||
|
if ( !m_qtPushButton->isEnabled() )
|
||||||
|
{
|
||||||
|
return State_Disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( m_qtPushButton->isChecked() || m_qtPushButton->isDown() )
|
||||||
|
{
|
||||||
|
return State_Pressed;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( HasCapture() || m_qtPushButton->hasMouseTracking() || m_qtPushButton->underMouse() )
|
||||||
|
{
|
||||||
|
return State_Current;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( m_qtPushButton->hasFocus() )
|
||||||
|
{
|
||||||
|
return State_Focused;
|
||||||
|
}
|
||||||
|
|
||||||
|
return State_Normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxAnyButton::QtUpdateState()
|
||||||
|
{
|
||||||
|
State state = QtGetCurrentState();
|
||||||
|
|
||||||
|
// Update the bitmap
|
||||||
|
const wxBitmap& bmp = m_bitmaps[state];
|
||||||
|
QtSetBitmap(bmp.IsOk() ? bmp : m_bitmaps[State_Normal]);
|
||||||
|
}
|
||||||
|
|
||||||
#endif // wxHAS_ANY_BUTTON
|
#endif // wxHAS_ANY_BUTTON
|
||||||
|
Reference in New Issue
Block a user