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_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();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 */
|
||||||
|
@ -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)) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user