123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322 |
- #include "qtmaterialfab.h"
- #include "qtmaterialfab_p.h"
- #include <QtWidgets/QGraphicsDropShadowEffect>
- #include <QState>
- #include <QEvent>
- #include <QPainter>
- #include "lib/qtmaterialrippleoverlay.h"
- /*!
- * \class QtMaterialFloatingActionButtonPrivate
- * \internal
- */
- /*!
- * \internal
- */
- QtMaterialFloatingActionButtonPrivate::QtMaterialFloatingActionButtonPrivate(QtMaterialFloatingActionButton *q)
- : QtMaterialRaisedButtonPrivate(q)
- {
- }
- /*!
- * \internal
- */
- QtMaterialFloatingActionButtonPrivate::~QtMaterialFloatingActionButtonPrivate()
- {
- }
- /*!
- * \internal
- */
- void QtMaterialFloatingActionButtonPrivate::init()
- {
- Q_Q(QtMaterialFloatingActionButton);
- corner = Qt::BottomRightCorner;
- mini = false;
- offsX = 34;
- offsY = 36;
- q->setRole(Material::Primary);
- q->setFixedSize(DefaultDiameter, DefaultDiameter);
- q->setGeometry(fabGeometry());
- setupProperties();
- if (q->parentWidget()) {
- q->parentWidget()->installEventFilter(q);
- }
- q->setFixedRippleRadius(50);
- }
- /*!
- * \internal
- */
- QRect QtMaterialFloatingActionButtonPrivate::fabGeometry() const
- {
- Q_Q(const QtMaterialFloatingActionButton);
- QWidget *parent = q->parentWidget();
- if (!parent) {
- return QRect();
- }
- const int s = mini ? MiniDiameter : DefaultDiameter;
- switch (corner)
- {
- case Qt::TopLeftCorner:
- return QRect(offsX, offsY, s, s);
- case Qt::TopRightCorner:
- return QRect(parent->width()-(offsX+s), offsY, s, s);
- case Qt::BottomLeftCorner:
- return QRect(offsX, parent->height()-(offsY+s), s, s);
- case Qt::BottomRightCorner:
- default:
- break;
- }
- return QRect(parent->width()-(offsX+s), parent->height()-(offsY+s), s, s);
- }
- /*!
- * \internal
- */
- void QtMaterialFloatingActionButtonPrivate::setupProperties()
- {
- if (mini) {
- effect->setColor(QColor(0, 0, 0, 80));
- normalState->assignProperty(effect, "offset", QPointF(0, 3));
- normalState->assignProperty(effect, "blurRadius", 13);
- pressedState->assignProperty(effect, "offset", QPointF(0, 7));
- pressedState->assignProperty(effect, "blurRadius", 20);
- } else {
- effect->setColor(QColor(0, 0, 0, 105));
- normalState->assignProperty(effect, "offset", QPointF(0, 6));
- normalState->assignProperty(effect, "blurRadius", 16);
- pressedState->assignProperty(effect, "offset", QPointF(0, 11));
- pressedState->assignProperty(effect, "blurRadius", 28);
- }
- }
- /*!
- * \class QtMaterialFloatingActionButton
- */
- QtMaterialFloatingActionButton::QtMaterialFloatingActionButton(const QIcon &icon, QWidget *parent)
- : QtMaterialRaisedButton(*new QtMaterialFloatingActionButtonPrivate(this), parent)
- {
- d_func()->init();
- setIcon(icon);
- }
- QtMaterialFloatingActionButton::~QtMaterialFloatingActionButton()
- {
- }
- /*!
- * \reimp
- */
- QSize QtMaterialFloatingActionButton::sizeHint() const
- {
- Q_D(const QtMaterialFloatingActionButton);
- if (d->mini) {
- return QSize(QtMaterialFloatingActionButtonPrivate::MiniDiameter,
- QtMaterialFloatingActionButtonPrivate::MiniDiameter);
- } else {
- return QSize(QtMaterialFloatingActionButtonPrivate::DefaultDiameter,
- QtMaterialFloatingActionButtonPrivate::DefaultDiameter);
- }
- }
- void QtMaterialFloatingActionButton::setMini(bool state)
- {
- Q_D(QtMaterialFloatingActionButton);
- if (d->mini == state) {
- return;
- }
- d->mini = state;
- setFixedSize(d->diameter(), d->diameter());
- setFixedRippleRadius(state ? 30 : 50);
- d->setupProperties();
- updateClipPath();
- setGeometry(d->fabGeometry());
- update();
- }
- bool QtMaterialFloatingActionButton::isMini() const
- {
- Q_D(const QtMaterialFloatingActionButton);
- return d->mini;
- }
- void QtMaterialFloatingActionButton::setCorner(Qt::Corner corner)
- {
- Q_D(QtMaterialFloatingActionButton);
- if (d->corner == corner) {
- return;
- }
- d->corner = corner;
- setGeometry(d->fabGeometry());
- update();
- }
- Qt::Corner QtMaterialFloatingActionButton::corner() const
- {
- Q_D(const QtMaterialFloatingActionButton);
- return d->corner;
- }
- void QtMaterialFloatingActionButton::setOffset(int x, int y)
- {
- Q_D(QtMaterialFloatingActionButton);
- d->offsX = x;
- d->offsY = y;
- setGeometry(d->fabGeometry());
- update();
- }
- QSize QtMaterialFloatingActionButton::offset() const
- {
- Q_D(const QtMaterialFloatingActionButton);
- return QSize(d->offsX, d->offsY);
- }
- void QtMaterialFloatingActionButton::setXOffset(int x)
- {
- Q_D(QtMaterialFloatingActionButton);
- d->offsX = x;
- setGeometry(d->fabGeometry());
- update();
- }
- int QtMaterialFloatingActionButton::xOffset() const
- {
- Q_D(const QtMaterialFloatingActionButton);
- return d->offsX;
- }
- void QtMaterialFloatingActionButton::setYOffset(int y)
- {
- Q_D(QtMaterialFloatingActionButton);
- d->offsY = y;
- setGeometry(d->fabGeometry());
- update();
- }
- int QtMaterialFloatingActionButton::yOffset() const
- {
- Q_D(const QtMaterialFloatingActionButton);
- return d->offsY;
- }
- /*!
- * \reimp
- */
- bool QtMaterialFloatingActionButton::event(QEvent *event)
- {
- Q_D(QtMaterialFloatingActionButton);
- if (!parent()) {
- return QtMaterialRaisedButton::event(event);
- }
- switch (event->type())
- {
- case QEvent::ParentChange:
- {
- parent()->installEventFilter(this);
- setGeometry(d->fabGeometry());
- break;
- }
- case QEvent::ParentAboutToChange:
- {
- parent()->removeEventFilter(this);
- break;
- }
- default:
- break;
- }
- return QtMaterialRaisedButton::event(event);
- }
- /*!
- * \reimp
- */
- bool QtMaterialFloatingActionButton::eventFilter(QObject *obj, QEvent *event)
- {
- const QEvent::Type type = event->type();
- if (QEvent::Move == type || QEvent::Resize == type)
- {
- Q_D(QtMaterialFloatingActionButton);
- setGeometry(d->fabGeometry());
- }
- return QtMaterialRaisedButton::eventFilter(obj, event);
- }
- /*!
- * \reimp
- */
- void QtMaterialFloatingActionButton::paintEvent(QPaintEvent *event)
- {
- Q_UNUSED(event)
- Q_D(QtMaterialFloatingActionButton);
- QRect square = QRect(0, 0, d->diameter(), d->diameter());
- square.moveCenter(rect().center());
- QPainter painter(this);
- painter.setRenderHints(QPainter::Antialiasing);
- QBrush brush;
- brush.setStyle(Qt::SolidPattern);
- if (isEnabled()) {
- brush.setColor(backgroundColor());
- } else {
- brush.setColor(disabledBackgroundColor());
- }
- painter.setBrush(brush);
- painter.setPen(Qt::NoPen);
- painter.drawEllipse(square);
- QRect iconGeometry(0, 0, d->iconSize(), d->iconSize());
- iconGeometry.moveCenter(square.center());
- QPixmap pixmap = icon().pixmap(QSize(d->iconSize(), d->iconSize()));
- QPainter icon(&pixmap);
- icon.setCompositionMode(QPainter::CompositionMode_SourceIn);
- icon.fillRect(pixmap.rect(), isEnabled() ? foregroundColor()
- : disabledForegroundColor());
- painter.drawPixmap(iconGeometry, pixmap);
- }
- void QtMaterialFloatingActionButton::updateClipPath()
- {
- Q_D(QtMaterialFloatingActionButton);
- QPainterPath path;
- path.addEllipse(0, 0, d->diameter(), d->diameter());
- d->rippleOverlay->setClipPath(path);
- }
|