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