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)
{
// ignore drag from panel
if (e->source())
return;
if (e->source()) {
return e->ignore();
}
// ignore request dock event
QString draggingMimeKey = e->mimeData()->formats().contains("RequestDock") ? "RequestDock" : "text/plain";
if (QMimeDatabase().mimeTypeForFile(e->mimeData()->data(draggingMimeKey)).name() == "application/x-desktop") {
return;
return e->ignore();
}
e->accept();

View File

@ -29,6 +29,8 @@
#include <QScreen>
#include <QGraphicsView>
#include <window/mainwindow.h>
static DockItem *DraggingItem = nullptr;
static PlaceholderItem *RequestDockItem = nullptr;
@ -44,6 +46,7 @@ MainPanel::MainPanel(QWidget *parent)
m_itemLayout(new QBoxLayout(QBoxLayout::LeftToRight)),
m_showDesktopItem(new ShowDesktopItem(this)),
m_itemAdjustTimer(new QTimer(this)),
m_checkMouseLeaveTimer(new QTimer(this)),
m_itemController(DockItemController::instance(this)),
m_appDragWidget(nullptr)
{
@ -57,6 +60,7 @@ MainPanel::MainPanel(QWidget *parent)
setAcceptDrops(true);
setAccessibleName("dock-mainpanel");
setObjectName("MainPanel");
setMouseTracking(true);
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::itemUpdated, m_itemAdjustTimer, static_cast<void (QTimer::*)()>(&QTimer::start));
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);
m_itemAdjustTimer->setSingleShot(true);
m_itemAdjustTimer->setInterval(100);
m_checkMouseLeaveTimer->setSingleShot(true);
m_checkMouseLeaveTimer->setInterval(300);
const auto &itemList = m_itemController->itemList();
for (auto item : itemList)
{
@ -210,6 +218,12 @@ void MainPanel::resizeEvent(QResizeEvent *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());
if (item && item->itemType() == DockItem::Container)
return;
@ -273,8 +287,6 @@ void MainPanel::dragLeaveEvent(QDragLeaveEvent *e)
void MainPanel::dropEvent(QDropEvent *e)
{
Q_UNUSED(e)
DraggingItem = nullptr;
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 itemDropped(QObject *destnation);
void handleDragMove(QDragMoveEvent *e, bool isFilter);
void checkMouseReallyLeave();
private:
Position m_position;
@ -94,6 +95,7 @@ private:
ShowDesktopItem *m_showDesktopItem;
QTimer *m_itemAdjustTimer;
QTimer *m_checkMouseLeaveTimer;
DockItemController *m_itemController;
QWidget *m_appDragWidget;

View File

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

View File

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