From 35c5bd15f8a9305ab3efb6b0ff8fb76954cc16d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E5=8D=9A=E6=96=87?= Date: Mon, 20 Jun 2016 15:28:40 +0800 Subject: [PATCH] add drag & drop swap Change-Id: I4fd478a8a1c1a6150e7313439a06224e9c180a2a --- frame/controller/dockitemcontroller.cpp | 12 ++++++++++ frame/controller/dockitemcontroller.h | 3 +++ frame/item/appitem.cpp | 1 - frame/panel/mainpanel.cpp | 32 ++++++++++++++++++++----- frame/panel/mainpanel.h | 1 + 5 files changed, 42 insertions(+), 7 deletions(-) diff --git a/frame/controller/dockitemcontroller.cpp b/frame/controller/dockitemcontroller.cpp index 9953233a8..be94c8bd1 100644 --- a/frame/controller/dockitemcontroller.cpp +++ b/frame/controller/dockitemcontroller.cpp @@ -27,6 +27,18 @@ const QList DockItemController::itemList() const return m_itemList; } +void DockItemController::itemMove(DockItem * const moveItem, DockItem * const replaceItem) +{ + const int moveIndex = m_itemList.indexOf(moveItem); + const int replaceIndex = m_itemList.indexOf(replaceItem); + + m_itemList.removeAt(moveIndex); + emit itemRemoved(moveItem); + + m_itemList.insert(replaceIndex, moveItem); + emit itemInserted(replaceIndex, moveItem); +} + DockItemController::DockItemController(QObject *parent) : QObject(parent), m_appInter(new DBusDock(this)), diff --git a/frame/controller/dockitemcontroller.h b/frame/controller/dockitemcontroller.h index 31021aeb7..43e8f597b 100644 --- a/frame/controller/dockitemcontroller.h +++ b/frame/controller/dockitemcontroller.h @@ -22,6 +22,9 @@ signals: void itemInserted(const int index, DockItem *item); void itemRemoved(DockItem *item); +public slots: + void itemMove(DockItem * const moveItem, DockItem * const replaceItem); + private: explicit DockItemController(QObject *parent = 0); void appItemAdded(const QDBusObjectPath &path, const int index); diff --git a/frame/item/appitem.cpp b/frame/item/appitem.cpp index 478ef4946..834154bd5 100644 --- a/frame/item/appitem.cpp +++ b/frame/item/appitem.cpp @@ -138,7 +138,6 @@ void AppItem::startDrag() m_draging = false; update(); - setVisible(true); } void AppItem::initClientManager() diff --git a/frame/panel/mainpanel.cpp b/frame/panel/mainpanel.cpp index 26485eac1..35e2e5b87 100644 --- a/frame/panel/mainpanel.cpp +++ b/frame/panel/mainpanel.cpp @@ -58,23 +58,24 @@ void MainPanel::dragEnterEvent(QDragEnterEvent *e) // TODO: check e->accept(); - if (!DragingItem) - return; +// qDebug() << e->pos() << itemAt(e->pos()); + DragingItem->show(); } void MainPanel::dragMoveEvent(QDragMoveEvent *e) { - Q_UNUSED(e); - // qDebug() << e; + DockItem *item = itemAt(e->pos()); + if (item == DragingItem) + return; + + m_itemController->itemMove(DragingItem, item); } void MainPanel::dragLeaveEvent(QDragLeaveEvent *e) { Q_UNUSED(e) - if (!DragingItem) - return; DragingItem->hide(); } @@ -89,6 +90,23 @@ void MainPanel::initItemConnection(DockItem *item) connect(item, &DockItem::dragStarted, this, &MainPanel::itemDragStarted); } +DockItem *MainPanel::itemAt(const QPoint &point) +{ + const QList itemList = m_itemController->itemList(); + + for (auto item : itemList) + { + QRect rect; + rect.setTopLeft(item->pos()); + rect.setSize(item->size()); + + if (rect.contains(point)) + return item; + } + + return nullptr; +} + void MainPanel::adjustItemSize() { const QList itemList = m_itemController->itemList(); @@ -123,4 +141,6 @@ void MainPanel::itemRemoved(DockItem *item) void MainPanel::itemDragStarted() { DragingItem = qobject_cast(sender()); + + DragingItem->setVisible(rect().contains(QCursor::pos())); } diff --git a/frame/panel/mainpanel.h b/frame/panel/mainpanel.h index 16b889238..cda7dccae 100644 --- a/frame/panel/mainpanel.h +++ b/frame/panel/mainpanel.h @@ -24,6 +24,7 @@ private: void dropEvent(QDropEvent *e); void initItemConnection(DockItem *item); + DockItem *itemAt(const QPoint &point); private slots: void adjustItemSize();