diff --git a/components/flatbutton.cpp b/components/flatbutton.cpp index 069d745..4b62110 100644 --- a/components/flatbutton.cpp +++ b/components/flatbutton.cpp @@ -3,13 +3,14 @@ #include #include #include "flatbutton.h" -#include "style.h" +#include "lib/style.h" FlatButton::FlatButton(QWidget *parent) : QAbstractButton(parent), _overlay(new RippleOverlay(this)) { setStyle(&Style::instance()); + setAttribute(Qt::WA_Hover); } FlatButton::FlatButton(const QString &text, QWidget *parent) @@ -18,6 +19,7 @@ FlatButton::FlatButton(const QString &text, QWidget *parent) { setText(text); setStyle(&Style::instance()); + setAttribute(Qt::WA_Hover); } FlatButton::~FlatButton() diff --git a/components/iconmenu.cpp b/components/iconmenu.cpp index 18ccb4f..cff3181 100644 --- a/components/iconmenu.cpp +++ b/components/iconmenu.cpp @@ -5,6 +5,7 @@ #include #include "iconmenu.h" #include "menu.h" +#include "lib/scaleeffect.h" MenuOverlay::MenuOverlay(QWidget *parent) : QWidget(parent) @@ -22,19 +23,23 @@ IconMenu::IconMenu(const QIcon &icon, QWidget *parent) _menuOverlay(new MenuOverlay), _menu(new Menu(_menuOverlay)), _animation(new QPropertyAnimation(this)), + _effect(new ScaleEffect(this)), _menuVisible(false), - _progress(0) + _progress(1) { setCheckable(true); setOverlayParent(parent); _animation->setPropertyName("progress"); _animation->setTargetObject(this); - _animation->setDuration(350); + _animation->setDuration(200); _animation->setStartValue(1); _animation->setEndValue(0); + _animation->setEasingCurve(QEasingCurve::InOutCubic); + _menu->hide(); + _menu->setGraphicsEffect(_effect); _menuOverlay->installEventFilter(this); @@ -57,6 +62,8 @@ void IconMenu::setProgress(qreal progress) return; _progress = progress; + _effect->setScale(0.5*(1 + progress), progress); + emit progressChanged(progress); update(); } diff --git a/components/iconmenu.h b/components/iconmenu.h index 7aef37c..5074157 100644 --- a/components/iconmenu.h +++ b/components/iconmenu.h @@ -15,6 +15,7 @@ public: }; class QPropertyAnimation; +class ScaleEffect; class Menu; class IconMenu : public IconButton @@ -49,6 +50,7 @@ private: MenuOverlay *const _menuOverlay; Menu *const _menu; QPropertyAnimation *const _animation; + ScaleEffect *const _effect; QPoint _menuPos; bool _menuVisible; qreal _progress; diff --git a/lib/scaleeffect.cpp b/lib/scaleeffect.cpp new file mode 100644 index 0000000..802a71b --- /dev/null +++ b/lib/scaleeffect.cpp @@ -0,0 +1,38 @@ +#include +#include "scaleeffect.h" + +ScaleEffect::ScaleEffect(QObject *parent) + : QGraphicsEffect(parent), + _scaleX(1), + _scaleY(1) +{ +} + +void ScaleEffect::setScale(qreal x, qreal y) +{ + _scaleX = x; + _scaleY = y; + updateBoundingRect(); +} + +QSizeF ScaleEffect::scale() const +{ + return QSizeF(_scaleX, _scaleY); +} + +void ScaleEffect::draw(QPainter *painter) +{ + QPoint offset; + const QPixmap pixmap = sourcePixmap( + Qt::DeviceCoordinates, + &offset, + QGraphicsEffect::PadToEffectiveBoundingRect); + + const QSize &size = pixmap.size(); + painter->setWorldTransform(QTransform()); + painter->drawPixmap(offset, pixmap.scaled( + size.width()*_scaleX, + size.height()*_scaleY, + Qt::IgnoreAspectRatio, + Qt::SmoothTransformation)); +} diff --git a/lib/scaleeffect.h b/lib/scaleeffect.h new file mode 100644 index 0000000..7f50659 --- /dev/null +++ b/lib/scaleeffect.h @@ -0,0 +1,25 @@ +#ifndef SCALEEFFECT_H +#define SCALEEFFECT_H + +#include + +class ScaleEffect : public QGraphicsEffect +{ + Q_OBJECT + +public: + explicit ScaleEffect(QObject *parent = 0); + + void setScale(qreal x, qreal y); + QSizeF scale() const; + inline qreal scaleX() const { return _scaleX; } + inline qreal scaleY() const { return _scaleY; } + + void draw(QPainter *painter); + +private: + qreal _scaleX; + qreal _scaleY; +}; + +#endif // SCALEEFFECT_H diff --git a/qt-material-widgets.pro b/qt-material-widgets.pro index ff19e74..ed9bbc9 100644 --- a/qt-material-widgets.pro +++ b/qt-material-widgets.pro @@ -50,7 +50,8 @@ SOURCES += main.cpp\ components/menu.cpp \ components/scrollbar.cpp \ lib/style.cpp \ - examples/iconmenuexamples.cpp + examples/iconmenuexamples.cpp \ + lib/scaleeffect.cpp HEADERS += mainwindow.h \ style.h \ @@ -94,4 +95,5 @@ HEADERS += mainwindow.h \ components/menu.h \ components/scrollbar.h \ lib/style.h \ - examples/iconmenuexamples.h + examples/iconmenuexamples.h \ + lib/scaleeffect.h