2023-02-16 13:51:55 +08:00
|
|
|
|
// Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd.
|
|
|
|
|
// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd.
|
2022-09-06 11:36:55 +08:00
|
|
|
|
//
|
|
|
|
|
// SPDX-License-Identifier: LGPL-3.0-or-later
|
2018-06-04 21:09:41 +08:00
|
|
|
|
|
|
|
|
|
#ifndef APPDRAGWIDGET_H
|
|
|
|
|
#define APPDRAGWIDGET_H
|
|
|
|
|
|
|
|
|
|
#include "constants.h"
|
2022-08-12 08:13:00 +00:00
|
|
|
|
#include "screenspliter.h"
|
|
|
|
|
#include "utils.h"
|
2018-06-04 21:09:41 +08:00
|
|
|
|
|
|
|
|
|
#include <QPixmap>
|
|
|
|
|
#include <QGraphicsObject>
|
|
|
|
|
#include <QGraphicsView>
|
|
|
|
|
#include <QPainter>
|
|
|
|
|
#include <QMouseEvent>
|
|
|
|
|
#include <QTimer>
|
|
|
|
|
#include <QPropertyAnimation>
|
|
|
|
|
#include <QParallelAnimationGroup>
|
2021-03-05 14:41:04 +08:00
|
|
|
|
#include <QWidget>
|
|
|
|
|
|
2020-07-24 09:37:39 +08:00
|
|
|
|
#include "../widgets/tipswidget.h"
|
2020-12-16 17:38:41 +08:00
|
|
|
|
#include "dockpopupwindow.h"
|
2021-11-05 21:23:22 +08:00
|
|
|
|
#include "dockitem.h"
|
2018-06-04 21:09:41 +08:00
|
|
|
|
|
2022-08-12 08:13:00 +00:00
|
|
|
|
class QDrag;
|
|
|
|
|
class DockScreen;
|
|
|
|
|
|
2021-08-25 21:03:30 +08:00
|
|
|
|
class AppGraphicsObject : public QGraphicsObject
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
explicit AppGraphicsObject(QGraphicsItem *parent = Q_NULLPTR)
|
|
|
|
|
: QGraphicsObject(parent) {}
|
|
|
|
|
~AppGraphicsObject() override {}
|
|
|
|
|
|
|
|
|
|
void setAppPixmap(QPixmap pix)
|
|
|
|
|
{
|
|
|
|
|
m_appPixmap = pix;
|
|
|
|
|
resetProperty();
|
|
|
|
|
update();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void resetProperty()
|
|
|
|
|
{
|
|
|
|
|
setScale(1.0);
|
|
|
|
|
setRotation(0);
|
|
|
|
|
setOpacity(1.0);
|
|
|
|
|
update();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QRectF boundingRect() const override
|
|
|
|
|
{
|
|
|
|
|
return m_appPixmap.rect();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = Q_NULLPTR) override {
|
|
|
|
|
Q_UNUSED(option);
|
|
|
|
|
Q_UNUSED(widget);
|
|
|
|
|
|
|
|
|
|
Q_ASSERT(!m_appPixmap.isNull());
|
|
|
|
|
|
|
|
|
|
painter->drawPixmap(QPoint(0, 0), m_appPixmap);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
QPixmap m_appPixmap;
|
|
|
|
|
};
|
|
|
|
|
|
2018-06-04 21:09:41 +08:00
|
|
|
|
class AppDragWidget : public QGraphicsView
|
|
|
|
|
{
|
2020-08-04 15:36:21 +08:00
|
|
|
|
Q_OBJECT
|
2022-04-25 10:05:23 +08:00
|
|
|
|
|
2018-06-04 21:09:41 +08:00
|
|
|
|
public:
|
2021-03-20 12:10:45 +08:00
|
|
|
|
explicit AppDragWidget(QWidget *parent = Q_NULLPTR);
|
2018-06-04 21:09:41 +08:00
|
|
|
|
|
2022-08-12 08:13:00 +00:00
|
|
|
|
void execFinished();
|
2018-06-04 21:09:41 +08:00
|
|
|
|
void setAppPixmap(const QPixmap &pix);
|
|
|
|
|
void setDockInfo(Dock::Position dockPosition, const QRect &dockGeometry);
|
2019-01-17 11:00:40 +08:00
|
|
|
|
void setOriginPos(const QPoint position);
|
2021-11-05 21:23:22 +08:00
|
|
|
|
void setPixmapOpacity(qreal opacity);
|
|
|
|
|
void setItem(DockItem *item) { m_item = item; }
|
|
|
|
|
void showRemoveAnimation();
|
|
|
|
|
void showGoBackAnimation();
|
2018-06-04 21:09:41 +08:00
|
|
|
|
|
2021-01-05 12:45:46 +08:00
|
|
|
|
signals:
|
2022-08-12 08:13:00 +00:00
|
|
|
|
void requestChangedArea(QRect);
|
|
|
|
|
void requestSplitWindow(ScreenSpliter::SplitDirection);
|
2021-01-05 12:45:46 +08:00
|
|
|
|
|
2018-06-04 21:09:41 +08:00
|
|
|
|
protected:
|
2020-06-13 19:19:30 +08:00
|
|
|
|
void mouseMoveEvent(QMouseEvent *event) override;
|
|
|
|
|
void dragEnterEvent(QDragEnterEvent *event) override;
|
|
|
|
|
void dragMoveEvent(QDragMoveEvent *event) override;
|
|
|
|
|
void dropEvent(QDropEvent *event) override;
|
|
|
|
|
void hideEvent(QHideEvent *event) override;
|
2020-09-19 21:20:35 +08:00
|
|
|
|
void enterEvent(QEvent *event) override;
|
2018-06-04 21:09:41 +08:00
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
void initAnimations();
|
|
|
|
|
void onRemoveAnimationStateChanged(QAbstractAnimation::State newState,
|
|
|
|
|
QAbstractAnimation::State oldState);
|
2020-07-24 09:37:39 +08:00
|
|
|
|
const QPoint popupMarkPoint(Dock::Position pos);
|
|
|
|
|
const QPoint topleftPoint() const;
|
2022-08-12 08:13:00 +00:00
|
|
|
|
bool canSplitWindow(const QPoint &pos) const;
|
|
|
|
|
ScreenSpliter::SplitDirection splitPosition() const;
|
|
|
|
|
QRect splitGeometry(const QPoint &pos) const;
|
|
|
|
|
void initWaylandEnv();
|
|
|
|
|
|
|
|
|
|
void dropHandler(const QPoint &pos);
|
|
|
|
|
void moveHandler(const QPoint &pos);
|
|
|
|
|
void moveCurrent(const QPoint &destPos);
|
|
|
|
|
void adjustDesktopGeometry(QRect &rect) const;
|
2018-06-04 21:09:41 +08:00
|
|
|
|
|
2021-08-25 21:03:30 +08:00
|
|
|
|
private Q_SLOTS:
|
|
|
|
|
void onFollowMouse();
|
2022-08-12 08:13:00 +00:00
|
|
|
|
void onButtonRelease(int, int x, int y, const QString &);
|
|
|
|
|
void onCursorMove(int x, int y, const QString &);
|
2021-08-25 21:03:30 +08:00
|
|
|
|
|
2022-05-12 17:35:50 +08:00
|
|
|
|
protected:
|
2021-08-25 21:03:30 +08:00
|
|
|
|
QScopedPointer<AppGraphicsObject> m_object;
|
2018-06-04 21:09:41 +08:00
|
|
|
|
QGraphicsScene *m_scene;
|
|
|
|
|
QTimer *m_followMouseTimer;
|
|
|
|
|
QPropertyAnimation *m_animScale;
|
|
|
|
|
QPropertyAnimation *m_animRotation;
|
|
|
|
|
QPropertyAnimation *m_animOpacity;
|
|
|
|
|
QParallelAnimationGroup *m_animGroup;
|
2019-01-17 11:00:40 +08:00
|
|
|
|
QPropertyAnimation *m_goBackAnim;
|
2018-06-04 21:09:41 +08:00
|
|
|
|
|
|
|
|
|
Dock::Position m_dockPosition;
|
|
|
|
|
QRect m_dockGeometry;
|
2019-01-17 11:00:40 +08:00
|
|
|
|
QPoint m_originPoint;
|
2020-08-18 16:41:25 +08:00
|
|
|
|
QSize m_iconSize;
|
2021-09-08 15:22:04 +08:00
|
|
|
|
QScopedPointer<DockPopupWindow> m_popupWindow;
|
2020-07-24 09:37:39 +08:00
|
|
|
|
/**
|
|
|
|
|
* @brief m_distanceMultiple: 倍数
|
|
|
|
|
* dock栏上应用区驻留应用被拖拽远离dock的距离除以dock的宽或者高(更小的一个)的比值
|
|
|
|
|
*/
|
|
|
|
|
double m_distanceMultiple;
|
2021-01-05 12:45:46 +08:00
|
|
|
|
|
|
|
|
|
bool m_bDragDrop = false; // 图标是否被拖拽
|
2021-11-05 21:23:22 +08:00
|
|
|
|
DockItem *m_item;
|
2022-08-12 08:13:00 +00:00
|
|
|
|
QRect m_lastMouseGeometry;
|
|
|
|
|
DockScreen *m_dockScreen;
|
2018-06-04 21:09:41 +08:00
|
|
|
|
};
|
|
|
|
|
|
2022-05-12 17:35:50 +08:00
|
|
|
|
class QuickDragWidget : public AppDragWidget
|
|
|
|
|
{
|
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
|
|
Q_SIGNALS:
|
2022-05-30 20:29:53 +08:00
|
|
|
|
void requestDropItem(QDropEvent *);
|
|
|
|
|
void requestDragMove(QDragMoveEvent *);
|
2022-05-12 17:35:50 +08:00
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
explicit QuickDragWidget(QWidget *parent = Q_NULLPTR);
|
|
|
|
|
~QuickDragWidget() override;
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
void dropEvent(QDropEvent *event) override;
|
|
|
|
|
void dragMoveEvent(QDragMoveEvent *event) override;
|
2022-08-12 08:13:00 +00:00
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
bool isRemoveAble(const QPoint &curPos);
|
2018-06-04 21:09:41 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif /* APPDRAGWIDGET_H */
|