diff options
author | Eike Ziller <eike.ziller@theqtcompany.com> | 2014-10-15 13:27:22 +0200 |
---|---|---|
committer | Eike Ziller <eike.ziller@theqtcompany.com> | 2014-10-16 16:05:21 +0200 |
commit | 4bcf60dc648e2b7925ba358a6bc458a7eb0ab23c (patch) | |
tree | b1c10fd315939534b7eece38ef9c1a554e86c5c5 /src/plugins/cppeditor/cpptypehierarchy.cpp | |
parent | 4f6ab1a7bda813e2af61100151a4f510fe84a4f2 (diff) |
Type hierarchy: Add drag & drop into editor splits
Change-Id: I8fec78779d4241988bd4987a5d86020cea83d077
Reviewed-by: Daniel Teske <daniel.teske@digia.com>
Diffstat (limited to 'src/plugins/cppeditor/cpptypehierarchy.cpp')
-rw-r--r-- | src/plugins/cppeditor/cpptypehierarchy.cpp | 79 |
1 files changed, 40 insertions, 39 deletions
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 <coreplugin/find/itemviewfind.h> #include <utils/algorithm.h> -#include <utils/navigationtreeview.h> #include <utils/annotateditemdelegate.h> +#include <utils/navigationtreeview.h> +#include <QApplication> #include <QLabel> #include <QLatin1String> #include <QModelIndex> #include <QStackedLayout> -#include <QStandardItemModel> #include <QVBoxLayout> 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<CppClass> sortClasses(const QList<CppClass> &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> &cppElement = evaluator.cppElement(); CppElement *element = cppElement.data(); if (CppClass *cppClass = dynamic_cast<CppClass *>(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<TextEditor::TextEditorWidget::Link>(); + if (link.hasValidTarget()) + data->addFile(link.targetFileName, link.targetLine, link.targetColumn); + } + return data; +} + } // namespace Internal } // namespace CppEditor |