From a811afaeab63275c96e27037f1b875770d495f64 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 3 Feb 2023 15:29:12 +0100 Subject: [PATCH] CppEditor: Render forward decls less prominently in outline Fixes: QTCREATORBUG-312 Change-Id: I9bb77add24737881eeee008620941b55118ee0e5 Reviewed-by: Reviewed-by: David Schulz --- src/plugins/clangcodemodel/clangdclient.cpp | 10 +++++++++- src/plugins/cppeditor/cppoutlinemodel.cpp | 19 +++++++++++++++++++ .../languageclient/languageclientoutline.cpp | 1 + .../languageclient/languageclientoutline.h | 2 ++ 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index fb097b5aac2..9cb30726b0c 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -62,6 +62,7 @@ #include #include #include +#include #include #include @@ -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(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); } diff --git a/src/plugins/cppeditor/cppoutlinemodel.cpp b/src/plugins/cppeditor/cppoutlinemodel.cpp index bbf3610ebf4..967c3987792 100644 --- a/src/plugins/cppeditor/cppoutlinemodel.cpp +++ b/src/plugins/cppeditor/cppoutlinemodel.cpp @@ -11,6 +11,7 @@ #include #include +#include #include @@ -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); diff --git a/src/plugins/languageclient/languageclientoutline.cpp b/src/plugins/languageclient/languageclientoutline.cpp index 6d0596780ea..bfa56b24174 100644 --- a/src/plugins/languageclient/languageclientoutline.cpp +++ b/src/plugins/languageclient/languageclientoutline.cpp @@ -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 children = sortedSymbols( diff --git a/src/plugins/languageclient/languageclientoutline.h b/src/plugins/languageclient/languageclientoutline.h index 1dc73dd4c9a..4ddc9c79c08 100644 --- a/src/plugins/languageclient/languageclientoutline.h +++ b/src/plugins/languageclient/languageclientoutline.h @@ -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; };