-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdragdropmodel.cpp
97 lines (76 loc) · 2.46 KB
/
dragdropmodel.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <QtGui>
#include "dragdropmodel.h"
DragDropModel::DragDropModel(const QStringList &header, Node* root, QObject *parent)
: TreeModel(header, root, parent)
{
}
bool DragDropModel::dropMimeData(const QMimeData *data,
Qt::DropAction action, int row, int column, const QModelIndex &parent)
{
if (action == Qt::IgnoreAction)
return true;
if (!data->hasFormat("text/plain"))
return false;
int beginRow;
if (row != -1)
beginRow = row;
else if (parent.isValid())
beginRow = 0;
else
beginRow = rowCount(QModelIndex());
QByteArray encodedData = data->data("text/plain");
QDataStream stream(&encodedData, QIODevice::ReadOnly);
QString newItem;
// we suppose we pass only one item
while (!stream.atEnd())
stream >> newItem;
// we modify the current element
if (!parent.data().toString().isEmpty())
newItem = newItem + " + " + parent.data().toString();
setData(parent, newItem);
return true;
}
Qt::ItemFlags DragDropModel::flags(const QModelIndex &index) const
{
Qt::ItemFlags defaultFlags = TreeModel::flags(index);
if (index.isValid() && index.column() == 0)
return Qt::ItemIsDragEnabled | defaultFlags;
else if (index.column() == 1)
return Qt::ItemIsDropEnabled | defaultFlags;
}
QMimeData *DragDropModel::mimeData(const QModelIndexList &indexes) const
{
QMimeData *mimeData = new QMimeData();
QByteArray encodedData;
QDataStream stream(&encodedData, QIODevice::WriteOnly);
foreach (QModelIndex index, indexes) {
if (index.isValid()) {
// retrieve path to this element
QString text = data(index, Qt::DisplayRole).toString();
text = findPath(text, index);
//stream << index.internalId() << index.row() << index.column() << text;
stream << text;
}
}
mimeData->setData("text/plain", encodedData);
return mimeData;
}
QStringList DragDropModel::mimeTypes() const
{
QStringList types;
types << "text/plain";
return types;
}
Qt::DropActions DragDropModel::supportedDropActions() const
{
return Qt::CopyAction | Qt::MoveAction;
}
QString DragDropModel::findPath(QString text, QModelIndex &index) const{
QModelIndex temp_index = index.parent();
QString path = text;
while (temp_index.isValid()) {
path = temp_index.data().toString() + "." + path;
temp_index = temp_index.parent();
}
return path;
}