mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-02 15:45:21 +00:00
fix: 任务栏图标动画重叠
任务栏图标拖出任务栏后,从任务栏移除,松开后再加入任务栏。 Log: 修复任务栏图标动画异常的问题。 Bug: https://pms.uniontech.com/zentao/bug-view-59031.html Change-Id: Id8324b01a464255f73570b38c3237cc3bf95291d
This commit is contained in:
parent
8d38378f54
commit
783f097282
@ -137,12 +137,16 @@ void AppDragWidget::mouseMoveEvent(QMouseEvent *event)
|
||||
void AppDragWidget::dragEnterEvent(QDragEnterEvent *event)
|
||||
{
|
||||
event->accept();
|
||||
m_bDragDrop = true;
|
||||
}
|
||||
|
||||
void AppDragWidget::dragMoveEvent(QDragMoveEvent *event)
|
||||
{
|
||||
Q_UNUSED(event);
|
||||
showRemoveTips();
|
||||
if (isRemoveItem() && m_bDragDrop) {
|
||||
emit requestRemoveItem();
|
||||
}
|
||||
}
|
||||
|
||||
const QPoint AppDragWidget::topleftPoint() const
|
||||
@ -191,6 +195,7 @@ const QPoint AppDragWidget::popupMarkPoint(Dock::Position pos)
|
||||
void AppDragWidget::dropEvent(QDropEvent *event)
|
||||
{
|
||||
m_followMouseTimer->stop();
|
||||
m_bDragDrop = false;
|
||||
|
||||
if (isRemoveAble()) {
|
||||
if (DWindowManagerHelper::instance()->hasComposite()) {
|
||||
@ -198,6 +203,7 @@ void AppDragWidget::dropEvent(QDropEvent *event)
|
||||
} else {
|
||||
hide();
|
||||
}
|
||||
emit animationFinished();
|
||||
AppItem *appItem = static_cast<AppItem *>(event->source());
|
||||
appItem->undock();
|
||||
m_popupWindow->setVisible(false);
|
||||
@ -261,6 +267,7 @@ void AppDragWidget::initAnimations()
|
||||
connect(m_animGroup, &QParallelAnimationGroup::stateChanged,
|
||||
this, &AppDragWidget::onRemoveAnimationStateChanged);
|
||||
connect(m_goBackAnim, &QPropertyAnimation::finished, this, &AppDragWidget::hide);
|
||||
connect(m_goBackAnim, &QPropertyAnimation::finished, this, &AppDragWidget::animationFinished);
|
||||
}
|
||||
|
||||
void AppDragWidget::initConfigurations()
|
||||
@ -304,6 +311,13 @@ void AppDragWidget::onRemoveAnimationStateChanged(QAbstractAnimation::State newS
|
||||
hide();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 判断图标拖到一定高度后是否可以移除
|
||||
*
|
||||
* @return true
|
||||
* @return false
|
||||
*/
|
||||
bool AppDragWidget::isRemoveAble()
|
||||
{
|
||||
const QPoint &p = QCursor::pos();
|
||||
@ -334,6 +348,40 @@ bool AppDragWidget::isRemoveAble()
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 判断应用区域图标是否拖出任务栏
|
||||
*
|
||||
* @return true
|
||||
* @return false
|
||||
*/
|
||||
bool AppDragWidget::isRemoveItem()
|
||||
{
|
||||
const QPoint &p = QCursor::pos();
|
||||
switch (m_dockPosition) {
|
||||
case Dock::Position::Left:
|
||||
if ((p.x() > m_dockGeometry.topRight().x())) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case Dock::Position::Top:
|
||||
if ((p.y() > m_dockGeometry.bottomLeft().y())) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case Dock::Position::Right:
|
||||
if ((m_dockGeometry.topLeft().x() > p.x())) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case Dock::Position::Bottom:
|
||||
if ((m_dockGeometry.topLeft().y() > p.y())) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void AppDragWidget::enterEvent(QEvent *event)
|
||||
{
|
||||
if (m_goBackAnim->state() != QPropertyAnimation::State::Running
|
||||
@ -344,7 +392,7 @@ void AppDragWidget::enterEvent(QEvent *event)
|
||||
|
||||
void AppDragWidget::showRemoveTips()
|
||||
{
|
||||
bool model = true;
|
||||
bool model = true;
|
||||
Dock::Position pos = Dock::Position::Bottom;
|
||||
|
||||
DockPopupWindow *popup = m_popupWindow;
|
||||
@ -382,4 +430,4 @@ void AppDragWidget::moveEvent(QMoveEvent *event)
|
||||
{
|
||||
Q_UNUSED(event);
|
||||
showRemoveTips();
|
||||
}
|
||||
}
|
||||
|
@ -49,6 +49,10 @@ public:
|
||||
void setOriginPos(const QPoint position);
|
||||
bool isRemoveAble();
|
||||
|
||||
signals:
|
||||
void requestRemoveItem();
|
||||
void animationFinished();
|
||||
|
||||
protected:
|
||||
void mouseMoveEvent(QMouseEvent *event) override;
|
||||
void dragEnterEvent(QDragEnterEvent *event) override;
|
||||
@ -68,6 +72,7 @@ private:
|
||||
const QPoint popupMarkPoint(Dock::Position pos);
|
||||
const QPoint topleftPoint() const;
|
||||
void showRemoveTips();
|
||||
bool isRemoveItem();
|
||||
|
||||
private:
|
||||
AppGraphicsObject *m_object;
|
||||
@ -90,6 +95,8 @@ private:
|
||||
* dock栏上应用区驻留应用被拖拽远离dock的距离除以dock的宽或者高(更小的一个)的比值
|
||||
*/
|
||||
double m_distanceMultiple;
|
||||
|
||||
bool m_bDragDrop = false; // 图标是否被拖拽
|
||||
};
|
||||
|
||||
#endif /* APPDRAGWIDGET_H */
|
||||
|
@ -402,6 +402,9 @@ void MainPanelControl::moveItem(DockItem *sourceItem, DockItem *targetItem)
|
||||
removeItem(sourceItem);
|
||||
|
||||
// insert new position
|
||||
if (sourceItem->isDragging()) {
|
||||
m_dragIndex = idx;
|
||||
}
|
||||
insertItem(idx, sourceItem);
|
||||
}
|
||||
|
||||
@ -510,8 +513,10 @@ void MainPanelControl::handleDragMove(QDragMoveEvent *e, bool isFilter)
|
||||
|
||||
e->accept();
|
||||
|
||||
if (targetItem == sourceItem)
|
||||
if (targetItem == sourceItem) {
|
||||
m_dragIndex = -1;
|
||||
return;
|
||||
}
|
||||
|
||||
moveItem(sourceItem, targetItem);
|
||||
emit itemMoved(sourceItem, targetItem);
|
||||
@ -686,6 +691,25 @@ void MainPanelControl::startDrag(DockItem *item)
|
||||
m_appDragWidget = nullptr;
|
||||
});
|
||||
|
||||
connect(m_appDragWidget, &AppDragWidget::requestRemoveItem, this, [ = ] {
|
||||
if (-1 != m_appAreaSonLayout->indexOf(item)) {
|
||||
m_dragIndex = m_appAreaSonLayout->indexOf(item);
|
||||
removeItem(item);
|
||||
}
|
||||
});
|
||||
|
||||
connect(m_appDragWidget, &AppDragWidget::animationFinished, this, [ = ] {
|
||||
m_appDragWidget = nullptr;
|
||||
if (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();
|
||||
}
|
||||
});
|
||||
|
||||
appDrag->appDragWidget()->setOriginPos((m_appAreaSonWidget->mapToGlobal(item->pos())));
|
||||
appDrag->appDragWidget()->setDockInfo(m_position, QRect(mapToGlobal(pos()), size()));
|
||||
const QPixmap &dragPix = qobject_cast<AppItem *>(item)->appIcon();
|
||||
@ -709,15 +733,11 @@ void MainPanelControl::startDrag(DockItem *item)
|
||||
drag->setMimeData(new QMimeData);
|
||||
drag->exec(Qt::MoveAction);
|
||||
|
||||
// app关闭特效情况下移除
|
||||
if (item->itemType() == DockItem::App && !DWindowManagerHelper::instance()->hasComposite()) {
|
||||
if (m_appDragWidget->isRemoveAble())
|
||||
qobject_cast<AppItem *>(item)->undock();
|
||||
if (item->itemType() != DockItem::App || m_dragIndex == -1) {
|
||||
m_appDragWidget = nullptr;
|
||||
item->setDraging(false);
|
||||
item->update();
|
||||
}
|
||||
|
||||
m_appDragWidget = nullptr;
|
||||
item->setDraging(false);
|
||||
item->update();
|
||||
}
|
||||
|
||||
DockItem *MainPanelControl::dropTargetItem(DockItem *sourceItem, QPoint point)
|
||||
|
@ -145,6 +145,7 @@ private:
|
||||
bool m_isHover; // 判断鼠标是否移到desktop区域
|
||||
bool m_needRecoveryWin; // 判断鼠标移出desktop区域是否恢复之前窗口
|
||||
bool m_isEnableLaunch; // 判断是否使能了com.deepin.dde.dock.module.launcher
|
||||
int m_dragIndex = -1; // 记录应用区域被拖拽图标的位置
|
||||
};
|
||||
|
||||
#endif // MAINPANELCONTROL_H
|
||||
|
Loading…
x
Reference in New Issue
Block a user