From f4a42d5e57ef7e614a0e4fe7e48050694da8ab7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AE=B7=E6=9D=B0?= Date: Mon, 9 May 2022 13:13:55 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=9B=BE=E6=A0=87=E8=A2=AB=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E7=A7=BB=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原因:开始拖动的时候没有获取图标的位置,在不移除的情况下找不到图标正确的位置,进而移除了图标 解决方案:在开始拖动图标的时候记录一下当前图标的位置,如果图标的位置没有被改变,拖动完成后会插入到之前的位置。 Log: 修复图标异常移除的问题 Bug: https://pms.uniontech.com/bug-view-129165.html Influence: 拖动图标的场景(特别是wayland环境下) Change-Id: Ic17730be4c17db527005ae52e181a196a11c0f80 --- frame/window/mainpanelcontrol.cpp | 44 ++++++++++++++++++++----------- frame/window/mainpanelcontrol.h | 4 ++- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/frame/window/mainpanelcontrol.cpp b/frame/window/mainpanelcontrol.cpp index 815b810a3..fda6a303b 100755 --- a/frame/window/mainpanelcontrol.cpp +++ b/frame/window/mainpanelcontrol.cpp @@ -440,22 +440,8 @@ void MainPanelControl::removeItem(DockItem *item) void MainPanelControl::moveItem(DockItem *sourceItem, DockItem *targetItem) { // get target index - int idx = -1; - if (targetItem->itemType() == DockItem::App) - idx = m_appAreaSonLayout->indexOf(targetItem); - else if (targetItem->itemType() == DockItem::Plugins){ - //因为日期时间插件大小和其他插件大小有异,为了设置边距,在各插件中增加了一层布局 - //因此有拖动图标时,需要从多的一层布局中判断是否相同插件而获取插件位置顺序 - for (int i = 0; i < m_pluginLayout->count(); ++i) { - QLayout *layout = m_pluginLayout->itemAt(i)->layout(); - if (layout && layout->itemAt(0)->widget() == targetItem) { - idx = i; - break; - } - } - } else if (targetItem->itemType() == DockItem::FixedPlugin) - idx = m_fixedAreaLayout->indexOf(targetItem); - else + int idx = getItemIndex(targetItem); + if (-1 == idx) return; // remove old item @@ -468,6 +454,31 @@ void MainPanelControl::moveItem(DockItem *sourceItem, DockItem *targetItem) insertItem(idx, sourceItem); } +int MainPanelControl::getItemIndex(DockItem *targetItem) const +{ + if (!targetItem) + return -1; + + if (targetItem->itemType() == DockItem::App) + return m_appAreaSonLayout->indexOf(targetItem); + + if (targetItem->itemType() == DockItem::Plugins){ + //因为日期时间插件大小和其他插件大小有异,为了设置边距,在各插件中增加了一层布局 + //因此有拖动图标时,需要从多的一层布局中判断是否相同插件而获取插件位置顺序 + for (int i = 0; i < m_pluginLayout->count(); ++i) { + QLayout *layout = m_pluginLayout->itemAt(i)->layout(); + if (layout && layout->itemAt(0)->widget() == targetItem) { + return i; + } + } + } + + if (targetItem->itemType() == DockItem::FixedPlugin) + return m_fixedAreaLayout->indexOf(targetItem); + + return -1; +} + void MainPanelControl::dragEnterEvent(QDragEnterEvent *e) { //拖拽图标到任务栏时,如果拖拽到垃圾箱插件图标widget上,则默认不允许拖拽,其他位置默认为允许拖拽 @@ -740,6 +751,7 @@ void MainPanelControl::startDrag(DockItem *dockItem) m_appDragWidget = appDrag->appDragWidget(); if (Utils::IS_WAYLAND_DISPLAY) { + m_dragIndex = getItemIndex(dockItem); connect(m_appDragWidget, &AppDragWidget::requestRemoveSelf, this, [ = ](bool needDelete) { m_appDragWidget = nullptr; if (!item.isNull() && qobject_cast(item)->isValid()) { diff --git a/frame/window/mainpanelcontrol.h b/frame/window/mainpanelcontrol.h index 288e4b74a..a639c71b2 100755 --- a/frame/window/mainpanelcontrol.h +++ b/frame/window/mainpanelcontrol.h @@ -83,7 +83,9 @@ private: void resizeDesktopWidget(); bool checkNeedShowDesktop(); bool appIsOnDock(const QString &appDesktop); - + + int getItemIndex(DockItem *targetItem) const; + protected: void dragMoveEvent(QDragMoveEvent *e) override; void dragEnterEvent(QDragEnterEvent *e) override;