fix: 图标被异常移除

原因:开始拖动的时候没有获取图标的位置,在不移除的情况下找不到图标正确的位置,进而移除了图标
解决方案:在开始拖动图标的时候记录一下当前图标的位置,如果图标的位置没有被改变,拖动完成后会插入到之前的位置。

Log: 修复图标异常移除的问题
Bug: https://pms.uniontech.com/bug-view-129165.html
Influence: 拖动图标的场景(特别是wayland环境下)
Change-Id: Ic17730be4c17db527005ae52e181a196a11c0f80
This commit is contained in:
殷杰 2022-05-09 13:13:55 +08:00 committed by wubw
parent 9f1e7cd885
commit f4a42d5e57
2 changed files with 31 additions and 17 deletions

View File

@ -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<AppItem *>(item)->isValid()) {

View File

@ -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;