mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-03 00:15:21 +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_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();
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user