From f91cc3ccdc366b5e95083cab38a17cc9cd5eeabc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E4=B8=87=E9=9D=92?= Date: Thu, 25 Jun 2015 23:05:54 +0800 Subject: [PATCH] Drag and move item position --- dde-dock/Panel/panel.cpp | 10 +++--- dde-dock/Widgets/appitem.cpp | 62 ++++++++++++++++++++++++++++----- dde-dock/Widgets/appitem.h | 15 ++++++-- dde-dock/Widgets/docklayout.cpp | 34 +++++++++++++----- dde-dock/Widgets/docklayout.h | 12 +++---- 5 files changed, 104 insertions(+), 29 deletions(-) diff --git a/dde-dock/Panel/panel.cpp b/dde-dock/Panel/panel.cpp index d11b854c2..db726cc9e 100644 --- a/dde-dock/Panel/panel.cpp +++ b/dde-dock/Panel/panel.cpp @@ -6,11 +6,11 @@ Panel::Panel(QWidget *parent) : QWidget(parent) leftLayout->resize(1024,50); leftLayout->move(0,0); - AppItem * b1 = new AppItem("App",":/test/Resources/images/brasero.png");b1->resize(50,50); - AppItem * b2 = new AppItem("App",":/test/Resources/images/crossover.png");b2->resize(50,50); - AppItem * b3 = new AppItem("App",":/test/Resources/images/gcr-gnupg.png");b3->resize(50,50); - AppItem * b4 = new AppItem("App",":/test/Resources/images/display-im6.q16.png");b4->resize(50,50); - AppItem * b5 = new AppItem("App",":/test/Resources/images/eog.png");b5->resize(50,50); + AppItem * b1 = new AppItem("App",":/test/Resources/images/brasero.png");b1->resize(50,50);b1->setAcceptDrops(true); + AppItem * b2 = new AppItem("App",":/test/Resources/images/crossover.png");b2->resize(50,50);b2->setAcceptDrops(true); + AppItem * b3 = new AppItem("App",":/test/Resources/images/gcr-gnupg.png");b3->resize(50,50);b3->setAcceptDrops(true); + AppItem * b4 = new AppItem("App",":/test/Resources/images/display-im6.q16.png");b4->resize(50,50);b4->setAcceptDrops(true); + AppItem * b5 = new AppItem("App",":/test/Resources/images/eog.png");b5->resize(50,50);b5->setAcceptDrops(true); leftLayout->addItem(b1); leftLayout->addItem(b2); diff --git a/dde-dock/Widgets/appitem.cpp b/dde-dock/Widgets/appitem.cpp index 80ac6afbb..b932b80be 100644 --- a/dde-dock/Widgets/appitem.cpp +++ b/dde-dock/Widgets/appitem.cpp @@ -3,9 +3,10 @@ AppItem::AppItem(QWidget *parent) : QFrame(parent) { - this->setParent(parent); + setParent(parent); - this->initBackground(); + initBackground(); + setAcceptDrops(true); } AppItem::AppItem(QString title, QWidget *parent): @@ -112,7 +113,7 @@ void AppItem::initBackground() void AppItem::mousePressEvent(QMouseEvent * event) { -// qWarning() << "mouse press..."; + //qWarning() << "mouse press..."; emit mousePress(event->globalX(), event->globalY(),this); } @@ -122,16 +123,32 @@ void AppItem::mouseReleaseEvent(QMouseEvent * event) emit mouseRelease(event->globalX(), event->globalY(),this); } -void AppItem::mouseMoveEvent(QMouseEvent * event) -{ - emit mouseMove(event->globalX(), event->globalY(),this); -} - void AppItem::mouseDoubleClickEvent(QMouseEvent * event) { emit mouseDoubleClick(this); } +void AppItem::mouseMoveEvent(QMouseEvent *event) +{ + //this event will only execp onec then handle by Drag + emit dragStart(this); + + Qt::MouseButtons btn = event->buttons(); + if(btn == Qt::LeftButton) + { + QDrag* drag = new QDrag(this); + QMimeData* data = new QMimeData(); + drag->setMimeData(data); + + QPixmap pixmap(this->itemIconPath); + drag->setPixmap(pixmap); + + drag->setHotSpot(QPoint(15,15)); + + drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::MoveAction); + } +} + void AppItem::enterEvent(QEvent *event) { emit mouseEntered(this); @@ -142,6 +159,35 @@ void AppItem::leaveEvent(QEvent *event) emit mouseExited(this); } +void AppItem::dragEnterEvent(QDragEnterEvent *event) +{ + emit dragEntered(event,this); +// event->setDropAction(Qt::MoveAction); +// event->accept(); + +// if (event->mimeData()->hasFormat("application/x-dnditemdata")){ +// if (event->source() == this){ +// event->setDropAction(Qt::MoveAction); +// event->accept(); +// }else{ +// event->ignore(); +// } +// }else{ +// event->ignore(); +// } +} + +void AppItem::dragLeaveEvent(QDragLeaveEvent *event) +{ + emit dragExited(event,this); +} + +void AppItem::dropEvent(QDropEvent *event) +{ + qWarning() << "Item get drop:" << event->pos(); + emit drop(event,this); +} + AppItem::~AppItem() { diff --git a/dde-dock/Widgets/appitem.h b/dde-dock/Widgets/appitem.h index 450c606b9..727fcbfaa 100644 --- a/dde-dock/Widgets/appitem.h +++ b/dde-dock/Widgets/appitem.h @@ -7,11 +7,16 @@ #include #include #include +#include +#include +#include #include "dockconstants.h" #include "appicon.h" #include "appbackground.h" #include "QDebug" +class QDragEnterEvent; +class QDropEvent; class AppItem : public QFrame { Q_OBJECT @@ -37,17 +42,23 @@ public: protected: void mousePressEvent(QMouseEvent *); void mouseReleaseEvent(QMouseEvent *); - void mouseMoveEvent(QMouseEvent *); void mouseDoubleClickEvent(QMouseEvent *); + void mouseMoveEvent(QMouseEvent *); void enterEvent(QEvent * event); void leaveEvent(QEvent * event); + void dragEnterEvent(QDragEnterEvent * event); + void dragLeaveEvent(QDragLeaveEvent * event); + void dropEvent(QDropEvent * event); signals: + void dragStart(AppItem *item); + void dragEntered(QDragEnterEvent * event,AppItem *item); + void dragExited(QDragLeaveEvent * event,AppItem *item); + void drop(QDropEvent * event,AppItem *item); void mouseEntered(AppItem *item); void mouseExited(AppItem *item); void mousePress(int x, int y, AppItem *item); void mouseRelease(int x, int y, AppItem *item); - void mouseMove(int x, int y, AppItem *item); void mouseDoubleClick( AppItem *item); private: diff --git a/dde-dock/Widgets/docklayout.cpp b/dde-dock/Widgets/docklayout.cpp index 435a2e87e..7ad759631 100644 --- a/dde-dock/Widgets/docklayout.cpp +++ b/dde-dock/Widgets/docklayout.cpp @@ -3,6 +3,7 @@ DockLayout::DockLayout(QWidget *parent) : QWidget(parent) { + this->setAcceptDrops(true); } void DockLayout::setParent(QWidget *parent) @@ -22,10 +23,10 @@ void DockLayout::insertItem(AppItem *item, int index) index = index > appCount ? appCount : (index < 0 ? 0 : index); appList.insert(index,item); - connect(item, SIGNAL(mouseMove(int,int,AppItem*)),this,SLOT(slotItemDrag(int,int,AppItem*))); connect(item,SIGNAL(mouseRelease(int,int,AppItem*)),this,SLOT(slotItemRelease(int,int,AppItem*))); - connect(item,SIGNAL(mouseEntered(AppItem*)),this,SLOT(slotItemEntered(AppItem*))); - connect(item, SIGNAL(mouseExited(AppItem*)),this,SLOT(slotItemExited(AppItem*))); + connect(item, SIGNAL(dragStart(AppItem*)),this,SLOT(slotItemDrag(AppItem*))); + connect(item,SIGNAL(dragEntered(QDragEnterEvent*,AppItem*)),this,SLOT(slotItemEntered(QDragEnterEvent*,AppItem*))); + connect(item,SIGNAL(dragExited(QDragLeaveEvent*,AppItem*)),this,SLOT(slotItemExited(QDragLeaveEvent*,AppItem*))); relayout(); } @@ -110,10 +111,11 @@ void DockLayout::dragoutFromLayout(int index) { AppItem * tmpItem = appList.takeAt(index); tmpItem->setVisible(false); + tmpAppMap.insert(tmpItem,index); if (index == appList.count())//note,target hast been remove before { - qWarning() << "out of range..."; +// qWarning() << "end of list..."; return;//at the end of list } @@ -182,7 +184,24 @@ int DockLayout::indexOf(int x, int y) return 0; } -void DockLayout::slotItemDrag(int x, int y, AppItem *item) +void DockLayout::dragEnterEvent(QDragEnterEvent *event) +{ + event->setDropAction(Qt::MoveAction); + event->accept(); +} + +void DockLayout::dropEvent(QDropEvent *event) +{ + AppItem * tmpItem = tmpAppMap.firstKey(); + tmpAppMap.remove(tmpItem); + tmpItem->setVisible(true); + if (indexOf(tmpItem) == -1) + { + insertItem(tmpItem,lastHoverIndex); + } +} + +void DockLayout::slotItemDrag(AppItem *item) { // qWarning() << "Item draging..."<setVisible(true); if (indexOf(item) == -1) { - qWarning() << "---------" << lastHoverIndex; insertItem(item,lastHoverIndex); } } -void DockLayout::slotItemEntered(AppItem *item) +void DockLayout::slotItemEntered(QDragEnterEvent * event,AppItem *item) { this->lastHoverIndex = indexOf(item); } -void DockLayout::slotItemExited(AppItem *item) +void DockLayout::slotItemExited(QDragLeaveEvent *event,AppItem *item) { } diff --git a/dde-dock/Widgets/docklayout.h b/dde-dock/Widgets/docklayout.h index 1e93ec313..71923cd70 100644 --- a/dde-dock/Widgets/docklayout.h +++ b/dde-dock/Widgets/docklayout.h @@ -42,15 +42,15 @@ public: int indexOf(AppItem * item); int indexOf(int x,int y); -signals: - -public slots: +protected: + void dragEnterEvent(QDragEnterEvent *event); + void dropEvent(QDropEvent *event); private slots: - void slotItemDrag(int x,int y,AppItem *item); + void slotItemDrag(AppItem *item); void slotItemRelease(int x, int y, AppItem *item); - void slotItemEntered(AppItem *item); - void slotItemExited(AppItem *item); + void slotItemEntered(QDragEnterEvent * event,AppItem *item); + void slotItemExited(QDragLeaveEvent *event,AppItem *item); private: void sortLeftToRight();