From 495ed319975ac0221149ea02425390a3ba17faf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E5=8D=9A=E6=96=87?= Date: Thu, 27 Apr 2017 15:34:04 +0800 Subject: [PATCH] optimize drop Change-Id: I8892e79b60b7c181f7ae75e5e32177c0847b203a --- frame/item/appitem.cpp | 7 ++++- frame/item/components/previewwidget.cpp | 35 +++++++++++++++++++++++-- frame/item/components/previewwidget.h | 7 ++++- frame/item/dockitem.cpp | 1 + 4 files changed, 46 insertions(+), 4 deletions(-) diff --git a/frame/item/appitem.cpp b/frame/item/appitem.cpp index 391eb5212..797181cc5 100644 --- a/frame/item/appitem.cpp +++ b/frame/item/appitem.cpp @@ -74,6 +74,7 @@ AppItem::AppItem(const QDBusObjectPath &entry, QWidget *parent) connect(m_appPreviewTips, &PreviewContainer::requestActivateWindow, this, &AppItem::requestActivateWindow, Qt::QueuedConnection); connect(m_appPreviewTips, &PreviewContainer::requestPreviewWindow, this, &AppItem::requestPreviewWindow, Qt::QueuedConnection); connect(m_appPreviewTips, &PreviewContainer::requestCancelPreview, this, &AppItem::requestCancelPreview, Qt::QueuedConnection); + connect(m_appPreviewTips, &PreviewContainer::requestCancelPreview, this, &AppItem::hidePopup); updateTitle(); refershIcon(); @@ -319,7 +320,11 @@ void AppItem::mouseMoveEvent(QMouseEvent *e) if (e->buttons() != Qt::LeftButton) return; - const QPoint distance = e->pos() - MousePressPos; + const QPoint pos = e->pos(); + if (!rect().contains(pos)) + return; + + const QPoint distance = pos - MousePressPos; if (distance.manhattanLength() < APP_DRAG_THRESHOLD) return; diff --git a/frame/item/components/previewwidget.cpp b/frame/item/components/previewwidget.cpp index 6102d759c..d18dea247 100644 --- a/frame/item/components/previewwidget.cpp +++ b/frame/item/components/previewwidget.cpp @@ -24,6 +24,10 @@ PreviewWidget::PreviewWidget(const WId wid, QWidget *parent) m_closeButton->setText("x"); m_closeButton->setVisible(false); + m_droppedDelay = new QTimer(this); + m_droppedDelay->setSingleShot(true); + m_droppedDelay->setInterval(100); + QVBoxLayout *centralLayout = new QVBoxLayout; centralLayout->setSpacing(0); centralLayout->setMargin(0); @@ -113,6 +117,9 @@ void PreviewWidget::paintEvent(QPaintEvent *e) void PreviewWidget::enterEvent(QEvent *e) { + if (m_droppedDelay->isActive()) + return e->ignore(); + m_hovered = true; m_closeButton->setVisible(true); @@ -135,16 +142,40 @@ void PreviewWidget::leaveEvent(QEvent *e) void PreviewWidget::mouseReleaseEvent(QMouseEvent *e) { + if (m_droppedDelay->isActive()) + return e->ignore(); + QWidget::mouseReleaseEvent(e); - emit requestHidePopup(); emit requestCancelPreview(); emit requestActivateWindow(m_wid); } void PreviewWidget::dragEnterEvent(QDragEnterEvent *e) { - QWidget::dragEnterEvent(e); + e->accept(); + + m_hovered = true; + + update(); emit requestActivateWindow(m_wid); } + +void PreviewWidget::dragLeaveEvent(QDragLeaveEvent *e) +{ + QWidget::dragLeaveEvent(e); + + m_hovered = false; + + update(); +} + +void PreviewWidget::dropEvent(QDropEvent *e) +{ + m_droppedDelay->start(); + + QWidget::dropEvent(e); + + emit requestCancelPreview(); +} diff --git a/frame/item/components/previewwidget.h b/frame/item/components/previewwidget.h index ce5b2cca5..4a8385e75 100644 --- a/frame/item/components/previewwidget.h +++ b/frame/item/components/previewwidget.h @@ -4,6 +4,8 @@ #include #include #include +#include +#include class PreviewWidget : public QWidget { @@ -17,7 +19,6 @@ signals: void requestActivateWindow(const WId wid) const; void requestPreviewWindow(const WId wid) const; void requestCancelPreview() const; - void requestHidePopup() const; private slots: void refershImage(); @@ -30,6 +31,8 @@ private: void leaveEvent(QEvent *e); void mouseReleaseEvent(QMouseEvent *e); void dragEnterEvent(QDragEnterEvent *e); + void dragLeaveEvent(QDragLeaveEvent *e); + void dropEvent(QDropEvent *e); private: const WId m_wid; @@ -38,6 +41,8 @@ private: QPushButton *m_closeButton; + QTimer *m_droppedDelay; + bool m_hovered; }; diff --git a/frame/item/dockitem.cpp b/frame/item/dockitem.cpp index 34ae736f5..d1a6eb0b9 100644 --- a/frame/item/dockitem.cpp +++ b/frame/item/dockitem.cpp @@ -165,6 +165,7 @@ void DockItem::showContextMenu() connect(menuInter, &DBusMenu::MenuUnregistered, menuInter, &DBusMenu::deleteLater, Qt::QueuedConnection); menuInter->ShowMenu(QString(QJsonDocument(menuObject).toJson())); + hidePopup(); } void DockItem::showHoverTips()