fix: 修复wayland下任务栏无法移除应用程序图标的问题

原因:wayland模式下,AppDragWidget类无法触发拖拽事件导致无法移除(具体原因未知)
解决:AppDragWidget类监听move事件,结束后通过信号的方式在mainpanelcontrol类中来实现移除的功能

Log:
Influence: wayland模式下从任务栏移除应用图标
Bug: https://pms.uniontech.com/bug-view-126423.html
Change-Id: I8ad28cc0a5a5f854b51448d83d6c378114a026bd
This commit is contained in:
donghualin 2022-04-25 10:05:23 +08:00
parent 7f9088ba83
commit 810ed44f31
3 changed files with 80 additions and 33 deletions

View File

@ -38,6 +38,7 @@ AppDragWidget::AppDragWidget(QWidget *parent)
, m_popupWindow(new DockPopupWindow(nullptr)) , 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_distanceMultiple(Utils::SettingValue("com.deepin.dde.dock.distancemultiple", "/com/deepin/dde/dock/distancemultiple/", "distance-multiple", 1.5).toDouble())
, m_item(nullptr) , m_item(nullptr)
, m_cursorPosition(-1, -1)
{ {
m_removeTips->setText(tr("Remove")); m_removeTips->setText(tr("Remove"));
m_removeTips->setObjectName("AppRemoveTips"); m_removeTips->setObjectName("AppRemoveTips");
@ -60,6 +61,8 @@ AppDragWidget::AppDragWidget(QWidget *parent)
if (Utils::IS_WAYLAND_DISPLAY) { if (Utils::IS_WAYLAND_DISPLAY) {
setWindowFlags(Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint | Qt::Window); setWindowFlags(Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint | Qt::Window);
setAttribute(Qt::WA_NativeWindow); setAttribute(Qt::WA_NativeWindow);
} else {
setAcceptDrops(true);
} }
viewport()->setAutoFillBackground(false); viewport()->setAutoFillBackground(false);
setFrameShape(QFrame::NoFrame); setFrameShape(QFrame::NoFrame);
@ -67,8 +70,6 @@ AppDragWidget::AppDragWidget(QWidget *parent)
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setMouseTracking(true); setMouseTracking(true);
setAcceptDrops(true);
initAnimations(); initAnimations();
m_followMouseTimer->setInterval(16); m_followMouseTimer->setInterval(16);
@ -89,16 +90,23 @@ void AppDragWidget::mouseMoveEvent(QMouseEvent *event)
void AppDragWidget::dragEnterEvent(QDragEnterEvent *event) void AppDragWidget::dragEnterEvent(QDragEnterEvent *event)
{ {
event->accept(); if (Utils::IS_WAYLAND_DISPLAY) {
m_bDragDrop = true; QGraphicsView::dragEnterEvent(event);
} else {
event->accept();
m_bDragDrop = true;
}
} }
void AppDragWidget::dragMoveEvent(QDragMoveEvent *event) void AppDragWidget::dragMoveEvent(QDragMoveEvent *event)
{ {
Q_UNUSED(event); if (Utils::IS_WAYLAND_DISPLAY) {
showRemoveTips(); QGraphicsView::dragMoveEvent(event);
if (isRemoveItem() && m_bDragDrop) { } else {
emit requestRemoveItem(); showRemoveTips();
if (isRemoveItem() && m_bDragDrop) {
emit requestRemoveItem();
}
} }
} }
@ -156,23 +164,27 @@ const QPoint AppDragWidget::popupMarkPoint(Dock::Position pos)
void AppDragWidget::dropEvent(QDropEvent *event) void AppDragWidget::dropEvent(QDropEvent *event)
{ {
m_followMouseTimer->stop(); if (Utils::IS_WAYLAND_DISPLAY) {
m_bDragDrop = false; QGraphicsView::dropEvent(event);
if (isRemoveAble(QCursor::pos())) {
if (DWindowManagerHelper::instance()->hasComposite()) {
showRemoveAnimation();
} else {
hide();
}
AppItem *appItem = static_cast<AppItem *>((Utils::IS_WAYLAND_DISPLAY && m_item) ? m_item : event->source());
appItem->undock();
m_popupWindow->setVisible(false);
} else { } else {
if (DWindowManagerHelper::instance()->hasComposite()) { m_followMouseTimer->stop();
showGoBackAnimation(); m_bDragDrop = false;
if (isRemoveAble(QCursor::pos())) {
if (DWindowManagerHelper::instance()->hasComposite()) {
showRemoveAnimation();
} else {
hide();
}
AppItem *appItem = static_cast<AppItem *>((Utils::IS_WAYLAND_DISPLAY && m_item) ? m_item : event->source());
appItem->undock();
m_popupWindow->setVisible(false);
} else { } 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 * @brief AppDragWidget::showRemoveTips
*/ */
@ -426,4 +446,10 @@ void AppDragWidget::moveEvent(QMoveEvent *event)
{ {
Q_UNUSED(event); Q_UNUSED(event);
showRemoveTips(); showRemoveTips();
if (Utils::IS_WAYLAND_DISPLAY) {
m_cursorPosition = QCursor::pos();
if (isRemoveItem()) {
emit requestRemoveItem();
}
}
} }

View File

@ -81,6 +81,7 @@ private:
class AppDragWidget : public QGraphicsView class AppDragWidget : public QGraphicsView
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit AppDragWidget(QWidget *parent = Q_NULLPTR); explicit AppDragWidget(QWidget *parent = Q_NULLPTR);
@ -96,6 +97,7 @@ public:
signals: signals:
void requestRemoveItem(); void requestRemoveItem();
void requestRemoveSelf(bool);
protected: protected:
void mouseMoveEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override;
@ -105,6 +107,7 @@ protected:
void hideEvent(QHideEvent *event) override; void hideEvent(QHideEvent *event) override;
void moveEvent(QMoveEvent *event) override; void moveEvent(QMoveEvent *event) override;
void enterEvent(QEvent *event) override; void enterEvent(QEvent *event) override;
bool event(QEvent *event) override;
private: private:
void initAnimations(); void initAnimations();
@ -142,6 +145,7 @@ private:
bool m_bDragDrop = false; // 图标是否被拖拽 bool m_bDragDrop = false; // 图标是否被拖拽
DockItem *m_item; DockItem *m_item;
QPoint m_cursorPosition;
}; };
#endif /* APPDRAGWIDGET_H */ #endif /* APPDRAGWIDGET_H */

View File

@ -739,17 +739,34 @@ void MainPanelControl::startDrag(DockItem *dockItem)
m_appDragWidget = appDrag->appDragWidget(); m_appDragWidget = appDrag->appDragWidget();
connect(m_appDragWidget, &AppDragWidget::destroyed, this, [ = ] { if (Utils::IS_WAYLAND_DISPLAY) {
m_appDragWidget = nullptr; connect(m_appDragWidget, &AppDragWidget::requestRemoveSelf, this, [ = ](bool needDelete) {
if (!item.isNull() && qobject_cast<AppItem *>(item)->isValid()) { m_appDragWidget = nullptr;
if (-1 == m_appAreaSonLayout->indexOf(item) && m_dragIndex != -1) { if (!item.isNull() && qobject_cast<AppItem *>(item)->isValid()) {
insertItem(m_dragIndex, item); if (m_dragIndex > -1 && !needDelete) {
m_dragIndex = -1; insertItem(m_dragIndex, item);
m_dragIndex = -1;
} else {
AppItem *app = static_cast<AppItem *>(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<AppItem *>(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, [ = ] { connect(m_appDragWidget, &AppDragWidget::requestRemoveItem, this, [ = ] {
if (-1 != m_appAreaSonLayout->indexOf(item)) { if (-1 != m_appAreaSonLayout->indexOf(item)) {