mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-04 17:33:05 +00:00
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:
parent
7f9088ba83
commit
810ed44f31
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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 */
|
||||
|
@ -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)) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user