diff --git a/src/plugins/languageclient/languageclientoutline.cpp b/src/plugins/languageclient/languageclientoutline.cpp index ba5602e9c26..9ac086493ca 100644 --- a/src/plugins/languageclient/languageclientoutline.cpp +++ b/src/plugins/languageclient/languageclientoutline.cpp @@ -35,7 +35,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -103,6 +105,13 @@ public: } } + Qt::ItemFlags flags(int column) const override + { + Q_UNUSED(column) + return Utils::TypedTreeItem::flags(column) + | Qt::ItemIsDragEnabled; + } + Range range() const { return m_range; } Position pos() const { return m_range.start(); } bool contains(const Position &pos) const { return m_range.contains(pos); } @@ -119,6 +128,8 @@ class LanguageClientOutlineModel : public Utils::TreeModel::TreeModel; + void setFilePath(const Utils::FilePath &filePath) { m_filePath = filePath; } + void setInfo(const QList &info) { clear(); @@ -137,8 +148,42 @@ public: m_symbolStringifier = stringifier; } + Qt::DropActions supportedDragActions() const override + { + return Qt::MoveAction; + } + + QStringList mimeTypes() const override + { + return Utils::DropSupport::mimeTypesForFilePaths(); + } + + QMimeData *mimeData(const QModelIndexList &indexes) const override + { + auto mimeData = new Utils::DropMimeData; + for (const QModelIndex &index : indexes) { + if (LanguageClientOutlineItem *item = itemForIndex(index)) { + const LanguageServerProtocol::Position pos = item->pos(); + mimeData->addFile(m_filePath, pos.line() + 1, pos.character()); + } + } + return mimeData; + } + private: SymbolStringifier m_symbolStringifier; + Utils::FilePath m_filePath; +}; + +class DragSortFilterProxyModel : public QSortFilterProxyModel +{ +public: + using QSortFilterProxyModel::QSortFilterProxyModel; + + Qt::DropActions supportedDragActions() const override + { + return sourceModel()->supportedDragActions(); + } }; class LanguageClientOutlineWidget : public TextEditor::IOutlineWidget @@ -164,8 +209,8 @@ private: QPointer m_client; QPointer m_editor; LanguageClientOutlineModel m_model; - QSortFilterProxyModel m_proxyModel; - Utils::TreeView m_view; + DragSortFilterProxyModel m_proxyModel; + Utils::NavigationTreeView m_view; DocumentUri m_uri; bool m_sync = false; bool m_sorted = false; @@ -195,11 +240,14 @@ LanguageClientOutlineWidget::LanguageClientOutlineWidget(Client *client, layout->addWidget(Core::ItemViewFind::createSearchableWrapper(&m_view)); setLayout(layout); m_model.setSymbolStringifier(m_client->symbolStringifier()); + m_model.setFilePath(editor->textDocument()->filePath()); m_proxyModel.setSourceModel(&m_model); m_view.setModel(&m_proxyModel); m_view.setHeaderHidden(true); m_view.setExpandsOnDoubleClick(false); m_view.setFrameStyle(QFrame::NoFrame); + m_view.setDragEnabled(true); + m_view.setDragDropMode(QAbstractItemView::DragOnly); connect(&m_view, &QAbstractItemView::activated, this, &LanguageClientOutlineWidget::onItemActivated); connect(m_editor->editorWidget(), &TextEditor::TextEditorWidget::cursorPositionChanged,