Fix drop shadow on auto complete menu

This commit is contained in:
Johannes Hilden 2017-10-15 16:20:07 +03:00
parent a9605c94bb
commit 2e8922f9b9
3 changed files with 63 additions and 16 deletions

View File

@ -4,6 +4,7 @@
#include <QtWidgets/QVBoxLayout>
#include <QEvent>
#include <QTimer>
#include <QPainter>
#include <QDebug>
#include "qtmaterialautocomplete_internal.h"
#include "qtmaterialflatbutton.h"
@ -36,19 +37,24 @@ void QtMaterialAutoCompletePrivate::init()
Q_Q(QtMaterialAutoComplete);
menu = new QWidget;
frame = new QWidget;
stateMachine = new QtMaterialAutoCompleteStateMachine(menu);
menuLayout = new QVBoxLayout;
maxWidth = 0;
menu->setParent(q->parentWidget());
frame->setParent(q->parentWidget());
menu->installEventFilter(q);
frame->installEventFilter(q);
QGraphicsDropShadowEffect *effect = new QGraphicsDropShadowEffect;
effect->setBlurRadius(11);
effect->setColor(QColor(0, 0, 0, 50));
effect->setOffset(0, 3);
// create a box with geometry identical to menu, and then apply effect to it
//menu->setGraphicsEffect(effect);
frame->setGraphicsEffect(effect);
frame->setVisible(false);
menu->setLayout(menuLayout);
menu->setVisible(false);
@ -165,6 +171,7 @@ bool QtMaterialAutoComplete::QtMaterialAutoComplete::event(QEvent *event)
QWidget *widget = static_cast<QWidget *>(parent());
if (widget) {
d->menu->setParent(widget);
d->frame->setParent(widget);
}
break;
}
@ -178,20 +185,59 @@ bool QtMaterialAutoComplete::eventFilter(QObject *watched, QEvent *event)
{
Q_D(QtMaterialAutoComplete);
switch (event->type())
if (d->frame == watched)
{
case QEvent::MouseButtonPress: {
emit d->stateMachine->shouldFade();
QtMaterialFlatButton *widget;
if ((widget = static_cast<QtMaterialFlatButton *>(watched))) {
QString text(widget->text());
setText(text);
emit itemSelected(text);
switch (event->type())
{
case QEvent::Paint: {
QPainter painter(d->frame);
painter.setOpacity(0.3);
painter.fillRect(d->frame->rect(), Qt::white);
break;
}
default:
break;
}
break;
}
default:
break;
else if (d->menu == watched)
{
switch (event->type())
{
case QEvent::Resize:
case QEvent::Move: {
d->frame->setGeometry(d->menu->geometry());
break;
}
case QEvent::Show: {
d->frame->show();
d->menu->raise();
break;
}
case QEvent::Hide: {
d->frame->hide();
break;
}
default:
break;
}
}
else
{
switch (event->type())
{
case QEvent::MouseButtonPress: {
emit d->stateMachine->shouldFade();
QtMaterialFlatButton *widget;
if ((widget = static_cast<QtMaterialFlatButton *>(watched))) {
QString text(widget->text());
setText(text);
emit itemSelected(text);
}
break;
}
default:
break;
}
}
return QtMaterialTextField::eventFilter(watched, event);
}

View File

@ -60,9 +60,9 @@ QtMaterialAutoCompleteStateMachine::QtMaterialAutoCompleteStateMachine(QWidget *
transition->setTargetState(m_closedState);
m_closingState->addTransition(transition);
QObject::connect(m_closedState, &QtMaterialAutoCompleteStateMachine::entered, [=](){ qDebug() << "Closed"; });
QObject::connect(m_openState, &QtMaterialAutoCompleteStateMachine::entered, [=](){ qDebug() << "Opened"; });
QObject::connect(m_closingState, &QtMaterialAutoCompleteStateMachine::entered, [=](){ qDebug() << "Closing"; });
//QObject::connect(m_closedState, &QtMaterialAutoCompleteStateMachine::entered, [=](){ qDebug() << "Closed"; });
//QObject::connect(m_openState, &QtMaterialAutoCompleteStateMachine::entered, [=](){ qDebug() << "Opened"; });
//QObject::connect(m_closingState, &QtMaterialAutoCompleteStateMachine::entered, [=](){ qDebug() << "Closing"; });
}
/*!

View File

@ -20,6 +20,7 @@ public:
void init();
QWidget *menu;
QWidget *frame;
QtMaterialAutoCompleteStateMachine *stateMachine;
QVBoxLayout *menuLayout;
QStringList dataSource;