From 783f0972826d04f30bcb6a63b4cc21dd27c4eff6 Mon Sep 17 00:00:00 2001 From: Zhang Qipeng Date: Tue, 5 Jan 2021 12:45:46 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BB=BB=E5=8A=A1=E6=A0=8F=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E5=8A=A8=E7=94=BB=E9=87=8D=E5=8F=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 任务栏图标拖出任务栏后,从任务栏移除,松开后再加入任务栏。 Log: 修复任务栏图标动画异常的问题。 Bug: https://pms.uniontech.com/zentao/bug-view-59031.html Change-Id: Id8324b01a464255f73570b38c3237cc3bf95291d --- frame/item/components/appdragwidget.cpp | 52 ++++++++++++++++++++++++- frame/item/components/appdragwidget.h | 7 ++++ frame/panel/mainpanelcontrol.cpp | 38 +++++++++++++----- frame/panel/mainpanelcontrol.h | 1 + 4 files changed, 87 insertions(+), 11 deletions(-) diff --git a/frame/item/components/appdragwidget.cpp b/frame/item/components/appdragwidget.cpp index 473318e39..6f4aed3ff 100644 --- a/frame/item/components/appdragwidget.cpp +++ b/frame/item/components/appdragwidget.cpp @@ -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(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(); -} \ No newline at end of file +} diff --git a/frame/item/components/appdragwidget.h b/frame/item/components/appdragwidget.h index 888fc22d3..130b02cf5 100644 --- a/frame/item/components/appdragwidget.h +++ b/frame/item/components/appdragwidget.h @@ -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 */ diff --git a/frame/panel/mainpanelcontrol.cpp b/frame/panel/mainpanelcontrol.cpp index 1a06e0598..99746d82d 100755 --- a/frame/panel/mainpanelcontrol.cpp +++ b/frame/panel/mainpanelcontrol.cpp @@ -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(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(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(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) diff --git a/frame/panel/mainpanelcontrol.h b/frame/panel/mainpanelcontrol.h index 215528f8b..6ca8b7fa7 100755 --- a/frame/panel/mainpanelcontrol.h +++ b/frame/panel/mainpanelcontrol.h @@ -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