From 4bcf60dc648e2b7925ba358a6bc458a7eb0ab23c Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 15 Oct 2014 13:27:22 +0200 Subject: Type hierarchy: Add drag & drop into editor splits Change-Id: I8fec78779d4241988bd4987a5d86020cea83d077 Reviewed-by: Daniel Teske --- src/plugins/cppeditor/cpptypehierarchy.cpp | 79 +++++++++++++++--------------- 1 file changed, 40 insertions(+), 39 deletions(-) (limited to 'src/plugins/cppeditor/cpptypehierarchy.cpp') diff --git a/src/plugins/cppeditor/cpptypehierarchy.cpp b/src/plugins/cppeditor/cpptypehierarchy.cpp index d42de60483..6026d36120 100644 --- a/src/plugins/cppeditor/cpptypehierarchy.cpp +++ b/src/plugins/cppeditor/cpptypehierarchy.cpp @@ -37,14 +37,14 @@ #include #include -#include #include +#include +#include #include #include #include #include -#include #include using namespace CppEditor; @@ -61,6 +61,7 @@ enum ItemRole { QStandardItem *itemForClass(const CppClass &cppClass) { QStandardItem *item = new QStandardItem; + item->setFlags(item->flags() | Qt::ItemIsDragEnabled); item->setData(cppClass.name, Qt::DisplayRole); if (cppClass.name != cppClass.qualifiedName) item->setData(cppClass.qualifiedName, AnnotationRole); @@ -87,40 +88,6 @@ QList sortClasses(const QList &cppClasses) namespace CppEditor { namespace Internal { -class CppClassLabel : public QLabel -{ -public: - CppClassLabel(QWidget *parent) - : QLabel(parent) - {} - - void setup(CppClass *cppClass) - { - setText(cppClass->name); - m_link = cppClass->link; - } - - void clear() - { - QLabel::clear(); - m_link = CppEditorWidget::Link(); - } - -private: - void mousePressEvent(QMouseEvent *) - { - if (!m_link.hasValidTarget()) - return; - - Core::EditorManager::openEditorAt(m_link.targetFileName, - m_link.targetLine, - m_link.targetColumn, - Constants::CPPEDITOR_ID); - } - - CppEditorWidget::Link m_link; -}; - // CppTypeHierarchyWidget CppTypeHierarchyWidget::CppTypeHierarchyWidget() : QWidget(0), @@ -129,9 +96,9 @@ CppTypeHierarchyWidget::CppTypeHierarchyWidget() : m_delegate(0), m_noTypeHierarchyAvailableLabel(0) { - m_inspectedClass = new CppClassLabel(this); + m_inspectedClass = new TextEditor::TextEditorLinkLabel(this); m_inspectedClass->setMargin(5); - m_model = new QStandardItemModel(this); + m_model = new CppTypeHierarchyModel(this); m_treeView = new NavigationTreeView(this); m_treeView->setActivationMode(Utils::SingleClickActivation); m_delegate = new AnnotatedItemDelegate(this); @@ -141,6 +108,8 @@ CppTypeHierarchyWidget::CppTypeHierarchyWidget() : m_treeView->setEditTriggers(QAbstractItemView::NoEditTriggers); m_treeView->setItemDelegate(m_delegate); m_treeView->setRootIsDecorated(false); + m_treeView->setDragEnabled(true); + m_treeView->setDragDropMode(QAbstractItemView::DragOnly); connect(m_treeView, &QTreeView::activated, this, &CppTypeHierarchyWidget::onItemActivated); m_noTypeHierarchyAvailableLabel = new QLabel(tr("No type hierarchy available"), this); @@ -190,7 +159,8 @@ void CppTypeHierarchyWidget::perform() const QSharedPointer &cppElement = evaluator.cppElement(); CppElement *element = cppElement.data(); if (CppClass *cppClass = dynamic_cast(element)) { - m_inspectedClass->setup(cppClass); + m_inspectedClass->setText(cppClass->name); + m_inspectedClass->setLink(cppClass->link); QStandardItem *bases = new QStandardItem(tr("Bases")); m_model->invisibleRootItem()->appendRow(bases); buildHierarchy(*cppClass, bases, true, &CppClass::bases); @@ -257,6 +227,37 @@ Core::NavigationView CppTypeHierarchyFactory::createWidget() return Core::NavigationView(w); } +CppTypeHierarchyModel::CppTypeHierarchyModel(QObject *parent) + : QStandardItemModel(parent) +{ +} + +Qt::DropActions CppTypeHierarchyModel::supportedDragActions() const +{ + // copy & move actions to avoid idiotic behavior of drag and drop: + // standard item model removes nodes automatically that are + // dropped anywhere with move action, but we do not want the '+' sign in the + // drag handle that would appear when only allowing copy action + return Qt::CopyAction | Qt::MoveAction; +} + +QStringList CppTypeHierarchyModel::mimeTypes() const +{ + return FileDropSupport::mimeTypesForFilePaths(); +} + +QMimeData *CppTypeHierarchyModel::mimeData(const QModelIndexList &indexes) const +{ + auto data = new FileDropMimeData; + data->setOverrideFileDropAction(Qt::CopyAction); // do not remove the item from the model + foreach (const QModelIndex &index, indexes) { + auto link = index.data(LinkRole).value(); + if (link.hasValidTarget()) + data->addFile(link.targetFileName, link.targetLine, link.targetColumn); + } + return data; +} + } // namespace Internal } // namespace CppEditor -- cgit v1.2.3