implement icon menu zoom effect

This commit is contained in:
laserpants 2016-04-27 02:57:16 +03:00
parent 8a0daa0c8f
commit 9271838d70
6 changed files with 81 additions and 5 deletions

View File

@ -3,13 +3,14 @@
#include <QMouseEvent>
#include <QApplication>
#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()

View File

@ -5,6 +5,7 @@
#include <QPainter>
#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();
}

View File

@ -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;

38
lib/scaleeffect.cpp Normal file
View File

@ -0,0 +1,38 @@
#include <QPainter>
#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));
}

25
lib/scaleeffect.h Normal file
View File

@ -0,0 +1,25 @@
#ifndef SCALEEFFECT_H
#define SCALEEFFECT_H
#include <QGraphicsEffect>
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

View File

@ -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