Files
wxWidgets/src/qt/anybutton.cpp
Vadim Zeitlin 4e5d2d97e2 Allow using wxBitmapBundle for wxButton bitmaps
Take wxBitmapBundle in wxButton::SetBitmapLabel() and related functions
in order to be able to associate several bitmaps to be used in different
resolutions with the button, instead of just a single bitmap.
2021-10-18 11:50:10 +02:00

179 lines
4.2 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Name: src/qt/anybutton.cpp
// Author: Mariano Reingart
// Copyright: (c) 2014 wxWidgets dev team
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef wxHAS_ANY_BUTTON
#ifndef WX_PRECOMP
#include "wx/anybutton.h"
#endif
#include <QtWidgets/QPushButton>
#include "wx/bitmap.h"
#include "wx/qt/private/utils.h"
#include "wx/qt/private/winevent.h"
class wxQtPushButton : public wxQtEventSignalHandler< QPushButton, wxAnyButton >
{
public:
wxQtPushButton( wxWindow *parent, wxAnyButton *handler);
private:
virtual bool event(QEvent* e) wxOVERRIDE;
void action(); // press, release
void clicked(bool);
};
wxQtPushButton::wxQtPushButton(wxWindow *parent, wxAnyButton *handler)
: wxQtEventSignalHandler< QPushButton, wxAnyButton >( parent, handler )
{
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 checked)
{
wxAnyButton *handler = GetHandler();
if ( handler )
{
wxCommandEvent event( handler->QtGetEventType(), handler->GetId() );
if ( isCheckable() ) // toggle buttons
{
event.SetInt(checked);
}
EmitEvent( event );
}
}
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();
break;
default:
break;
}
return QPushButton::event(e);
}
wxAnyButton::wxAnyButton() :
m_qtPushButton(NULL)
{
}
void wxAnyButton::QtCreate(wxWindow *parent)
{
// create the basic push button (used in button and bmp button)
m_qtPushButton = new wxQtPushButton(parent, this);
m_qtPushButton->setAutoDefault(false);
}
void wxAnyButton::QtSetBitmap( const wxBitmapBundle &bitmapBundle )
{
wxCHECK_RET(m_qtPushButton, "Invalid button.");
if ( !bitmapBundle.IsOk() )
return;
wxBitmap bitmap = bitmapBundle.GetBitmap(bitmapBundle.GetDefaultSize()*GetDPIScaleFactor());
// load the bitmap and resize the button:
QPixmap *pixmap = bitmap.GetHandle();
if ( pixmap != NULL )
{
m_qtPushButton->setIcon(QIcon(*pixmap));
m_qtPushButton->setIconSize(pixmap->rect().size());
InvalidateBestSize();
}
}
void wxAnyButton::SetLabel( const wxString &label )
{
m_qtPushButton->setText( wxQtConvertString( label ));
}
QWidget *wxAnyButton::GetHandle() const
{
return m_qtPushButton;
}
wxBitmap wxAnyButton::DoGetBitmap(State state) const
{
return state < State_Max ? m_bitmaps[state].GetBitmap(wxDefaultSize) : wxNullBitmap;
}
void wxAnyButton::DoSetBitmap(const wxBitmapBundle& bitmap, State 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() )
{
QtUpdateState();
}
}
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 wxBitmapBundle& bmp = m_bitmaps[state];
QtSetBitmap(bmp.IsOk() ? bmp : m_bitmaps[State_Normal]);
}
#endif // wxHAS_ANY_BUTTON