feat: 任务栏单指长按支持拖动

任务栏图标拖动需要单指长按超过200ms后(后端提供判断信号),才可进行

Log: 根据后端长按信号,任务栏图标单指长按超过200ms后才可拖动
Task: https://pms.uniontech.com/zentao/task-view-30976.html
Change-Id: Ia75e7b09b7ea2421089a0e5b8be4ff9a5049bae3
Reviewed-on: http://gerrit.uniontech.com/c/dde-dock/+/864
Reviewed-by: <mailman@uniontech.com>
Reviewed-by: wangwei <wangwei@uniontech.com>
Reviewed-by: niecheng <niecheng@uniontech.com>
Tested-by: <mailman@uniontech.com>
This commit is contained in:
liuxing 2020-07-27 14:32:49 +08:00
parent 1a455503d9
commit 31663a9ded
4 changed files with 49 additions and 1 deletions

View File

@ -77,6 +77,8 @@ MainPanelControl::MainPanelControl(QWidget *parent)
, m_isHover(false) , m_isHover(false)
, m_needRecoveryWin(false) , m_needRecoveryWin(false)
, m_isEnableLaunch(true) , m_isEnableLaunch(true)
, m_longPressed(false)
, m_gestureInter(new Gesture("com.deepin.daemon.Gesture", "/com/deepin/daemon/Gesture", QDBusConnection::systemBus(), this))
{ {
init(); init();
updateMainPanelLayout(); updateMainPanelLayout();
@ -95,6 +97,14 @@ MainPanelControl::MainPanelControl(QWidget *parent)
m_fixedSpliter->setFixedSize(0,0); m_fixedSpliter->setFixedSize(0,0);
m_appSpliter ->setFixedSize(0,0); m_appSpliter ->setFixedSize(0,0);
m_traySpliter->setFixedSize(0,0); m_traySpliter->setFixedSize(0,0);
// 根据后端延迟触屏信号控制是否可进行图标拖动,收到延迟触屏信号可拖动,没有收到延迟触屏信号、点击松开就不可拖动
connect(m_gestureInter, &Gesture::TouchSinglePressTimeout, this, [this]{
m_longPressed = true;
});
connect(m_gestureInter, &Gesture::TouchUpOrCancel, this, [this]{
m_longPressed = false;
});
} }
MainPanelControl::~MainPanelControl() MainPanelControl::~MainPanelControl()
@ -611,7 +621,7 @@ bool MainPanelControl::eventFilter(QObject *watched, QEvent *event)
if (event->type() != QEvent::MouseMove) if (event->type() != QEvent::MouseMove)
return false; return false;
QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event); QMouseEvent *mouseEvent = dynamic_cast<QMouseEvent *>(event);
if (!mouseEvent || mouseEvent->buttons() != Qt::LeftButton) if (!mouseEvent || mouseEvent->buttons() != Qt::LeftButton)
return false; return false;
@ -627,6 +637,11 @@ bool MainPanelControl::eventFilter(QObject *watched, QEvent *event)
if (distance.manhattanLength() < QApplication::startDragDistance()) if (distance.manhattanLength() < QApplication::startDragDistance())
return false; return false;
// source为MouseEventSynthesizedByQt时事件由触屏事件转换而来触屏没有收到后端的延迟触屏信号时不进行拖动
if (mouseEvent->source() == Qt::MouseEventSynthesizedByQt && !m_longPressed) {
return false;
}
startDrag(item); startDrag(item);
return QWidget::eventFilter(watched, event); return QWidget::eventFilter(watched, event);

View File

@ -28,7 +28,10 @@
#include <QBoxLayout> #include <QBoxLayout>
#include <QLabel> #include <QLabel>
#include <com_deepin_daemon_gesture.h>
using namespace Dock; using namespace Dock;
using Gesture = com::deepin::daemon::Gesture;
class TrayPluginItem; class TrayPluginItem;
class PluginsItem; class PluginsItem;
@ -142,6 +145,10 @@ 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
// 保存触控屏长按状态
bool m_longPressed;
Gesture* m_gestureInter;
}; };
#endif // MAINPANELCONTROL_H #endif // MAINPANELCONTROL_H

View File

@ -38,6 +38,12 @@
DWIDGET_USE_NAMESPACE DWIDGET_USE_NAMESPACE
Gesture *FashionTrayWidgetWrapper::m_gestureInter = new Gesture("com.deepin.daemon.Gesture"
, "/com/deepin/daemon/Gesture"
, QDBusConnection::systemBus()
, nullptr);
bool FashionTrayWidgetWrapper::m_longPressed = false;
FashionTrayWidgetWrapper::FashionTrayWidgetWrapper(const QString &itemKey, AbstractTrayWidget *absTrayWidget, QWidget *parent) FashionTrayWidgetWrapper::FashionTrayWidgetWrapper(const QString &itemKey, AbstractTrayWidget *absTrayWidget, QWidget *parent)
: QWidget(parent), : QWidget(parent),
m_absTrayWidget(absTrayWidget), m_absTrayWidget(absTrayWidget),
@ -67,6 +73,14 @@ FashionTrayWidgetWrapper::FashionTrayWidgetWrapper(const QString &itemKey, Abstr
setMinimumSize(PLUGIN_BACKGROUND_MIN_SIZE, PLUGIN_BACKGROUND_MIN_SIZE); setMinimumSize(PLUGIN_BACKGROUND_MIN_SIZE, PLUGIN_BACKGROUND_MIN_SIZE);
m_absTrayWidget->show(); m_absTrayWidget->show();
// 根据后端信号,记录触屏长按状态
connect(m_gestureInter, &Gesture::TouchSinglePressTimeout, m_gestureInter, []{
m_longPressed = true;
}, Qt::UniqueConnection);
connect(m_gestureInter, &Gesture::TouchUpOrCancel, m_gestureInter, []{
m_longPressed = false;
}, Qt::UniqueConnection);
} }
QPointer<AbstractTrayWidget> FashionTrayWidgetWrapper::absTrayWidget() const QPointer<AbstractTrayWidget> FashionTrayWidgetWrapper::absTrayWidget() const
@ -221,6 +235,11 @@ void FashionTrayWidgetWrapper::handleMouseMove(QMouseEvent *event)
return; return;
} }
// 如果是触屏事件转换而来并且没有收到后端的延时触屏消息,不进行拖拽
if (event->source() == Qt::MouseEventSynthesizedByQt && !m_longPressed) {
return;
}
event->accept(); event->accept();
QDrag drag(this); QDrag drag(this);

View File

@ -28,6 +28,10 @@
#include <QVBoxLayout> #include <QVBoxLayout>
#include <QPointer> #include <QPointer>
#include <com_deepin_daemon_gesture.h>
using Gesture = com::deepin::daemon::Gesture;
#define TRAY_ITEM_DRAG_MIMEDATA "TrayItemDragDrop" #define TRAY_ITEM_DRAG_MIMEDATA "TrayItemDragDrop"
class FashionTrayWidgetWrapper : public QWidget class FashionTrayWidgetWrapper : public QWidget
@ -75,6 +79,9 @@ private:
bool m_pressed; bool m_pressed;
QString m_itemKey; QString m_itemKey;
QPoint MousePressPoint; QPoint MousePressPoint;
static Gesture *m_gestureInter;
static bool m_longPressed;
}; };
#endif //FASHIONTRAYWIDGETWRAPPER_H #endif //FASHIONTRAYWIDGETWRAPPER_H