2016-07-16 10:17:46 +00:00
|
|
|
#include "xx/qtmaterialiconmenu.h"
|
|
|
|
#include "xx/qtmaterialiconmenu_p.h"
|
|
|
|
#include <QEvent>
|
|
|
|
#include <QTimer>
|
|
|
|
#include "xxlib/qtmaterialoverlaywidget.h"
|
|
|
|
#include "xx/qtmaterialcollapsiblemenu.h"
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* \class QtMaterialIconMenuPrivate
|
|
|
|
* \internal
|
|
|
|
*/
|
|
|
|
|
|
|
|
QtMaterialIconMenuPrivate::QtMaterialIconMenuPrivate(QtMaterialIconMenu *q)
|
|
|
|
: QtMaterialIconButtonPrivate(q)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
QtMaterialIconMenuPrivate::~QtMaterialIconMenuPrivate()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void QtMaterialIconMenuPrivate::init()
|
|
|
|
{
|
|
|
|
Q_Q(QtMaterialIconMenu);
|
|
|
|
|
|
|
|
menuOverlay = new QtMaterialOverlayWidget(q);
|
|
|
|
menu = new QtMaterialCollapsibleMenu;
|
|
|
|
autoCollapse = true;
|
|
|
|
|
|
|
|
menuOverlay->setParent(q->parentWidget());
|
|
|
|
menuOverlay->setAttribute(Qt::WA_TransparentForMouseEvents);
|
|
|
|
menuOverlay->installEventFilter(q);
|
|
|
|
|
|
|
|
menu->setParent(menuOverlay);
|
|
|
|
menu->setMaximumHeight(300);
|
|
|
|
menu->setMinimumWidth(200);
|
|
|
|
|
|
|
|
QObject::connect(menu, SIGNAL(aboutToCollapse()), q, SLOT(makeTransparent()));
|
|
|
|
QObject::connect(menu, SIGNAL(wasExpanded()), q, SLOT(makeOpaque()));
|
|
|
|
QObject::connect(menu, SIGNAL(aboutToExpand()), menuOverlay, SLOT(raise()));
|
|
|
|
QObject::connect(menu, SIGNAL(itemClicked(int)), q, SIGNAL(itemSelected(int)));
|
|
|
|
QObject::connect(menu, SIGNAL(itemClicked(int)), q, SLOT(collapseDelayed()));
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* \class QtMaterialIconMenu
|
|
|
|
*/
|
|
|
|
|
|
|
|
QtMaterialIconMenu::QtMaterialIconMenu(const QIcon &icon, QWidget *parent)
|
|
|
|
: QtMaterialIconButton(*new QtMaterialIconMenuPrivate(this), parent)
|
|
|
|
{
|
|
|
|
d_func()->init();
|
|
|
|
|
|
|
|
setIcon(icon);
|
|
|
|
}
|
|
|
|
|
|
|
|
QtMaterialIconMenu::~QtMaterialIconMenu()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void QtMaterialIconMenu::addMenuItem(const QString &text)
|
|
|
|
{
|
|
|
|
Q_D(QtMaterialIconMenu);
|
|
|
|
|
|
|
|
d->menu->addMenuItem(text);
|
|
|
|
}
|
|
|
|
|
|
|
|
void QtMaterialIconMenu::addMenuItem(QtMaterialMenuItem *item)
|
|
|
|
{
|
|
|
|
Q_D(QtMaterialIconMenu);
|
|
|
|
|
|
|
|
d->menu->addMenuItem(item);
|
|
|
|
}
|
|
|
|
|
|
|
|
QtMaterialMenuItem *QtMaterialIconMenu::itemAt(int index) const
|
|
|
|
{
|
|
|
|
Q_D(const QtMaterialIconMenu);
|
|
|
|
|
|
|
|
return d->menu->menuItemAt(index);
|
|
|
|
}
|
|
|
|
|
|
|
|
void QtMaterialIconMenu::setAutoCollapse(bool value)
|
|
|
|
{
|
|
|
|
Q_D(QtMaterialIconMenu);
|
|
|
|
|
|
|
|
d->autoCollapse = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool QtMaterialIconMenu::autoCollapse() const
|
|
|
|
{
|
|
|
|
Q_D(const QtMaterialIconMenu);
|
|
|
|
|
|
|
|
return d->autoCollapse;
|
|
|
|
}
|
|
|
|
|
|
|
|
void QtMaterialIconMenu::makeTransparent()
|
|
|
|
{
|
|
|
|
Q_D(QtMaterialIconMenu);
|
|
|
|
|
|
|
|
d->menuOverlay->setAttribute(Qt::WA_TransparentForMouseEvents, true);
|
|
|
|
}
|
|
|
|
|
|
|
|
void QtMaterialIconMenu::makeOpaque()
|
|
|
|
{
|
|
|
|
Q_D(QtMaterialIconMenu);
|
|
|
|
|
|
|
|
d->menuOverlay->setAttribute(Qt::WA_TransparentForMouseEvents, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
void QtMaterialIconMenu::collapseDelayed()
|
|
|
|
{
|
|
|
|
Q_D(QtMaterialIconMenu);
|
|
|
|
|
|
|
|
if (d->autoCollapse) {
|
2016-07-22 05:47:07 +00:00
|
|
|
QTimer::singleShot(110, d->menu, SLOT(collapse()));
|
2016-07-16 10:17:46 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-07-18 13:26:29 +00:00
|
|
|
/*!
|
|
|
|
* \reimp
|
|
|
|
*/
|
2016-07-16 10:17:46 +00:00
|
|
|
bool QtMaterialIconMenu::event(QEvent *event)
|
|
|
|
{
|
|
|
|
Q_D(QtMaterialIconMenu);
|
|
|
|
|
|
|
|
switch (event->type())
|
|
|
|
{
|
|
|
|
case QEvent::Move:
|
|
|
|
case QEvent::Resize:
|
|
|
|
{
|
|
|
|
const QSize sh = d->menu->sizeHint();
|
|
|
|
QPoint p = pos();
|
|
|
|
p += QPoint(width()/2, height()/2);
|
|
|
|
d->menu->setGeometry(p.x(), p.y(), sh.width(), sh.height());
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case QEvent::MouseButtonRelease:
|
|
|
|
{
|
|
|
|
if (isEnabled()) {
|
|
|
|
d->menu->expand();
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case QEvent::ParentChange:
|
|
|
|
{
|
|
|
|
QWidget *widget;
|
|
|
|
if ((widget = parentWidget())) {
|
|
|
|
d->menuOverlay->setParent(widget);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return QtMaterialIconButton::event(event);
|
|
|
|
}
|
|
|
|
|
2016-07-18 13:26:29 +00:00
|
|
|
/*!
|
|
|
|
* \reimp
|
|
|
|
*/
|
2016-07-16 10:17:46 +00:00
|
|
|
bool QtMaterialIconMenu::eventFilter(QObject *obj, QEvent *event)
|
|
|
|
{
|
|
|
|
Q_D(QtMaterialIconMenu);
|
|
|
|
|
|
|
|
if (QEvent::MouseButtonPress == event->type()) {
|
|
|
|
d->menu->collapse();
|
|
|
|
}
|
|
|
|
return QtMaterialIconButton::eventFilter(obj, event);
|
|
|
|
}
|