CppEditor: Render forward decls less prominently in outline

Fixes: QTCREATORBUG-312
Change-Id: I9bb77add24737881eeee008620941b55118ee0e5
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Christian Kandeler
2023-02-03 15:29:12 +01:00
parent dbe411ca4c
commit a811afaeab
4 changed files with 31 additions and 1 deletions

View File

@@ -62,6 +62,7 @@
#include <utils/fileutils.h>
#include <utils/itemviews.h>
#include <utils/runextensions.h>
#include <utils/theme/theme.h>
#include <utils/utilsicons.h>
#include <QAction>
@@ -135,9 +136,16 @@ class ClangdOutlineItem : public LanguageClientOutlineItem
private:
QVariant data(int column, int role) const override
{
if (role == Qt::DisplayRole) {
switch (role) {
case Qt::DisplayRole:
return ClangdClient::displayNameFromDocumentSymbol(
static_cast<SymbolKind>(type()), name(), detail());
case Qt::ForegroundRole:
if ((detail().endsWith("class") || detail().endsWith("struct"))
&& range().end() == selectionRange().end()) {
return creatorTheme()->color(Theme::TextColorDisabled);
}
break;
}
return LanguageClientOutlineItem::data(column, role);
}

View File

@@ -11,6 +11,7 @@
#include <utils/linecolumn.h>
#include <utils/link.h>
#include <utils/theme/theme.h>
#include <QTimer>
@@ -103,6 +104,24 @@ public:
return name;
}
case Qt::ForegroundRole: {
const auto isFwdDecl = [&] {
const FullySpecifiedType type = symbol->type();
if (type->asForwardClassDeclarationType())
return true;
if (const Template * const tmpl = type->asTemplateType())
return tmpl->declaration() && tmpl->declaration()->asForwardClassDeclaration();
if (type->asObjCForwardClassDeclarationType())
return true;
if (type->asObjCForwardProtocolDeclarationType())
return true;
return false;
};
if (isFwdDecl())
return Utils::creatorTheme()->color(Utils::Theme::TextColorDisabled);
return TreeItem::data(column, role);
}
case Qt::DecorationRole:
return Icons::iconForSymbol(symbol);

View File

@@ -404,6 +404,7 @@ LanguageClientOutlineItem::LanguageClientOutlineItem(Client *client, const Docum
, m_name(info.name())
, m_detail(info.detail().value_or(QString()))
, m_range(info.range())
, m_selectionRange(info.selectionRange())
, m_type(info.kind())
{
const QList<LanguageServerProtocol::DocumentSymbol> children = sortedSymbols(

View File

@@ -27,6 +27,7 @@ public:
LanguageClientOutlineItem(Client *client, const LanguageServerProtocol::DocumentSymbol &info);
LanguageServerProtocol::Range range() const { return m_range; }
LanguageServerProtocol::Range selectionRange() const { return m_selectionRange; }
LanguageServerProtocol::Position pos() const { return m_range.start(); }
bool contains(const LanguageServerProtocol::Position &pos) const {
return m_range.contains(pos);
@@ -46,6 +47,7 @@ private:
QString m_name;
QString m_detail;
LanguageServerProtocol::Range m_range;
LanguageServerProtocol::Range m_selectionRange;
int m_type = -1;
};