From 50649d2a404c403e8e59abef8404139c760cd6ef Mon Sep 17 00:00:00 2001 From: Tats Date: Thu, 5 Dec 2013 02:16:55 -0500 Subject: [PATCH] Reordering of layers with drag and drop --- MainWindow.cpp | 29 +++++++++++++++++++++++++++-- MainWindow.h | 1 + MappingManager.cpp | 11 +++++++++++ MappingManager.h | 1 + 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/MainWindow.cpp b/MainWindow.cpp index 616efce..7088fd4 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -94,6 +94,22 @@ void MainWindow::handleLayerItemChanged(QListWidgetItem* item) destinationCanvas->update(); } +void MainWindow::handleLayerIndexesMoved() +{ + qDebug() << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1Moved!!!" << endl; + std::vector newOrder; + for (int row=layerList->count()-1; row>=0; row--) + { + uint layerId = layerList->item(row)->data(Qt::UserRole).toUInt(); + newOrder.push_back(layerId); + } + + mappingManager->reorderLayers(newOrder); + + sourceCanvas->update(); + destinationCanvas->update(); +} + //void MainWindow::handleSourceSelectionChanged(const QItemSelection& selection) //{ // std::cout << "selection changed" << std::endl; @@ -245,6 +261,10 @@ void MainWindow::createLayout() layerList = new QListWidget; layerList->setSelectionMode(QAbstractItemView::SingleSelection); layerList->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); + //layerList->setDragDropMode(QAbstractItemView::DragDrop); + layerList->setDefaultDropAction(Qt::MoveAction); + layerList->setDragDropMode(QAbstractItemView::InternalMove); + sourceCanvas = new SourceGLCanvas; destinationCanvas = new DestinationGLCanvas(0, sourceCanvas); @@ -304,7 +324,12 @@ void MainWindow::createLayout() connect(layerList, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(handleLayerItemChanged(QListWidgetItem*))); -// sourceList->setModel(sourcesModel); + + connect(layerList->model(), SIGNAL(layoutChanged()), + this, SLOT(handleLayerIndexesMoved())); + + + // sourceList->setModel(sourcesModel); // // connect(sourceList->selectionModel(), // SIGNAL(selectionChanged(QItemSelection,QItemSelection)), @@ -622,7 +647,7 @@ void MainWindow::addLayerItem(uint layerId) item->setData(Qt::UserRole, layerId); // TODO: could possibly be replaced by a Paint pointer item->setIcon(icon); item->setSizeHint(QSize(item->sizeHint().width(), MainWindow::SHAPE_LIST_ITEM_HEIGHT)); - layerList->addItem(item); + layerList->insertItem(0, item); layerList->setCurrentItem(item); } diff --git a/MainWindow.h b/MainWindow.h index 609b03e..ea93d02 100644 --- a/MainWindow.h +++ b/MainWindow.h @@ -59,6 +59,7 @@ private slots: void handleSourceItemSelectionChanged(); void handleLayerItemSelectionChanged(); void handleLayerItemChanged(QListWidgetItem* item); + void handleLayerIndexesMoved(); void addQuad(); void addTriangle(); diff --git a/MappingManager.cpp b/MappingManager.cpp index 03c8073..1417c9f 100644 --- a/MappingManager.cpp +++ b/MappingManager.cpp @@ -105,6 +105,17 @@ std::vector MappingManager::getVisibleLayers() const return visible; } +void MappingManager::reorderLayers(std::vector layerIds) +{ + Q_ASSERT( layerIds.size() == layerVector.size() ); + // TODO: do a better check than this... + layerVector.clear(); + for (std::vector::iterator it = layerIds.begin(); it != layerIds.end(); ++it) + { + Q_ASSERT( layerMap.find(*it) != layerMap.end() ); + layerVector.push_back( layerMap[*it] ); + } +} //bool MappingManager::removeMapping(Mapping::ptr mapping) //{ diff --git a/MappingManager.h b/MappingManager.h index 88be78b..a38ac2a 100644 --- a/MappingManager.h +++ b/MappingManager.h @@ -66,6 +66,7 @@ public: uint addLayer(Mapping::ptr mapping); Layer::ptr getLayer(int i) { return layerVector[i]; } Layer::ptr getLayerById(uint id) { return layerMap[id]; } + void reorderLayers(std::vector layerIds); std::vector getVisibleLayers() const; };