|
22 | 22 | */ |
23 | 23 | #include "core_projectmodel.h" |
24 | 24 |
|
| 25 | +#include <QMimeData> |
| 26 | + |
25 | 27 | #include <project/core_project.h> |
26 | 28 | #include <project/core_port.h> |
| 29 | +#include <project/core_device.h> |
27 | 30 |
|
28 | 31 | #include <gui/core_ui.h> |
29 | 32 |
|
| 33 | +mbCoreProjectModel::Strings::Strings() : |
| 34 | + mimeTypeDevice(QStringLiteral("application/x-modbustools-device")) |
| 35 | + |
| 36 | +{ |
| 37 | +} |
| 38 | + |
| 39 | +const mbCoreProjectModel::Strings &mbCoreProjectModel::Strings::instance() |
| 40 | +{ |
| 41 | + static const Strings s; |
| 42 | + return s; |
| 43 | +} |
| 44 | + |
30 | 45 | mbCoreProjectModel::mbCoreProjectModel(QObject* parent) : |
31 | 46 | QAbstractItemModel (parent) |
32 | 47 | { |
@@ -69,6 +84,63 @@ Qt::ItemFlags mbCoreProjectModel::flags(const QModelIndex &index) const |
69 | 84 | return f; |
70 | 85 | } |
71 | 86 |
|
| 87 | +Qt::DropActions mbCoreProjectModel::supportedDropActions() const |
| 88 | +{ |
| 89 | + return Qt::MoveAction | Qt::CopyAction; |
| 90 | +} |
| 91 | + |
| 92 | +QStringList mbCoreProjectModel::mimeTypes() const |
| 93 | +{ |
| 94 | + return {mbCoreProjectModel::Strings::instance().mimeTypeDevice}; |
| 95 | +} |
| 96 | + |
| 97 | +QMimeData *mbCoreProjectModel::mimeData(const QModelIndexList &indexes) const |
| 98 | +{ |
| 99 | + QMimeData *mimeData = new QMimeData(); |
| 100 | + if (indexes.size() == 1) |
| 101 | + { |
| 102 | + QModelIndex index = indexes.first(); |
| 103 | + if (mbCoreDevice *dev = this->getDeviceByIndex(index)) |
| 104 | + { |
| 105 | + QByteArray encoded; |
| 106 | + QDataStream stream(&encoded, QIODevice::WriteOnly); |
| 107 | + mbCorePort *port = getPortByIndex(indexes.first()); |
| 108 | + stream << port->name() << index.row(); |
| 109 | + mimeData->setData(mbCoreProjectModel::Strings::instance().mimeTypeDevice, encoded); |
| 110 | + } |
| 111 | + } |
| 112 | + return mimeData; |
| 113 | +} |
| 114 | + |
| 115 | +bool mbCoreProjectModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) |
| 116 | +{ |
| 117 | + if (!data->hasFormat(mbCoreProjectModel::Strings::instance().mimeTypeDevice)) |
| 118 | + return false; |
| 119 | + QByteArray encoded = data->data(mbCoreProjectModel::Strings::instance().mimeTypeDevice); |
| 120 | + QDataStream stream(&encoded, QIODevice::ReadOnly); |
| 121 | + QString srcPortName; |
| 122 | + int srcIndex; |
| 123 | + stream >> srcPortName >> srcIndex; |
| 124 | + mbCoreProject *prj = projectCore(); |
| 125 | + if (!prj) |
| 126 | + return false; |
| 127 | + mbCorePort *srcPort = prj->portCore(srcPortName); |
| 128 | + mbCoreDevice *device = prj->deviceCore(srcIndex); |
| 129 | + if (!srcPort || !device) |
| 130 | + return false; |
| 131 | + QModelIndex portIndex = parent; |
| 132 | + if (!portIndex.isValid()) |
| 133 | + portIndex = index(row, column); |
| 134 | + mbCorePort *dstPort = portCore(portIndex); |
| 135 | + if (!dstPort) |
| 136 | + { |
| 137 | + dstPort = prj->portCore(prj->portCount()-1); |
| 138 | + if (!dstPort) |
| 139 | + return false; |
| 140 | + } |
| 141 | + return dropDevice(action, srcPort, srcIndex, dstPort, row); |
| 142 | +} |
| 143 | + |
72 | 144 | void mbCoreProjectModel::setUseNameWithSettings(bool use) |
73 | 145 | { |
74 | 146 | if (m_settings.useNameWithSettings != use) |
|
0 commit comments