mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-04 17:33:05 +00:00
add attention effect for fasion mode
Change-Id: Ic3f0fca922530163a726f89d15916560fe3013c1
This commit is contained in:
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
@ -110,7 +110,7 @@ AppItem::AppItem(const QDBusObjectPath &entry, QWidget *parent)
|
|||||||
m_appPreviewTips(new PreviewContainer(this)),
|
m_appPreviewTips(new PreviewContainer(this)),
|
||||||
m_itemEntryInter(new DockEntryInter("com.deepin.dde.daemon.Dock", entry.path(), QDBusConnection::sessionBus(), 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_itemScene(new QGraphicsScene(this)),
|
||||||
|
|
||||||
m_draging(false),
|
m_draging(false),
|
||||||
@ -127,7 +127,7 @@ AppItem::AppItem(const QDBusObjectPath &entry, QWidget *parent)
|
|||||||
m_largeWatcher(new QFutureWatcher<QPixmap>(this))
|
m_largeWatcher(new QFutureWatcher<QPixmap>(this))
|
||||||
{
|
{
|
||||||
QHBoxLayout *centralLayout = new QHBoxLayout;
|
QHBoxLayout *centralLayout = new QHBoxLayout;
|
||||||
centralLayout->addWidget(m_itemView);
|
centralLayout->addWidget(m_swingEffectView);
|
||||||
centralLayout->setMargin(0);
|
centralLayout->setMargin(0);
|
||||||
centralLayout->setSpacing(0);
|
centralLayout->setSpacing(0);
|
||||||
|
|
||||||
@ -135,15 +135,15 @@ AppItem::AppItem(const QDBusObjectPath &entry, QWidget *parent)
|
|||||||
setAcceptDrops(true);
|
setAcceptDrops(true);
|
||||||
setLayout(centralLayout);
|
setLayout(centralLayout);
|
||||||
|
|
||||||
m_itemView->setScene(m_itemScene);
|
m_swingEffectView->setScene(m_itemScene);
|
||||||
m_itemView->setAlignment(Qt::AlignCenter);
|
m_swingEffectView->setAlignment(Qt::AlignCenter);
|
||||||
m_itemView->setVisible(false);
|
m_swingEffectView->setVisible(false);
|
||||||
m_itemView->setFrameStyle(QFrame::NoFrame);
|
m_swingEffectView->setFrameStyle(QFrame::NoFrame);
|
||||||
m_itemView->setContentsMargins(0, 0, 0, 0);
|
m_swingEffectView->setContentsMargins(0, 0, 0, 0);
|
||||||
m_itemView->setRenderHints(QPainter::SmoothPixmapTransform);
|
m_swingEffectView->setRenderHints(QPainter::SmoothPixmapTransform);
|
||||||
m_itemView->setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);
|
m_swingEffectView->setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);
|
||||||
m_itemView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
m_swingEffectView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||||
m_itemView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
m_swingEffectView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||||
|
|
||||||
m_id = m_itemEntryInter->id();
|
m_id = m_itemEntryInter->id();
|
||||||
m_active = m_itemEntryInter->isActive();
|
m_active = m_itemEntryInter->isActive();
|
||||||
@ -236,7 +236,7 @@ void AppItem::paintEvent(QPaintEvent *e)
|
|||||||
{
|
{
|
||||||
DockItem::paintEvent(e);
|
DockItem::paintEvent(e);
|
||||||
|
|
||||||
if (m_draging || m_itemView->isVisible())
|
if (m_draging || (m_swingEffectView->isVisible() && DockDisplayMode != Fashion))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
QPainter painter(this);
|
QPainter painter(this);
|
||||||
@ -249,23 +249,11 @@ void AppItem::paintEvent(QPaintEvent *e)
|
|||||||
|
|
||||||
// draw background
|
// draw background
|
||||||
QRectF backgroundRect = itemRect;
|
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)
|
if (DockDisplayMode == Efficient)
|
||||||
{
|
{
|
||||||
|
backgroundRect = itemRect.marginsRemoved(QMargins(1, 1, 1, 1));
|
||||||
|
|
||||||
if (m_active)
|
if (m_active)
|
||||||
{
|
{
|
||||||
painter.fillRect(backgroundRect, QColor(44, 167, 248, 255 * 0.3));
|
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
|
// icon
|
||||||
const QPixmap &pixmap = m_appIcon;
|
const QPixmap &pixmap = m_appIcon;
|
||||||
if (pixmap.isNull())
|
if (pixmap.isNull())
|
||||||
@ -353,50 +344,9 @@ void AppItem::mouseReleaseEvent(QMouseEvent *e)
|
|||||||
|
|
||||||
m_itemEntryInter->Activate(QX11Info::getTimestamp());
|
m_itemEntryInter->Activate(QX11Info::getTimestamp());
|
||||||
|
|
||||||
if (!m_windowInfos.isEmpty())
|
// play launch effect
|
||||||
return;
|
if (m_windowInfos.isEmpty())
|
||||||
|
playSwingEffect();
|
||||||
// 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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -574,6 +524,16 @@ void AppItem::updateWindowInfos(const WindowInfoMap &info)
|
|||||||
m_appPreviewTips->setWindowInfos(m_windowInfos);
|
m_appPreviewTips->setWindowInfos(m_windowInfos);
|
||||||
m_updateIconGeometryTimer->start();
|
m_updateIconGeometryTimer->start();
|
||||||
|
|
||||||
|
// process attention effect
|
||||||
|
if (hasAttention())
|
||||||
|
{
|
||||||
|
if (DockDisplayMode == DisplayMode::Fashion)
|
||||||
|
playSwingEffect();
|
||||||
|
} else {
|
||||||
|
// stop swing effect
|
||||||
|
m_swingEffectView->setVisible(false);
|
||||||
|
}
|
||||||
|
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -628,3 +588,58 @@ void AppItem::cancelAndHidePreview()
|
|||||||
emit requestCancelPreview();
|
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();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -82,13 +82,15 @@ private slots:
|
|||||||
void activeChanged();
|
void activeChanged();
|
||||||
void showPreview();
|
void showPreview();
|
||||||
void cancelAndHidePreview();
|
void cancelAndHidePreview();
|
||||||
|
void playSwingEffect();
|
||||||
|
void checkAttentionEffect();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QLabel *m_appNameTips;
|
QLabel *m_appNameTips;
|
||||||
PreviewContainer *m_appPreviewTips;
|
PreviewContainer *m_appPreviewTips;
|
||||||
DockEntryInter *m_itemEntryInter;
|
DockEntryInter *m_itemEntryInter;
|
||||||
|
|
||||||
QGraphicsView *m_itemView;
|
QGraphicsView *m_swingEffectView;
|
||||||
QGraphicsScene *m_itemScene;
|
QGraphicsScene *m_itemScene;
|
||||||
|
|
||||||
bool m_draging;
|
bool m_draging;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user