fix: 任务栏图标动画重叠

任务栏图标拖出任务栏后,从任务栏移除,松开后再加入任务栏。

Log: 修复任务栏图标动画异常的问题。
Bug: https://pms.uniontech.com/zentao/bug-view-59031.html
Change-Id: Id8324b01a464255f73570b38c3237cc3bf95291d
This commit is contained in:
Zhang Qipeng 2021-01-05 12:45:46 +08:00
parent 8d38378f54
commit 783f097282
4 changed files with 87 additions and 11 deletions

View File

@ -137,12 +137,16 @@ void AppDragWidget::mouseMoveEvent(QMouseEvent *event)
void AppDragWidget::dragEnterEvent(QDragEnterEvent *event)
{
event->accept();
m_bDragDrop = true;
}
void AppDragWidget::dragMoveEvent(QDragMoveEvent *event)
{
Q_UNUSED(event);
showRemoveTips();
if (isRemoveItem() && m_bDragDrop) {
emit requestRemoveItem();
}
}
const QPoint AppDragWidget::topleftPoint() const
@ -191,6 +195,7 @@ const QPoint AppDragWidget::popupMarkPoint(Dock::Position pos)
void AppDragWidget::dropEvent(QDropEvent *event)
{
m_followMouseTimer->stop();
m_bDragDrop = false;
if (isRemoveAble()) {
if (DWindowManagerHelper::instance()->hasComposite()) {
@ -198,6 +203,7 @@ void AppDragWidget::dropEvent(QDropEvent *event)
} else {
hide();
}
emit animationFinished();
AppItem *appItem = static_cast<AppItem *>(event->source());
appItem->undock();
m_popupWindow->setVisible(false);
@ -261,6 +267,7 @@ void AppDragWidget::initAnimations()
connect(m_animGroup, &QParallelAnimationGroup::stateChanged,
this, &AppDragWidget::onRemoveAnimationStateChanged);
connect(m_goBackAnim, &QPropertyAnimation::finished, this, &AppDragWidget::hide);
connect(m_goBackAnim, &QPropertyAnimation::finished, this, &AppDragWidget::animationFinished);
}
void AppDragWidget::initConfigurations()
@ -304,6 +311,13 @@ void AppDragWidget::onRemoveAnimationStateChanged(QAbstractAnimation::State newS
hide();
}
}
/**
* @brief
*
* @return true
* @return false
*/
bool AppDragWidget::isRemoveAble()
{
const QPoint &p = QCursor::pos();
@ -334,6 +348,40 @@ bool AppDragWidget::isRemoveAble()
return false;
}
/**
* @brief
*
* @return true
* @return false
*/
bool AppDragWidget::isRemoveItem()
{
const QPoint &p = QCursor::pos();
switch (m_dockPosition) {
case Dock::Position::Left:
if ((p.x() > m_dockGeometry.topRight().x())) {
return true;
}
break;
case Dock::Position::Top:
if ((p.y() > m_dockGeometry.bottomLeft().y())) {
return true;
}
break;
case Dock::Position::Right:
if ((m_dockGeometry.topLeft().x() > p.x())) {
return true;
}
break;
case Dock::Position::Bottom:
if ((m_dockGeometry.topLeft().y() > p.y())) {
return true;
}
break;
}
return false;
}
void AppDragWidget::enterEvent(QEvent *event)
{
if (m_goBackAnim->state() != QPropertyAnimation::State::Running
@ -344,7 +392,7 @@ void AppDragWidget::enterEvent(QEvent *event)
void AppDragWidget::showRemoveTips()
{
bool model = true;
bool model = true;
Dock::Position pos = Dock::Position::Bottom;
DockPopupWindow *popup = m_popupWindow;
@ -382,4 +430,4 @@ void AppDragWidget::moveEvent(QMoveEvent *event)
{
Q_UNUSED(event);
showRemoveTips();
}
}

View File

@ -49,6 +49,10 @@ public:
void setOriginPos(const QPoint position);
bool isRemoveAble();
signals:
void requestRemoveItem();
void animationFinished();
protected:
void mouseMoveEvent(QMouseEvent *event) override;
void dragEnterEvent(QDragEnterEvent *event) override;
@ -68,6 +72,7 @@ private:
const QPoint popupMarkPoint(Dock::Position pos);
const QPoint topleftPoint() const;
void showRemoveTips();
bool isRemoveItem();
private:
AppGraphicsObject *m_object;
@ -90,6 +95,8 @@ private:
* dock栏上应用区驻留应用被拖拽远离dock的距离除以dock的宽或者高
*/
double m_distanceMultiple;
bool m_bDragDrop = false; // 图标是否被拖拽
};
#endif /* APPDRAGWIDGET_H */

View File

@ -402,6 +402,9 @@ void MainPanelControl::moveItem(DockItem *sourceItem, DockItem *targetItem)
removeItem(sourceItem);
// insert new position
if (sourceItem->isDragging()) {
m_dragIndex = idx;
}
insertItem(idx, sourceItem);
}
@ -510,8 +513,10 @@ void MainPanelControl::handleDragMove(QDragMoveEvent *e, bool isFilter)
e->accept();
if (targetItem == sourceItem)
if (targetItem == sourceItem) {
m_dragIndex = -1;
return;
}
moveItem(sourceItem, targetItem);
emit itemMoved(sourceItem, targetItem);
@ -686,6 +691,25 @@ void MainPanelControl::startDrag(DockItem *item)
m_appDragWidget = nullptr;
});
connect(m_appDragWidget, &AppDragWidget::requestRemoveItem, this, [ = ] {
if (-1 != m_appAreaSonLayout->indexOf(item)) {
m_dragIndex = m_appAreaSonLayout->indexOf(item);
removeItem(item);
}
});
connect(m_appDragWidget, &AppDragWidget::animationFinished, this, [ = ] {
m_appDragWidget = nullptr;
if (qobject_cast<AppItem *>(item)->isValid()) {
if (-1 == m_appAreaSonLayout->indexOf(item) && m_dragIndex != -1) {
insertItem(m_dragIndex, item);
m_dragIndex = -1;
}
item->setDraging(false);
item->update();
}
});
appDrag->appDragWidget()->setOriginPos((m_appAreaSonWidget->mapToGlobal(item->pos())));
appDrag->appDragWidget()->setDockInfo(m_position, QRect(mapToGlobal(pos()), size()));
const QPixmap &dragPix = qobject_cast<AppItem *>(item)->appIcon();
@ -709,15 +733,11 @@ void MainPanelControl::startDrag(DockItem *item)
drag->setMimeData(new QMimeData);
drag->exec(Qt::MoveAction);
// app关闭特效情况下移除
if (item->itemType() == DockItem::App && !DWindowManagerHelper::instance()->hasComposite()) {
if (m_appDragWidget->isRemoveAble())
qobject_cast<AppItem *>(item)->undock();
if (item->itemType() != DockItem::App || m_dragIndex == -1) {
m_appDragWidget = nullptr;
item->setDraging(false);
item->update();
}
m_appDragWidget = nullptr;
item->setDraging(false);
item->update();
}
DockItem *MainPanelControl::dropTargetItem(DockItem *sourceItem, QPoint point)

View File

@ -145,6 +145,7 @@ private:
bool m_isHover; // 判断鼠标是否移到desktop区域
bool m_needRecoveryWin; // 判断鼠标移出desktop区域是否恢复之前窗口
bool m_isEnableLaunch; // 判断是否使能了com.deepin.dde.dock.module.launcher
int m_dragIndex = -1; // 记录应用区域被拖拽图标的位置
};
#endif // MAINPANELCONTROL_H