LanguageClient: outline drag support

Fixes: QTCREATORBUG-27502
Change-Id: If5b8226c03886fb7c050c9d99941c9942ef47593
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
David Schulz
2022-06-27 09:16:09 +02:00
parent 9cbe2439dd
commit 61e291688f

View File

@@ -35,7 +35,9 @@
#include <texteditor/outlinefactory.h> #include <texteditor/outlinefactory.h>
#include <texteditor/textdocument.h> #include <texteditor/textdocument.h>
#include <texteditor/texteditor.h> #include <texteditor/texteditor.h>
#include <utils/dropsupport.h>
#include <utils/itemviews.h> #include <utils/itemviews.h>
#include <utils/navigationtreeview.h>
#include <utils/treemodel.h> #include <utils/treemodel.h>
#include <utils/treeviewcombobox.h> #include <utils/treeviewcombobox.h>
#include <utils/utilsicons.h> #include <utils/utilsicons.h>
@@ -103,6 +105,13 @@ public:
} }
} }
Qt::ItemFlags flags(int column) const override
{
Q_UNUSED(column)
return Utils::TypedTreeItem<LanguageClientOutlineItem>::flags(column)
| Qt::ItemIsDragEnabled;
}
Range range() const { return m_range; } Range range() const { return m_range; }
Position pos() const { return m_range.start(); } Position pos() const { return m_range.start(); }
bool contains(const Position &pos) const { return m_range.contains(pos); } bool contains(const Position &pos) const { return m_range.contains(pos); }
@@ -119,6 +128,8 @@ class LanguageClientOutlineModel : public Utils::TreeModel<LanguageClientOutline
{ {
public: public:
using Utils::TreeModel<LanguageClientOutlineItem>::TreeModel; using Utils::TreeModel<LanguageClientOutlineItem>::TreeModel;
void setFilePath(const Utils::FilePath &filePath) { m_filePath = filePath; }
void setInfo(const QList<SymbolInformation> &info) void setInfo(const QList<SymbolInformation> &info)
{ {
clear(); clear();
@@ -137,8 +148,42 @@ public:
m_symbolStringifier = stringifier; 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: private:
SymbolStringifier m_symbolStringifier; 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 class LanguageClientOutlineWidget : public TextEditor::IOutlineWidget
@@ -164,8 +209,8 @@ private:
QPointer<Client> m_client; QPointer<Client> m_client;
QPointer<TextEditor::BaseTextEditor> m_editor; QPointer<TextEditor::BaseTextEditor> m_editor;
LanguageClientOutlineModel m_model; LanguageClientOutlineModel m_model;
QSortFilterProxyModel m_proxyModel; DragSortFilterProxyModel m_proxyModel;
Utils::TreeView m_view; Utils::NavigationTreeView m_view;
DocumentUri m_uri; DocumentUri m_uri;
bool m_sync = false; bool m_sync = false;
bool m_sorted = false; bool m_sorted = false;
@@ -195,11 +240,14 @@ LanguageClientOutlineWidget::LanguageClientOutlineWidget(Client *client,
layout->addWidget(Core::ItemViewFind::createSearchableWrapper(&m_view)); layout->addWidget(Core::ItemViewFind::createSearchableWrapper(&m_view));
setLayout(layout); setLayout(layout);
m_model.setSymbolStringifier(m_client->symbolStringifier()); m_model.setSymbolStringifier(m_client->symbolStringifier());
m_model.setFilePath(editor->textDocument()->filePath());
m_proxyModel.setSourceModel(&m_model); m_proxyModel.setSourceModel(&m_model);
m_view.setModel(&m_proxyModel); m_view.setModel(&m_proxyModel);
m_view.setHeaderHidden(true); m_view.setHeaderHidden(true);
m_view.setExpandsOnDoubleClick(false); m_view.setExpandsOnDoubleClick(false);
m_view.setFrameStyle(QFrame::NoFrame); m_view.setFrameStyle(QFrame::NoFrame);
m_view.setDragEnabled(true);
m_view.setDragDropMode(QAbstractItemView::DragOnly);
connect(&m_view, &QAbstractItemView::activated, connect(&m_view, &QAbstractItemView::activated,
this, &LanguageClientOutlineWidget::onItemActivated); this, &LanguageClientOutlineWidget::onItemActivated);
connect(m_editor->editorWidget(), &TextEditor::TextEditorWidget::cursorPositionChanged, connect(m_editor->editorWidget(), &TextEditor::TextEditorWidget::cursorPositionChanged,