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_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,17 +90,24 @@ void AppDragWidget::mouseMoveEvent(QMouseEvent *event)
void AppDragWidget::dragEnterEvent(QDragEnterEvent *event)
{
if (Utils::IS_WAYLAND_DISPLAY) {
QGraphicsView::dragEnterEvent(event);
} else {
event->accept();
m_bDragDrop = true;
}
}
void AppDragWidget::dragMoveEvent(QDragMoveEvent *event)
{
Q_UNUSED(event);
if (Utils::IS_WAYLAND_DISPLAY) {
QGraphicsView::dragMoveEvent(event);
} else {
showRemoveTips();
if (isRemoveItem() && m_bDragDrop) {
emit requestRemoveItem();
}
}
}
/**获取应用的左上角坐标
@ -156,6 +164,9 @@ const QPoint AppDragWidget::popupMarkPoint(Dock::Position pos)
void AppDragWidget::dropEvent(QDropEvent *event)
{
if (Utils::IS_WAYLAND_DISPLAY) {
QGraphicsView::dropEvent(event);
} else {
m_followMouseTimer->stop();
m_bDragDrop = false;
@ -175,6 +186,7 @@ void AppDragWidget::dropEvent(QDropEvent *event)
hide();
}
}
}
}
void AppDragWidget::hideEvent(QHideEvent *event)
@ -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();
}
}
}

View File

@ -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 */

View File

@ -739,6 +739,22 @@ void MainPanelControl::startDrag(DockItem *dockItem)
m_appDragWidget = appDrag->appDragWidget();
if (Utils::IS_WAYLAND_DISPLAY) {
connect(m_appDragWidget, &AppDragWidget::requestRemoveSelf, this, [ = ](bool needDelete) {
m_appDragWidget = nullptr;
if (!item.isNull() && qobject_cast<AppItem *>(item)->isValid()) {
if (m_dragIndex > -1 && !needDelete) {
insertItem(m_dragIndex, item);
m_dragIndex = -1;
} else {
AppItem *app = static_cast<AppItem *>(item.data());
app->undock();
}
item->setDraging(false);
item->update();
}
});
} else {
connect(m_appDragWidget, &AppDragWidget::destroyed, this, [ = ] {
m_appDragWidget = nullptr;
if (!item.isNull() && qobject_cast<AppItem *>(item)->isValid()) {
@ -750,6 +766,7 @@ void MainPanelControl::startDrag(DockItem *dockItem)
item->update();
}
});
}
connect(m_appDragWidget, &AppDragWidget::requestRemoveItem, this, [ = ] {
if (-1 != m_appAreaSonLayout->indexOf(item)) {