CppEditor: Hide part of CppTypeHierarchy implementation

Change-Id: I5635f320e7d746702e6e86bd5f4e8cc749c804f5
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
hjk
2023-09-01 17:29:09 +02:00
parent 68cdbd9cd0
commit fbd243e82e
2 changed files with 110 additions and 156 deletions

View File

@@ -12,26 +12,83 @@
#include <coreplugin/find/itemviewfind.h>
#include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/progressmanager/progressmanager.h>
#include <texteditor/texteditor.h>
#include <utils/algorithm.h>
#include <utils/delegates.h>
#include <utils/dropsupport.h>
#include <utils/futuresynchronizer.h>
#include <utils/navigationtreeview.h>
#include <utils/progressindicator.h>
#include <QApplication>
#include <QFuture>
#include <QFutureWatcher>
#include <QLabel>
#include <QLatin1String>
#include <QMenu>
#include <QModelIndex>
#include <QSharedPointer>
#include <QStackedLayout>
#include <QStackedWidget>
#include <QStandardItemModel>
#include <QVBoxLayout>
using namespace CppEditor;
using namespace CppEditor::Internal;
using namespace Utils;
namespace {
namespace CppEditor::Internal {
class CppClass;
class CppElement;
class CppTypeHierarchyModel : public QStandardItemModel
{
public:
CppTypeHierarchyModel(QObject *parent)
: QStandardItemModel(parent)
{}
Qt::DropActions supportedDragActions() const override;
QStringList mimeTypes() const override;
QMimeData *mimeData(const QModelIndexList &indexes) const override;
};
class CppTypeHierarchyWidget : public QWidget
{
public:
CppTypeHierarchyWidget();
void perform();
private:
void displayHierarchy();
typedef QList<CppClass> CppClass::*HierarchyMember;
void performFromExpression(const QString &expression, const FilePath &filePath);
QStandardItem *buildHierarchy(const CppClass &cppClass, QStandardItem *parent,
bool isRoot, HierarchyMember member);
void showNoTypeHierarchyLabel();
void showTypeHierarchy();
void showProgress();
void hideProgress();
void clearTypeHierarchy();
void onItemActivated(const QModelIndex &index);
void onItemDoubleClicked(const QModelIndex &index);
CppEditorWidget *m_cppEditor = nullptr;
NavigationTreeView *m_treeView = nullptr;
QWidget *m_hierarchyWidget = nullptr;
QStackedLayout *m_stackLayout = nullptr;
QStandardItemModel *m_model = nullptr;
AnnotatedItemDelegate *m_delegate = nullptr;
TextEditor::TextEditorLinkLabel *m_inspectedClass = nullptr;
QLabel *m_infoLabel = nullptr;
QFuture<QSharedPointer<CppElement>> m_future;
QFutureWatcher<void> m_futureWatcher;
FutureSynchronizer m_synchronizer;
ProgressIndicator *m_progressIndicator = nullptr;
QString m_oldClass;
bool m_showOldClass = false;
};
enum ItemRole {
AnnotationRole = Qt::UserRole + 1,
@@ -61,55 +118,44 @@ QList<CppClass> sortClasses(const QList<CppClass> &cppClasses)
});
}
} // Anonymous
class CppTypeHierarchyTreeView : public NavigationTreeView
{
Q_OBJECT
public:
CppTypeHierarchyTreeView(QWidget *parent);
CppTypeHierarchyTreeView(QWidget *parent)
: NavigationTreeView(parent)
{}
void contextMenuEvent(QContextMenuEvent *event) override;
void contextMenuEvent(QContextMenuEvent *event) override
{
if (!event)
return;
QMenu contextMenu;
QAction *action = contextMenu.addAction(Tr::tr("Open in Editor"));
connect(action, &QAction::triggered, this, [this] () {
emit activated(currentIndex());
});
action = contextMenu.addAction(Tr::tr("Open Type Hierarchy"));
connect(action, &QAction::triggered, this, [this] () {
emit doubleClicked(currentIndex());
});
contextMenu.addSeparator();
action = contextMenu.addAction(Tr::tr("Expand All"));
connect(action, &QAction::triggered, this, &QTreeView::expandAll);
action = contextMenu.addAction(Tr::tr("Collapse All"));
connect(action, &QAction::triggered, this, &QTreeView::collapseAll);
contextMenu.exec(event->globalPos());
event->accept();
}
};
CppTypeHierarchyTreeView::CppTypeHierarchyTreeView(QWidget *parent) :
NavigationTreeView(parent)
{
}
void CppTypeHierarchyTreeView::contextMenuEvent(QContextMenuEvent *event)
{
if (!event)
return;
QMenu contextMenu;
QAction *action = contextMenu.addAction(Tr::tr("Open in Editor"));
connect(action, &QAction::triggered, this, [this] () {
emit activated(currentIndex());
});
action = contextMenu.addAction(Tr::tr("Open Type Hierarchy"));
connect(action, &QAction::triggered, this, [this] () {
emit doubleClicked(currentIndex());
});
contextMenu.addSeparator();
action = contextMenu.addAction(Tr::tr("Expand All"));
connect(action, &QAction::triggered, this, &QTreeView::expandAll);
action = contextMenu.addAction(Tr::tr("Collapse All"));
connect(action, &QAction::triggered, this, &QTreeView::collapseAll);
contextMenu.exec(event->globalPos());
event->accept();
}
namespace CppEditor {
namespace Internal {
// CppTypeHierarchyWidget
CppTypeHierarchyWidget::CppTypeHierarchyWidget()
{
m_inspectedClass = new TextEditor::TextEditorLinkLabel(this);
@@ -323,26 +369,6 @@ void CppTypeHierarchyWidget::onItemDoubleClicked(const QModelIndex &index)
performFromExpression(getExpression(index), link.targetFilePath);
}
// CppTypeHierarchyFactory
CppTypeHierarchyFactory::CppTypeHierarchyFactory()
{
setDisplayName(Tr::tr("Type Hierarchy"));
setPriority(700);
setId(Constants::TYPE_HIERARCHY_ID);
}
Core::NavigationView CppTypeHierarchyFactory::createWidget()
{
auto w = new CppTypeHierarchyWidget;
w->perform();
return {w, {}};
}
CppTypeHierarchyModel::CppTypeHierarchyModel(QObject *parent)
: QStandardItemModel(parent)
{
}
Qt::DropActions CppTypeHierarchyModel::supportedDragActions() const
{
// copy & move actions to avoid idiotic behavior of drag and drop:
@@ -369,7 +395,20 @@ QMimeData *CppTypeHierarchyModel::mimeData(const QModelIndexList &indexes) const
return data;
}
} // namespace Internal
} // namespace CppEditor
// CppTypeHierarchyFactory
#include "cpptypehierarchy.moc"
CppTypeHierarchyFactory::CppTypeHierarchyFactory()
{
setDisplayName(Tr::tr("Type Hierarchy"));
setPriority(700);
setId(Constants::TYPE_HIERARCHY_ID);
}
Core::NavigationView CppTypeHierarchyFactory::createWidget()
{
auto w = new CppTypeHierarchyWidget;
w->perform();
return {w, {}};
}
} // CppEditor::Internal

