diff --git a/addons/filetree/katefiletree.cpp b/addons/filetree/katefiletree.cpp --- a/addons/filetree/katefiletree.cpp +++ b/addons/filetree/katefiletree.cpp @@ -56,6 +56,8 @@ setIndentation(12); setAllColumnsShowFocus(true); setFocusPolicy(Qt::NoFocus); + setDragEnabled(true); + setDragDropMode(QAbstractItemView::DragOnly); // handle activated (e.g. for pressing enter) + clicked (to avoid to need to do double-click e.g. on Windows) connect(this, SIGNAL(activated(QModelIndex)), this, SLOT(mouseClicked(QModelIndex))); diff --git a/addons/filetree/katefiletreemodel.h b/addons/filetree/katefiletreemodel.h --- a/addons/filetree/katefiletreemodel.h +++ b/addons/filetree/katefiletreemodel.h @@ -56,6 +56,8 @@ virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; virtual bool hasChildren(const QModelIndex &parent = QModelIndex()) const; + QMimeData *mimeData(const QModelIndexList &indexes) const override; + /* extra api for view */ QModelIndex docIndex(const KTextEditor::Document *) const; diff --git a/addons/filetree/katefiletreemodel.cpp b/addons/filetree/katefiletreemodel.cpp --- a/addons/filetree/katefiletreemodel.cpp +++ b/addons/filetree/katefiletreemodel.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -488,8 +489,14 @@ } const ProxyItem *item = static_cast(index.internalPointer()); - if (item && !item->childCount()) { - flags |= Qt::ItemIsSelectable; + if (item) { + if (!item->childCount()) { + flags |= Qt::ItemIsSelectable; + } + + if (item->doc() && item->doc()->url().isValid()) { + flags |= Qt::ItemIsDragEnabled; + } } return flags; @@ -561,6 +568,28 @@ return QVariant(); } +QMimeData *KateFileTreeModel::mimeData(const QModelIndexList &indexes) const +{ + QList urls; + + for (const auto &index : indexes) { + ProxyItem *item = static_cast(index.internalPointer()); + if (!item || !item->doc() || !item->doc()->url().isValid()) { + continue; + } + + urls.append(item->doc()->url()); + } + + if (urls.isEmpty()) { + return nullptr; + } + + QMimeData *mimeData = new QMimeData(); + mimeData->setUrls(urls); + return mimeData; +} + QVariant KateFileTreeModel::headerData(int section, Qt::Orientation orientation, int role) const { Q_UNUSED(orientation);