add attention effect for fasion mode

Change-Id: Ic3f0fca922530163a726f89d15916560fe3013c1
This commit is contained in:
石博文 2018-02-27 15:25:15 +08:00
parent 184445992d
commit 0f5d63a768
Notes: Deepin Code Review 2018-02-27 15:43:32 +08:00
Verified+1: Anonymous Coward #1000004
Code-Review+2: 石博文 <sbw@sbw.so>
Submitted-by: 石博文 <sbw@sbw.so>
Submitted-at: Tue, 27 Feb 2018 15:43:31 +0800
Reviewed-on: https://cr.deepin.io/32017
Project: dde/dde-dock
Branch: refs/heads/master
2 changed files with 88 additions and 71 deletions

View File

@ -110,7 +110,7 @@ AppItem::AppItem(const QDBusObjectPath &entry, QWidget *parent)
m_appPreviewTips(new PreviewContainer(this)),
m_itemEntryInter(new DockEntryInter("com.deepin.dde.daemon.Dock", entry.path(), QDBusConnection::sessionBus(), this)),
m_itemView(new QGraphicsView(this)),
m_swingEffectView(new QGraphicsView(this)),
m_itemScene(new QGraphicsScene(this)),
m_draging(false),
@ -127,7 +127,7 @@ AppItem::AppItem(const QDBusObjectPath &entry, QWidget *parent)
m_largeWatcher(new QFutureWatcher<QPixmap>(this))
{
QHBoxLayout *centralLayout = new QHBoxLayout;
centralLayout->addWidget(m_itemView);
centralLayout->addWidget(m_swingEffectView);
centralLayout->setMargin(0);
centralLayout->setSpacing(0);
@ -135,15 +135,15 @@ AppItem::AppItem(const QDBusObjectPath &entry, QWidget *parent)
setAcceptDrops(true);
setLayout(centralLayout);
m_itemView->setScene(m_itemScene);
m_itemView->setAlignment(Qt::AlignCenter);
m_itemView->setVisible(false);
m_itemView->setFrameStyle(QFrame::NoFrame);
m_itemView->setContentsMargins(0, 0, 0, 0);
m_itemView->setRenderHints(QPainter::SmoothPixmapTransform);
m_itemView->setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);
m_itemView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
m_itemView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
m_swingEffectView->setScene(m_itemScene);
m_swingEffectView->setAlignment(Qt::AlignCenter);
m_swingEffectView->setVisible(false);
m_swingEffectView->setFrameStyle(QFrame::NoFrame);
m_swingEffectView->setContentsMargins(0, 0, 0, 0);
m_swingEffectView->setRenderHints(QPainter::SmoothPixmapTransform);
m_swingEffectView->setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);
m_swingEffectView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
m_swingEffectView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
m_id = m_itemEntryInter->id();
m_active = m_itemEntryInter->isActive();
@ -236,7 +236,7 @@ void AppItem::paintEvent(QPaintEvent *e)
{
DockItem::paintEvent(e);
if (m_draging || m_itemView->isVisible())
if (m_draging || (m_swingEffectView->isVisible() && DockDisplayMode != Fashion))
return;
QPainter painter(this);
@ -249,23 +249,11 @@ void AppItem::paintEvent(QPaintEvent *e)
// draw background
QRectF backgroundRect = itemRect;
if (DockDisplayMode == Efficient)
{
switch (DockPosition)
{
case Top:
case Bottom:
// backgroundRect = itemRect;//.marginsRemoved(QMargins(2, 0, 2, 0));
// backgroundRect = itemRect.marginsRemoved(QMargins(0, 1, 0, 1));
case Left:
case Right:
backgroundRect = itemRect.marginsRemoved(QMargins(1, 1, 1, 1));
// backgroundRect = itemRect.marginsRemoved(QMargins(1, 0, 1, 0));
}
}
if (DockDisplayMode == Efficient)
{
backgroundRect = itemRect.marginsRemoved(QMargins(1, 1, 1, 1));
if (m_active)
{
painter.fillRect(backgroundRect, QColor(44, 167, 248, 255 * 0.3));
@ -332,6 +320,9 @@ void AppItem::paintEvent(QPaintEvent *e)
}
}
if (m_swingEffectView->isVisible())
return;
// icon
const QPixmap &pixmap = m_appIcon;
if (pixmap.isNull())
@ -353,50 +344,9 @@ void AppItem::mouseReleaseEvent(QMouseEvent *e)
m_itemEntryInter->Activate(QX11Info::getTimestamp());
if (!m_windowInfos.isEmpty())
return;
// start launching effects
m_itemScene->clear();
const auto ratio = qApp->devicePixelRatio();
const QRect r = rect();
const QPixmap &icon = m_appIcon;
QGraphicsPixmapItem *item = m_itemScene->addPixmap(icon);
item->setTransformationMode(Qt::SmoothTransformation);
item->setPos(QPointF(r.center()) - QPointF(icon.rect().center()) / ratio);
m_itemScene->setSceneRect(r);
m_itemView->setSceneRect(r);
m_itemView->setFixedSize(r.size());
// m_itemView->setSceneRect((r.width() - icon.width()) / 2, (r.height() - icon.height()) / 2, r.width(), r.height());
QTimeLine *tl = new QTimeLine;
tl->setDuration(1200);
tl->setFrameRange(0, 60);
tl->setLoopCount(1);
tl->setEasingCurve(QEasingCurve::Linear);
tl->setStartFrame(0);
tl->start();
QGraphicsItemAnimation *ani = new QGraphicsItemAnimation;
ani->setItem(item);
ani->setTimeLine(tl);
const int px = qreal(-icon.rect().center().x()) / ratio;
const int py = qreal(-icon.rect().center().y()) / ratio - 18.;
const QPoint pos = r.center() + QPoint(0, 18);
for (int i(0); i != 60; ++i)
{
ani->setPosAt(i / 60.0, pos);
ani->setTranslationAt(i / 60.0, px, py);
ani->setRotationAt(i / 60.0, Frames[i]);
}
connect(tl, &QTimeLine::finished, tl, &QTimeLine::deleteLater);
connect(tl, &QTimeLine::finished, ani, &QGraphicsItemAnimation::deleteLater);
connect(tl, &QTimeLine::finished, m_itemScene, &QGraphicsScene::clear);
connect(tl, &QTimeLine::finished, m_itemView, &QGraphicsView::hide);
m_itemView->setVisible(true);
// play launch effect
if (m_windowInfos.isEmpty())
playSwingEffect();
}
}
@ -574,6 +524,16 @@ void AppItem::updateWindowInfos(const WindowInfoMap &info)
m_appPreviewTips->setWindowInfos(m_windowInfos);
m_updateIconGeometryTimer->start();
// process attention effect
if (hasAttention())
{
if (DockDisplayMode == DisplayMode::Fashion)
playSwingEffect();
} else {
// stop swing effect
m_swingEffectView->setVisible(false);
}
update();
}
@ -628,3 +588,58 @@ void AppItem::cancelAndHidePreview()
emit requestCancelPreview();
}
void AppItem::playSwingEffect()
{
m_itemScene->clear();
const auto ratio = qApp->devicePixelRatio();
const QRect r = rect();
const QPixmap &icon = m_appIcon;
QGraphicsPixmapItem *item = m_itemScene->addPixmap(icon);
item->setTransformationMode(Qt::SmoothTransformation);
item->setPos(QPointF(r.center()) - QPointF(icon.rect().center()) / ratio);
m_itemScene->setSceneRect(r);
m_swingEffectView->setSceneRect(r);
m_swingEffectView->setFixedSize(r.size());
QTimeLine *tl = new QTimeLine;
tl->setDuration(1200);
tl->setFrameRange(0, 60);
tl->setLoopCount(1);
tl->setEasingCurve(QEasingCurve::Linear);
tl->setStartFrame(0);
tl->start();
QGraphicsItemAnimation *ani = new QGraphicsItemAnimation;
ani->setItem(item);
ani->setTimeLine(tl);
const int px = qreal(-icon.rect().center().x()) / ratio;
const int py = qreal(-icon.rect().center().y()) / ratio - 18.;
const QPoint pos = r.center() + QPoint(0, 18);
for (int i(0); i != 60; ++i)
{
ani->setPosAt(i / 60.0, pos);
ani->setTranslationAt(i / 60.0, px, py);
ani->setRotationAt(i / 60.0, Frames[i]);
}
connect(tl, &QTimeLine::finished, tl, &QTimeLine::deleteLater);
connect(tl, &QTimeLine::finished, ani, &QGraphicsItemAnimation::deleteLater);
connect(tl, &QTimeLine::finished, m_itemScene, &QGraphicsScene::clear);
connect(tl, &QTimeLine::finished, m_swingEffectView, &QGraphicsView::hide);
connect(tl, &QTimeLine::finished, this, &AppItem::checkAttentionEffect);
m_swingEffectView->setVisible(true);
}
void AppItem::checkAttentionEffect()
{
QTimer::singleShot(1000, this, [=] {
if (DockDisplayMode == DisplayMode::Fashion && hasAttention())
playSwingEffect();
});
}

View File

@ -82,13 +82,15 @@ private slots:
void activeChanged();
void showPreview();
void cancelAndHidePreview();
void playSwingEffect();
void checkAttentionEffect();
private:
QLabel *m_appNameTips;
PreviewContainer *m_appPreviewTips;
DockEntryInter *m_itemEntryInter;
QGraphicsView *m_itemView;
QGraphicsView *m_swingEffectView;
QGraphicsScene *m_itemScene;
bool m_draging;