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

View File

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

View File

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