diff --git a/frame/item/components/appdragwidget.cpp b/frame/item/components/appdragwidget.cpp index c6ddcf1bf..1b294b93a 100644 --- a/frame/item/components/appdragwidget.cpp +++ b/frame/item/components/appdragwidget.cpp @@ -38,6 +38,7 @@ AppDragWidget::AppDragWidget(QWidget *parent) , m_popupWindow(new DockPopupWindow(nullptr)) , m_distanceMultiple(Utils::SettingValue("com.deepin.dde.dock.distancemultiple", "/com/deepin/dde/dock/distancemultiple/", "distance-multiple", 1.5).toDouble()) , m_item(nullptr) + , m_cursorPosition(-1, -1) { m_removeTips->setText(tr("Remove")); m_removeTips->setObjectName("AppRemoveTips"); @@ -60,6 +61,8 @@ AppDragWidget::AppDragWidget(QWidget *parent) if (Utils::IS_WAYLAND_DISPLAY) { setWindowFlags(Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint | Qt::Window); setAttribute(Qt::WA_NativeWindow); + } else { + setAcceptDrops(true); } viewport()->setAutoFillBackground(false); setFrameShape(QFrame::NoFrame); @@ -67,8 +70,6 @@ AppDragWidget::AppDragWidget(QWidget *parent) setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setMouseTracking(true); - setAcceptDrops(true); - initAnimations(); m_followMouseTimer->setInterval(16); @@ -89,16 +90,23 @@ void AppDragWidget::mouseMoveEvent(QMouseEvent *event) void AppDragWidget::dragEnterEvent(QDragEnterEvent *event) { - event->accept(); - m_bDragDrop = true; + if (Utils::IS_WAYLAND_DISPLAY) { + QGraphicsView::dragEnterEvent(event); + } else { + event->accept(); + m_bDragDrop = true; + } } void AppDragWidget::dragMoveEvent(QDragMoveEvent *event) { - Q_UNUSED(event); - showRemoveTips(); - if (isRemoveItem() && m_bDragDrop) { - emit requestRemoveItem(); + if (Utils::IS_WAYLAND_DISPLAY) { + QGraphicsView::dragMoveEvent(event); + } else { + showRemoveTips(); + if (isRemoveItem() && m_bDragDrop) { + emit requestRemoveItem(); + } } } @@ -156,23 +164,27 @@ const QPoint AppDragWidget::popupMarkPoint(Dock::Position pos) void AppDragWidget::dropEvent(QDropEvent *event) { - m_followMouseTimer->stop(); - m_bDragDrop = false; - - if (isRemoveAble(QCursor::pos())) { - if (DWindowManagerHelper::instance()->hasComposite()) { - showRemoveAnimation(); - } else { - hide(); - } - AppItem *appItem = static_cast((Utils::IS_WAYLAND_DISPLAY && m_item) ? m_item : event->source()); - appItem->undock(); - m_popupWindow->setVisible(false); + if (Utils::IS_WAYLAND_DISPLAY) { + QGraphicsView::dropEvent(event); } else { - if (DWindowManagerHelper::instance()->hasComposite()) { - showGoBackAnimation(); + m_followMouseTimer->stop(); + m_bDragDrop = false; + + if (isRemoveAble(QCursor::pos())) { + if (DWindowManagerHelper::instance()->hasComposite()) { + showRemoveAnimation(); + } else { + hide(); + } + AppItem *appItem = static_cast((Utils::IS_WAYLAND_DISPLAY && m_item) ? m_item : event->source()); + appItem->undock(); + m_popupWindow->setVisible(false); } else { - hide(); + if (DWindowManagerHelper::instance()->hasComposite()) { + showGoBackAnimation(); + } else { + hide(); + } } } } @@ -384,6 +396,14 @@ void AppDragWidget::enterEvent(QEvent *event) } } +bool AppDragWidget::event(QEvent *event) +{ + if (Utils::IS_WAYLAND_DISPLAY && event->type() == QEvent::DeferredDelete) + requestRemoveSelf(isRemoveAble(m_cursorPosition)); + + return QGraphicsView::event(event); +} + /**显示移除应用提示窗口 * @brief AppDragWidget::showRemoveTips */ @@ -426,4 +446,10 @@ void AppDragWidget::moveEvent(QMoveEvent *event) { Q_UNUSED(event); showRemoveTips(); + if (Utils::IS_WAYLAND_DISPLAY) { + m_cursorPosition = QCursor::pos(); + if (isRemoveItem()) { + emit requestRemoveItem(); + } + } } diff --git a/frame/item/components/appdragwidget.h b/frame/item/components/appdragwidget.h index 63d110805..b199ce760 100644 --- a/frame/item/components/appdragwidget.h +++ b/frame/item/components/appdragwidget.h @@ -81,6 +81,7 @@ private: class AppDragWidget : public QGraphicsView { Q_OBJECT + public: explicit AppDragWidget(QWidget *parent = Q_NULLPTR); @@ -96,6 +97,7 @@ public: signals: void requestRemoveItem(); + void requestRemoveSelf(bool); protected: void mouseMoveEvent(QMouseEvent *event) override; @@ -105,6 +107,7 @@ protected: void hideEvent(QHideEvent *event) override; void moveEvent(QMoveEvent *event) override; void enterEvent(QEvent *event) override; + bool event(QEvent *event) override; private: void initAnimations(); @@ -142,6 +145,7 @@ private: bool m_bDragDrop = false; // 图标是否被拖拽 DockItem *m_item; + QPoint m_cursorPosition; }; #endif /* APPDRAGWIDGET_H */ diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index 9a2c39295..ab692675c 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -739,17 +739,34 @@ void MainPanelControl::startDrag(DockItem *dockItem) m_appDragWidget = appDrag->appDragWidget(); - connect(m_appDragWidget, &AppDragWidget::destroyed, this, [ = ] { - m_appDragWidget = nullptr; - if (!item.isNull() && qobject_cast(item)->isValid()) { - if (-1 == m_appAreaSonLayout->indexOf(item) && m_dragIndex != -1) { - insertItem(m_dragIndex, item); - m_dragIndex = -1; + if (Utils::IS_WAYLAND_DISPLAY) { + connect(m_appDragWidget, &AppDragWidget::requestRemoveSelf, this, [ = ](bool needDelete) { + m_appDragWidget = nullptr; + if (!item.isNull() && qobject_cast(item)->isValid()) { + if (m_dragIndex > -1 && !needDelete) { + insertItem(m_dragIndex, item); + m_dragIndex = -1; + } else { + AppItem *app = static_cast(item.data()); + app->undock(); + } + item->setDraging(false); + item->update(); } - item->setDraging(false); - item->update(); - } - }); + }); + } else { + connect(m_appDragWidget, &AppDragWidget::destroyed, this, [ = ] { + m_appDragWidget = nullptr; + if (!item.isNull() && 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(); + } + }); + } connect(m_appDragWidget, &AppDragWidget::requestRemoveItem, this, [ = ] { if (-1 != m_appAreaSonLayout->indexOf(item)) {