qt-material-widgets/components/qtmaterialcollapsiblemenu.cpp

237 lines
6.0 KiB
C++

#include "qtmaterialcollapsiblemenu.h"
#include "qtmaterialcollapsiblemenu_p.h"
#include <QtWidgets/QScrollArea>
#include <QtWidgets/QStackedLayout>
#include <QPropertyAnimation>
#include "qtmaterialcollapsiblemenu_internal.h"
#include "qtmaterialmenuitem.h"
#include "qtmaterialscrollbar.h"
#include "lib/qtmaterialstyle.h"
#include "lib/qtmaterialstatetransitionevent.h"
/*!
* \class QtMaterialCollapsibleMenuPrivate
* \internal
*/
QtMaterialCollapsibleMenuPrivate::QtMaterialCollapsibleMenuPrivate(QtMaterialCollapsibleMenu *q)
: q_ptr(q)
{
}
QtMaterialCollapsibleMenuPrivate::~QtMaterialCollapsibleMenuPrivate()
{
}
void QtMaterialCollapsibleMenuPrivate::init()
{
Q_Q(QtMaterialCollapsibleMenu);
QGraphicsDropShadowEffect *effect = new QGraphicsDropShadowEffect;
QtMaterialScrollBar *scrollBar = new QtMaterialScrollBar;
scrollArea = new QScrollArea;
mainWidget = new QWidget;
menuLayout = new QVBoxLayout;
proxy = new QtMaterialCollapsibleMenuProxy(mainWidget, effect);
stateMachine = new QtMaterialCollapsibleMenuStateMachine(proxy, q);
proxyStack = new QStackedLayout;
mainWidget->setLayout(menuLayout);
menuLayout->setSpacing(0);
menuLayout->setMargin(0);
scrollArea->setLineWidth(0);
scrollArea->setMidLineWidth(0);
scrollArea->setFrameShape(QFrame::NoFrame);
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
scrollArea->setWidgetResizable(true);
scrollArea->setWidget(mainWidget);
scrollArea->setVerticalScrollBar(scrollBar);
scrollArea->setAutoFillBackground(true);
QPalette p(scrollArea->palette());
p.setColor(QPalette::Background, Qt::white);
scrollArea->setPalette(p);
scrollBar->setHideOnMouseOut(false);
proxyStack->addWidget(scrollArea);
proxyStack->setSpacing(0);
proxyStack->setMargin(0);
proxyStack->addWidget(proxy);
proxyStack->setCurrentIndex(1);
q->setLayout(proxyStack);
effect->setBlurRadius(9);
effect->setOffset(QPoint(0, 0));
effect->setColor(QColor(0, 0, 0, 100));
q->setGraphicsEffect(effect);
stateMachine->start();
}
/*!
* \class QtMaterialCollapsibleMenu
*/
QtMaterialCollapsibleMenu::QtMaterialCollapsibleMenu(QWidget *parent)
: QWidget(parent),
d_ptr(new QtMaterialCollapsibleMenuPrivate(this))
{
d_func()->init();
}
QtMaterialCollapsibleMenu::~QtMaterialCollapsibleMenu()
{
}
void QtMaterialCollapsibleMenu::addMenuItem(const QString &text)
{
QtMaterialMenuItem *item = new QtMaterialMenuItem;
item->setText(text);
addMenuItem(item);
}
void QtMaterialCollapsibleMenu::addMenuItem(QtMaterialMenuItem *item)
{
Q_D(QtMaterialCollapsibleMenu);
d->menuLayout->addWidget(item);
connect(item, SIGNAL(clicked(bool)), this, SLOT(menuItemClicked()));
}
QtMaterialMenuItem *QtMaterialCollapsibleMenu::menuItemAt(int index) const
{
Q_D(const QtMaterialCollapsibleMenu);
QLayoutItem *item;
if (!(item = d->menuLayout->itemAt(index))) {
return 0;
}
return static_cast<QtMaterialMenuItem *>(item->widget());
}
int QtMaterialCollapsibleMenu::itemCount() const
{
Q_D(const QtMaterialCollapsibleMenu);
return d->menuLayout->count();
}
void QtMaterialCollapsibleMenu::scrollTo(int dx, int dy)
{
Q_D(QtMaterialCollapsibleMenu);
d->scrollArea->horizontalScrollBar()->setValue(dx);
d->scrollArea->verticalScrollBar()->setValue(dy);
}
void QtMaterialCollapsibleMenu::setExpandXDuration(int duration)
{
Q_D(QtMaterialCollapsibleMenu);
d->stateMachine->expandXAnimation()->setDuration(duration);
}
void QtMaterialCollapsibleMenu::setExpandXEasingCurve(const QEasingCurve &curve)
{
Q_D(QtMaterialCollapsibleMenu);
d->stateMachine->expandXAnimation()->setEasingCurve(curve);
}
void QtMaterialCollapsibleMenu::setExpandYDuration(int duration)
{
Q_D(QtMaterialCollapsibleMenu);
d->stateMachine->expandYAnimation()->setDuration(duration);
}
void QtMaterialCollapsibleMenu::setExpandYEasingCurve(const QEasingCurve &curve)
{
Q_D(QtMaterialCollapsibleMenu);
d->stateMachine->expandYAnimation()->setEasingCurve(curve);
}
void QtMaterialCollapsibleMenu::setCollapseXDuration(int duration)
{
Q_D(QtMaterialCollapsibleMenu);
d->stateMachine->collapseXAnimation()->setDuration(duration);
}
void QtMaterialCollapsibleMenu::setCollapseXEasingCurve(const QEasingCurve &curve)
{
Q_D(QtMaterialCollapsibleMenu);
d->stateMachine->collapseXAnimation()->setEasingCurve(curve);
}
void QtMaterialCollapsibleMenu::setCollapseYDuration(int duration)
{
Q_D(QtMaterialCollapsibleMenu);
d->stateMachine->collapseYAnimation()->setDuration(duration);
}
void QtMaterialCollapsibleMenu::setCollapseYEasingCurve(const QEasingCurve &curve)
{
Q_D(QtMaterialCollapsibleMenu);
d->stateMachine->collapseYAnimation()->setEasingCurve(curve);
}
void QtMaterialCollapsibleMenu::setCollapsedXScale(qreal sx)
{
Q_D(QtMaterialCollapsibleMenu);
d->stateMachine->collapsedState()->assignProperty(d->proxy, "xScale", sx);
}
void QtMaterialCollapsibleMenu::setCollapsedYScale(qreal sy)
{
Q_D(QtMaterialCollapsibleMenu);
d->stateMachine->collapsedState()->assignProperty(d->proxy, "xScale", sy);
}
void QtMaterialCollapsibleMenu::collapse()
{
Q_D(QtMaterialCollapsibleMenu);
d->proxyStack->setCurrentIndex(1);
d->stateMachine->postEvent(new QtMaterialStateTransitionEvent(CollapsibleMenuCollapse));
emit aboutToCollapse();
}
void QtMaterialCollapsibleMenu::expand()
{
Q_D(QtMaterialCollapsibleMenu);
d->proxyStack->setCurrentIndex(1);
d->stateMachine->postEvent(new QtMaterialStateTransitionEvent(CollapsibleMenuExpand));
emit aboutToExpand();
}
void QtMaterialCollapsibleMenu::menuItemClicked()
{
Q_D(QtMaterialCollapsibleMenu);
QWidget *widget = static_cast<QWidget *>(sender());
if (widget) {
int index = d->menuLayout->indexOf(widget);
emit itemClicked(index);
}
}
void QtMaterialCollapsibleMenu::setOpaque()
{
Q_D(QtMaterialCollapsibleMenu);
d->proxyStack->setCurrentIndex(0);
}