fix(attention): crash when app item destory.

Change-Id: Idcfe75b5c12df4e0f2de8ab17cac0ff696df540a
This commit is contained in:
石博文 2018-03-09 14:59:33 +08:00
parent bcc5e866cb
commit d40239a307
Notes: gerrit 2018-03-12 01:21:43 +00:00
Verified+1: Anonymous Coward #1000004
Code-Review+2: 石博文 <sbw@sbw.so>
Submitted-by: 石博文 <sbw@sbw.so>
Submitted-at: Mon, 12 Mar 2018 01:21:42 +0000
Reviewed-on: https://cr.deepin.io/32462
Project: dde/dde-dock
Branch: refs/heads/master
2 changed files with 15 additions and 10 deletions

View File

@ -34,7 +34,6 @@
#include <QApplication>
#include <QHBoxLayout>
#include <QGraphicsScene>
#include <QGraphicsItemAnimation>
#include <QTimeLine>
#include <QX11Info>
@ -590,6 +589,14 @@ void AppItem::cancelAndHidePreview()
void AppItem::playSwingEffect()
{
if (m_itemAnimation.timeLine())
{
m_itemAnimation.timeLine()->stop();
m_itemAnimation.clear();
} else {
m_itemAnimation.setTimeLine(new QTimeLine);
}
m_itemScene->clear();
const auto ratio = qApp->devicePixelRatio();
@ -600,32 +607,28 @@ void AppItem::playSwingEffect()
item->setTransformationMode(Qt::SmoothTransformation);
item->setPos(QPointF(r.center()) - QPointF(icon.rect().center()) / ratio);
m_itemAnimation.setItem(item);
m_itemScene->setSceneRect(r);
m_swingEffectView->setSceneRect(r);
m_swingEffectView->setFixedSize(r.size());
QTimeLine *tl = new QTimeLine;
QTimeLine *tl = m_itemAnimation.timeLine();
tl->setDuration(1200);
tl->setFrameRange(0, 60);
tl->setLoopCount(1);
tl->setEasingCurve(QEasingCurve::Linear);
tl->setStartFrame(0);
QGraphicsItemAnimation *ani = new QGraphicsItemAnimation(tl);
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]);
m_itemAnimation.setPosAt(i / 60.0, pos);
m_itemAnimation.setTranslationAt(i / 60.0, px, py);
m_itemAnimation.setRotationAt(i / 60.0, Frames[i]);
}
connect(tl, &QTimeLine::finished, tl, &QTimeLine::deleteLater);
connect(tl, &QTimeLine::finished, m_swingEffectView, &QGraphicsView::hide);
connect(tl, &QTimeLine::finished, this, &AppItem::checkAttentionEffect);

View File

@ -28,6 +28,7 @@
#include <QGraphicsView>
#include <QGraphicsItem>
#include <QGraphicsItemAnimation>
#include <com_deepin_dde_daemon_dock_entry.h>
@ -92,6 +93,7 @@ private:
QGraphicsView *m_swingEffectView;
QGraphicsScene *m_itemScene;
QGraphicsItemAnimation m_itemAnimation;
bool m_draging;
bool m_active;