View File

@@ -4,100 +4,15 @@
#pragma once
#include <coreplugin/inavigationwidgetfactory.h>
#include <utils/futuresynchronizer.h>
#include <QFuture>
#include <QFutureWatcher>
#include <QList>
#include <QSharedPointer>
#include <QStackedWidget>
#include <QStandardItemModel>
#include <QString>
#include <QWidget>
QT_BEGIN_NAMESPACE
class QLabel;
class QModelIndex;
class QStackedLayout;
class QStandardItem;
QT_END_NAMESPACE
namespace TextEditor { class TextEditorLinkLabel; }
namespace Utils {
class AnnotatedItemDelegate;
class NavigationTreeView;
class ProgressIndicator;
}
namespace CppEditor {
class CppEditorWidget;
namespace Internal {
class CppClass;
class CppElement;
class CppTypeHierarchyModel : public QStandardItemModel
{
Q_OBJECT
public:
CppTypeHierarchyModel(QObject *parent);
Qt::DropActions supportedDragActions() const override;
QStringList mimeTypes() const override;
QMimeData *mimeData(const QModelIndexList &indexes) const override;
};
class CppTypeHierarchyWidget : public QWidget
{
Q_OBJECT
public:
CppTypeHierarchyWidget();
void perform();
private slots:
void displayHierarchy();
private:
typedef QList<CppClass> CppClass::*HierarchyMember;
void performFromExpression(const QString &expression, const Utils::FilePath &filePath);
QStandardItem *buildHierarchy(const CppClass &cppClass, QStandardItem *parent,
bool isRoot, HierarchyMember member);
void showNoTypeHierarchyLabel();
void showTypeHierarchy();
void showProgress();
void hideProgress();
void clearTypeHierarchy();
void onItemActivated(const QModelIndex &index);
void onItemDoubleClicked(const QModelIndex &index);
CppEditorWidget *m_cppEditor = nullptr;
Utils::NavigationTreeView *m_treeView = nullptr;
QWidget *m_hierarchyWidget = nullptr;
QStackedLayout *m_stackLayout = nullptr;
QStandardItemModel *m_model = nullptr;
Utils::AnnotatedItemDelegate *m_delegate = nullptr;
TextEditor::TextEditorLinkLabel *m_inspectedClass = nullptr;
QLabel *m_infoLabel = nullptr;
QFuture<QSharedPointer<CppElement>> m_future;
QFutureWatcher<void> m_futureWatcher;
Utils::FutureSynchronizer m_synchronizer;
Utils::ProgressIndicator *m_progressIndicator = nullptr;
QString m_oldClass;
bool m_showOldClass = false;
};
namespace CppEditor::Internal {
class CppTypeHierarchyFactory : public Core::INavigationWidgetFactory
{
Q_OBJECT
public:
CppTypeHierarchyFactory();
Core::NavigationView createWidget() override;
};
} // namespace Internal
} // namespace CppEditor
} // CppEditor::Internal