fix: place holder item still display in dock after drag leave

Change-Id: Ibc21b1f984a4ecc1bff466012c2afe05c5df1285
This commit is contained in:
listenerri 2018-11-05 11:26:20 +08:00
parent f0927a1726
commit 725891a6b1
Notes: gerrit 2018-11-05 13:12:54 +08:00
Verified+1: <jenkins@deepin.com>
Verified+1: yefeifei <yefei@linuxdeepin.com>
Code-Review+2: listenerri <listenerri@gmail.com>
Submitted-by: listenerri <listenerri@gmail.com>
Submitted-at: Mon, 05 Nov 2018 13:12:53 +0800
Reviewed-on: https://cr.deepin.io/39446
Project: dde/dde-dock
Branch: refs/heads/master
5 changed files with 35 additions and 6 deletions

View File

@ -359,13 +359,14 @@ void AppItem::resizeEvent(QResizeEvent *e)
void AppItem::dragEnterEvent(QDragEnterEvent *e) void AppItem::dragEnterEvent(QDragEnterEvent *e)
{ {
// ignore drag from panel // ignore drag from panel
if (e->source()) if (e->source()) {
return; return e->ignore();
}
// ignore request dock event // ignore request dock event
QString draggingMimeKey = e->mimeData()->formats().contains("RequestDock") ? "RequestDock" : "text/plain"; QString draggingMimeKey = e->mimeData()->formats().contains("RequestDock") ? "RequestDock" : "text/plain";
if (QMimeDatabase().mimeTypeForFile(e->mimeData()->data(draggingMimeKey)).name() == "application/x-desktop") { if (QMimeDatabase().mimeTypeForFile(e->mimeData()->data(draggingMimeKey)).name() == "application/x-desktop") {
return; return e->ignore();
} }
e->accept(); e->accept();

View File

@ -29,6 +29,8 @@
#include <QScreen> #include <QScreen>
#include <QGraphicsView> #include <QGraphicsView>
#include <window/mainwindow.h>
static DockItem *DraggingItem = nullptr; static DockItem *DraggingItem = nullptr;
static PlaceholderItem *RequestDockItem = nullptr; static PlaceholderItem *RequestDockItem = nullptr;
@ -44,6 +46,7 @@ MainPanel::MainPanel(QWidget *parent)
m_itemLayout(new QBoxLayout(QBoxLayout::LeftToRight)), m_itemLayout(new QBoxLayout(QBoxLayout::LeftToRight)),
m_showDesktopItem(new ShowDesktopItem(this)), m_showDesktopItem(new ShowDesktopItem(this)),
m_itemAdjustTimer(new QTimer(this)), m_itemAdjustTimer(new QTimer(this)),
m_checkMouseLeaveTimer(new QTimer(this)),
m_itemController(DockItemController::instance(this)), m_itemController(DockItemController::instance(this)),
m_appDragWidget(nullptr) m_appDragWidget(nullptr)
{ {
@ -57,6 +60,7 @@ MainPanel::MainPanel(QWidget *parent)
setAcceptDrops(true); setAcceptDrops(true);
setAccessibleName("dock-mainpanel"); setAccessibleName("dock-mainpanel");
setObjectName("MainPanel"); setObjectName("MainPanel");
setMouseTracking(true);
QFile qssFile(":/qss/frame.qss"); QFile qssFile(":/qss/frame.qss");
@ -72,11 +76,15 @@ MainPanel::MainPanel(QWidget *parent)
connect(m_itemController, &DockItemController::itemManaged, this, &MainPanel::manageItem); connect(m_itemController, &DockItemController::itemManaged, this, &MainPanel::manageItem);
connect(m_itemController, &DockItemController::itemUpdated, m_itemAdjustTimer, static_cast<void (QTimer::*)()>(&QTimer::start)); connect(m_itemController, &DockItemController::itemUpdated, m_itemAdjustTimer, static_cast<void (QTimer::*)()>(&QTimer::start));
connect(m_itemAdjustTimer, &QTimer::timeout, this, &MainPanel::adjustItemSize, Qt::QueuedConnection); connect(m_itemAdjustTimer, &QTimer::timeout, this, &MainPanel::adjustItemSize, Qt::QueuedConnection);
connect(m_checkMouseLeaveTimer, &QTimer::timeout, this, &MainPanel::checkMouseReallyLeave, Qt::QueuedConnection);
connect(&DockSettings::Instance(), &DockSettings::opacityChanged, this, &MainPanel::setMaskAlpha); connect(&DockSettings::Instance(), &DockSettings::opacityChanged, this, &MainPanel::setMaskAlpha);
m_itemAdjustTimer->setSingleShot(true); m_itemAdjustTimer->setSingleShot(true);
m_itemAdjustTimer->setInterval(100); m_itemAdjustTimer->setInterval(100);
m_checkMouseLeaveTimer->setSingleShot(true);
m_checkMouseLeaveTimer->setInterval(300);
const auto &itemList = m_itemController->itemList(); const auto &itemList = m_itemController->itemList();
for (auto item : itemList) for (auto item : itemList)
{ {
@ -210,6 +218,12 @@ void MainPanel::resizeEvent(QResizeEvent *e)
void MainPanel::dragEnterEvent(QDragEnterEvent *e) void MainPanel::dragEnterEvent(QDragEnterEvent *e)
{ {
// 不知道为什么有可能会收不到dragLeaveEvent因此使用timer来检测鼠标是否已经离开dock
m_checkMouseLeaveTimer->start();
// call dragEnterEvent of MainWindow to show dock when dock is hidden
static_cast<MainWindow *>(window())->dragEnterEvent(e);
DockItem *item = itemAt(e->pos()); DockItem *item = itemAt(e->pos());
if (item && item->itemType() == DockItem::Container) if (item && item->itemType() == DockItem::Container)
return; return;
@ -273,8 +287,6 @@ void MainPanel::dragLeaveEvent(QDragLeaveEvent *e)
void MainPanel::dropEvent(QDropEvent *e) void MainPanel::dropEvent(QDropEvent *e)
{ {
Q_UNUSED(e)
DraggingItem = nullptr; DraggingItem = nullptr;
if (RequestDockItem) if (RequestDockItem)
@ -666,3 +678,14 @@ void MainPanel::handleDragMove(QDragMoveEvent *e, bool isFilter)
} }
} }
} }
void MainPanel::checkMouseReallyLeave()
{
if (window()->geometry().contains(QCursor::pos())) {
return m_checkMouseLeaveTimer->start();
}
m_checkMouseLeaveTimer->stop();
dragLeaveEvent(new QDragLeaveEvent);
}

View File

@ -86,6 +86,7 @@ private slots:
void itemDragStarted(); void itemDragStarted();
void itemDropped(QObject *destnation); void itemDropped(QObject *destnation);
void handleDragMove(QDragMoveEvent *e, bool isFilter); void handleDragMove(QDragMoveEvent *e, bool isFilter);
void checkMouseReallyLeave();
private: private:
Position m_position; Position m_position;
@ -94,6 +95,7 @@ private:
ShowDesktopItem *m_showDesktopItem; ShowDesktopItem *m_showDesktopItem;
QTimer *m_itemAdjustTimer; QTimer *m_itemAdjustTimer;
QTimer *m_checkMouseLeaveTimer;
DockItemController *m_itemController; DockItemController *m_itemController;
QWidget *m_appDragWidget; QWidget *m_appDragWidget;

View File

@ -211,8 +211,9 @@ void MainWindow::dragEnterEvent(QDragEnterEvent *e)
{ {
QWidget::dragEnterEvent(e); QWidget::dragEnterEvent(e);
if (m_settings->hideState() != Show) if (m_settings->hideState() != Show) {
m_expandDelayTimer->start(); m_expandDelayTimer->start();
}
} }
void MainWindow::setFixedSize(const QSize &size) void MainWindow::setFixedSize(const QSize &size)

View File

@ -44,6 +44,8 @@ public:
explicit MainWindow(QWidget *parent = 0); explicit MainWindow(QWidget *parent = 0);
~MainWindow(); ~MainWindow();
friend class MainPanel;
public slots: public slots:
void launch(); void launch();