Fix drop shadow on auto complete menu
This commit is contained in:
parent
a9605c94bb
commit
2e8922f9b9
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"; });
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue