qt-material-widgets/components/iconmenu.cpp

145 lines
3.5 KiB
C++
Raw Normal View History

2016-04-24 23:37:59 +00:00
#include <QEvent>
2016-04-25 06:16:54 +00:00
#include <QLayout>
2016-04-26 23:14:39 +00:00
#include <QPropertyAnimation>
#include <QDebug>
#include <QPainter>
2016-03-19 08:32:49 +00:00
#include "iconmenu.h"
2016-04-24 23:37:59 +00:00
#include "menu.h"
//#include "lib/scaleeffect.h"
2016-04-24 22:26:28 +00:00
2016-04-24 23:37:59 +00:00
MenuOverlay::MenuOverlay(QWidget *parent)
2016-04-24 22:26:28 +00:00
: QWidget(parent)
{
setAttribute(Qt::WA_NoSystemBackground);
2016-04-26 23:14:39 +00:00
setAttribute(Qt::WA_TransparentForMouseEvents);
2016-04-24 23:37:59 +00:00
}
MenuOverlay::~MenuOverlay()
{
}
IconMenu::IconMenu(const QIcon &icon, QWidget *parent)
: IconButton(icon, parent),
2016-04-26 23:14:39 +00:00
_menuOverlay(new MenuOverlay),
2016-04-25 06:16:54 +00:00
_menu(new Menu(_menuOverlay)),
2016-04-26 23:14:39 +00:00
_animation(new QPropertyAnimation(this)),
//_effect(new ScaleEffect(this)),
2016-04-26 23:14:39 +00:00
_menuVisible(false),
2016-04-26 23:57:16 +00:00
_progress(1)
2016-04-24 23:37:59 +00:00
{
2016-04-26 19:51:31 +00:00
setCheckable(true);
2016-04-26 23:14:39 +00:00
setOverlayParent(parent);
_animation->setPropertyName("progress");
_animation->setTargetObject(this);
2016-04-28 07:34:25 +00:00
_animation->setDuration(340);
2016-04-26 23:14:39 +00:00
_animation->setStartValue(1);
_animation->setEndValue(0);
2016-04-28 08:10:22 +00:00
_animation->setEasingCurve(QEasingCurve::InQuad);
2016-04-26 23:57:16 +00:00
2016-04-26 23:14:39 +00:00
_menu->hide();
/*
2016-04-26 23:57:16 +00:00
_menu->setGraphicsEffect(_effect);
2016-04-26 23:14:39 +00:00
2016-04-27 21:01:27 +00:00
QGraphicsDropShadowEffect *effect = new QGraphicsDropShadowEffect;
effect->setBlurRadius(9);
effect->setOffset(QPoint(0, 0));
effect->setColor(QColor(0, 0, 0, 200));
_menuOverlay->setGraphicsEffect(effect);
*/
2016-04-27 21:01:27 +00:00
2016-04-26 23:14:39 +00:00
_menuOverlay->installEventFilter(this);
connect(this, SIGNAL(clicked(bool)), this, SLOT(toggleMenu()));
connect(_animation, SIGNAL(finished()), this, SLOT(animationFinished()));
2016-04-26 19:51:31 +00:00
2016-04-24 23:37:59 +00:00
_menu->addMenuItem("Maps");
_menu->addMenuItem("Books");
_menu->addMenuItem("Flights");
_menu->addMenuItem("Apps");
2016-04-24 22:26:28 +00:00
}
IconMenu::~IconMenu()
{
}
2016-04-24 23:37:59 +00:00
2016-04-26 23:14:39 +00:00
void IconMenu::setProgress(qreal progress)
{
if (_progress == progress)
return;
_progress = progress;
//_effect->setScale(progress, progress);
updateOverlayGeometry();
2016-04-26 23:57:16 +00:00
2016-04-26 23:14:39 +00:00
emit progressChanged(progress);
update();
}
void IconMenu::setOverlayParent(QWidget *parent)
{
_menuOverlay->setParent(parent);
}
2016-04-26 23:14:39 +00:00
void IconMenu::toggleMenu()
{
2016-04-28 07:34:25 +00:00
if (QAbstractAnimation::Running != _animation->state()) {
_animation->setEasingCurve(_menuVisible
2016-04-28 08:10:22 +00:00
? QEasingCurve::OutQuad
: QEasingCurve::InQuad);
2016-04-28 07:34:25 +00:00
}
2016-04-26 23:14:39 +00:00
_animation->setDirection(_menuVisible
? QAbstractAnimation::Forward
: QAbstractAnimation::Backward);
_animation->start();
_menuVisible = !_menuVisible;
if (_menuVisible) {
_menu->show();
_menuOverlay->setAttribute(Qt::WA_TransparentForMouseEvents, false);
}
}
void IconMenu::animationFinished()
{
if (!_menuVisible) {
_menu->hide();
_menuOverlay->setAttribute(Qt::WA_TransparentForMouseEvents, true);
}
}
bool IconMenu::eventFilter(QObject *obj, QEvent *event)
{
2016-04-28 00:48:08 +00:00
if (QEvent::MouseButtonRelease == event->type() && _menuVisible && _menuOverlay == obj)
2016-04-26 23:14:39 +00:00
toggleMenu();
return IconButton::eventFilter(obj, event);
}
2016-04-24 23:37:59 +00:00
bool IconMenu::event(QEvent *event)
{
2016-04-26 23:14:39 +00:00
const QEvent::Type &type = event->type();
if (QEvent::ParentChange == type) {
setOverlayParent(parentWidget());
2016-04-26 23:14:39 +00:00
updateOverlayGeometry();
} else if (QEvent::Move == type || QEvent::Resize == type) {
_menuPos = parentWidget()->mapToParent(pos());
updateOverlayGeometry();
2016-04-24 23:37:59 +00:00
}
return IconButton::event(event);
}
2016-04-26 23:14:39 +00:00
void IconMenu::updateOverlayGeometry()
{
const QPoint pos = _menuPos;
const QSize size = _menu->layout()->sizeHint();
2016-04-28 00:48:08 +00:00
if (QAbstractAnimation::Running == _animation->state()) {
2016-04-28 07:34:25 +00:00
_menu->setGeometry(QRect(pos, size*_progress));
2016-04-28 00:48:08 +00:00
} else {
_menu->setGeometry(QRect(pos, size));
}
2016-04-26 23:14:39 +00:00
}