diff --git a/MainWindow.cpp b/MainWindow.cpp index 114a73f..843e7e4 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -172,8 +172,7 @@ void MainWindow::handleMappingIndexesMoved() QVector newOrder; for (int row=mappingListModel->rowCount()-1; row>=0; row--) { - int logicalIndex = mappingList->verticalHeader()->logicalIndex(row) ; - uid layerId = mappingListModel->getIndexFromRow(logicalIndex).data(Qt::UserRole).toInt(); + uid layerId = mappingListModel->getIndexFromRow(row).data(Qt::UserRole).toInt(); newOrder.push_back(layerId); } mappingManager->reorderMappings(newOrder); @@ -1309,11 +1308,9 @@ void MainWindow::createLayout() mappingList->setSelectionMode(QAbstractItemView::SingleSelection); mappingList->setSelectionBehavior(QAbstractItemView::SelectRows); mappingList->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); - mappingList->verticalHeader()->setMovable(true); - mappingList->setDefaultDropAction(Qt::MoveAction); - mappingList->setDragDropOverwriteMode(false); mappingList->setDragEnabled(true); - mappingList->setDragDropMode(QAbstractItemView::InternalMove); + mappingList->setAcceptDrops(true); + mappingList->setDropIndicatorShown(true); mappingList->setEditTriggers(QAbstractItemView::DoubleClicked); mappingList->setMinimumHeight(MAPPING_LIST_MINIMUM_HEIGHT); mappingList->setContentsMargins(0, 0, 0, 0); @@ -1323,10 +1320,12 @@ void MainWindow::createLayout() mappingList->setModel(mappingListModel); mappingList->setItemDelegate(mappingItemDelegate); // Pimp Mapping table widget + mappingList->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents); + mappingList->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents); mappingList->horizontalHeader()->setStretchLastSection(true); mappingList->setShowGrid(false); mappingList->horizontalHeader()->hide(); -// mappingList->verticalHeader()->hide(); + mappingList->verticalHeader()->hide(); mappingList->setMouseTracking(true);// Important // Create property panel. @@ -2506,8 +2505,6 @@ void MainWindow::addMappingItem(uid mappingId) // Add item to layerList widget. mappingListModel->addItem(icon, label, mappingId); mappingListModel->updateModel(); - mappingList->resizeRowsToContents(); - mappingList->resizeColumnsToContents(); setCurrentMapping(mappingId); // Disable Test signal when add Shapes @@ -2803,15 +2800,13 @@ void MainWindow::connectProjectWidgets() connect(mappingList, SIGNAL(activated(const QModelIndex&)), this, SLOT(handleMappingItemSelected(const QModelIndex&))); - -// connect(mappingList, SIGNAL(indexesMoved(const QModelIndexList&)), -// this, SLOT(handleMappingIndexesMoved())); - connect(mappingList->verticalHeader(), SIGNAL(sectionMoved(int, int, int)), + + connect(mappingListModel, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)), this, SLOT(handleMappingIndexesMoved())); -// connect(mappingListModel, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)), -// this, SLOT(handleMappingIndexesMoved())); + connect(mappingItemDelegate, SIGNAL(itemDuplicated(uid)), this, SLOT(duplicateMapping(uid))); + connect(mappingItemDelegate, SIGNAL(itemRemoved(uid)), this, SLOT(deleteMapping(uid))); } @@ -2838,15 +2833,14 @@ void MainWindow::disconnectProjectWidgets() disconnect(mappingList, SIGNAL(activated(const QModelIndex&)), this, SLOT(handleMappingItemSelected(const QModelIndex&))); - -// disconnect(mappingList, SIGNAL(indexesMoved(const QModelIndexList&)), -// this, SLOT(handleMappingIndexesMoved())); - -// disconnect(mappingListModel, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)), -// this, SLOT(handleMappingIndexesMoved())); + + disconnect(mappingListModel, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)), + this, SLOT(handleMappingIndexesMoved())); + disconnect(mappingItemDelegate, SIGNAL(itemDuplicated(uid)), this, SLOT(duplicateMapping(uid))); - disconnect(mappingItemDelegate, SIGNAL(itemRemoved(uid)), + + connect(mappingItemDelegate, SIGNAL(itemRemoved(uid)), this, SLOT(deleteMapping(uid))); } diff --git a/MappingListModel.cpp b/MappingListModel.cpp index e742550..7941bdf 100644 --- a/MappingListModel.cpp +++ b/MappingListModel.cpp @@ -22,15 +22,7 @@ MM_BEGIN_NAMESPACE MappingListModel::MappingListModel(QObject *parent) : - QAbstractTableModel(parent) -{ - -} - -MappingListModel::~MappingListModel() -{ - -} + QAbstractTableModel(parent) {} int MappingListModel::rowCount(const QModelIndex &parent) const { @@ -97,6 +89,80 @@ Qt::ItemFlags MappingListModel::flags(const QModelIndex &index) const Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled; } +Qt::DropActions MappingListModel::supportedDropActions() const +{ + return Qt::MoveAction; +} + +#define MIMETYPE QLatin1String("mapping/model.item.list") + +QStringList MappingListModel::mimeTypes() const +{ + QStringList types; + types << MIMETYPE; + return types; +} + +QMimeData *MappingListModel::mimeData(const QModelIndexList &indexes) const +{ + QMimeData *mimeData = QAbstractTableModel::mimeData(indexes); + QByteArray encodeData; + QDataStream stream(&encodeData, QIODevice::WriteOnly); + + foreach (QModelIndex index, indexes) { + if (index.isValid()) { + if (index.column() == MM::HideColumn) { + int id = data(index, Qt::UserRole).toInt(); + stream << id; + break; // Just take a first index and go + } + } + } + + mimeData->setData(MIMETYPE, encodeData); + + return mimeData; +} + +bool MappingListModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) +{ + if (!data->hasFormat(MIMETYPE) + || column > 0) + return false; + + if (action == Qt::IgnoreAction) + return true; + + int endRow; + + if (!parent.isValid()) { + if (row < 0) + endRow = mappingList.size(); + else + endRow = qMin(row, mappingList.size()); + } else { + endRow = parent.row(); + } + + QByteArray encodeData = data->data(MIMETYPE); + QDataStream stream(&encodeData, QIODevice::ReadOnly); + + while (!stream.atEnd()) { + int id; + stream >> id; + + int rows = getItemRowFromId(id); + if (!beginMoveRows(QModelIndex(), rows, rows, QModelIndex(), endRow)) + continue; + mappingList.move(rows, endRow); + endMoveRows(); + + ++endRow; + } + + return true; +} + bool MappingListModel::setData(const QModelIndex &index, const QVariant &value, int role) { if (!index.isValid()) diff --git a/MappingListModel.h b/MappingListModel.h index 3ca80db..b54fc22 100644 --- a/MappingListModel.h +++ b/MappingListModel.h @@ -24,7 +24,7 @@ #include #include #include -#include +#include #include "MM.h" @@ -38,14 +38,21 @@ class MappingListModel : public QAbstractTableModel public: MappingListModel(QObject *parent = 0); - ~MappingListModel(); + ~MappingListModel() {} - int rowCount(const QModelIndex & parent = QModelIndex()) const; - int columnCount(const QModelIndex & parent = QModelIndex()) const; - QVariant data(const QModelIndex &index, int role) const; - Qt::ItemFlags flags(const QModelIndex &index) const; + int rowCount(const QModelIndex & parent = QModelIndex()) const Q_DECL_OVERRIDE; + int columnCount(const QModelIndex & parent = QModelIndex()) const Q_DECL_OVERRIDE; + QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE; - bool setData(const QModelIndex &index, const QVariant &value, int role); + Qt::ItemFlags flags(const QModelIndex &index) const Q_DECL_OVERRIDE; + Qt::DropActions supportedDropActions() const Q_DECL_OVERRIDE; + + QStringList mimeTypes() const Q_DECL_OVERRIDE; + QMimeData *mimeData(const QModelIndexList &indexes) const Q_DECL_OVERRIDE; + bool dropMimeData(const QMimeData *data, Qt::DropAction action, + int row, int column, const QModelIndex &parent) Q_DECL_OVERRIDE; + + bool setData(const QModelIndex &index, const QVariant &value, int role) Q_DECL_OVERRIDE; void removeItem(int index); void addItem(const QIcon &icon, const QString &name, int id);