From cf30c12624cae81785795b8df9e35e398370bc89 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 21 May 2019 14:51:10 +0200 Subject: [PATCH] TextEditor: make the format of completion item detail text adjustable Instead of always assuming content in the form of rich text allow each item individually to define it's text format for the detail text that is shown as a tooltip of a completion item. Fixes: QTCREATORBUG-22429 Change-Id: I9fa71373a743c26fa06d48acc5f0509584830ca0 Reviewed-by: Christian Stenger --- .../clangcodemodel/clangassistproposalitem.cpp | 5 +++++ .../clangcodemodel/clangassistproposalitem.h | 1 + .../clangpreprocessorassistproposalitem.cpp | 5 +++++ .../clangpreprocessorassistproposalitem.h | 2 ++ .../codeassist/assistproposaliteminterface.h | 3 ++- .../codeassist/genericproposalmodel.cpp | 5 +++++ .../codeassist/genericproposalmodel.h | 1 + .../codeassist/genericproposalwidget.cpp | 17 +++++++++++++---- 8 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/plugins/clangcodemodel/clangassistproposalitem.cpp b/src/plugins/clangcodemodel/clangassistproposalitem.cpp index 269298fa1ed..3db4c7077f7 100644 --- a/src/plugins/clangcodemodel/clangassistproposalitem.cpp +++ b/src/plugins/clangcodemodel/clangassistproposalitem.cpp @@ -495,6 +495,11 @@ bool ClangAssistProposalItem::isKeyword() const return m_codeCompletions[0].completionKind == CodeCompletion::KeywordCompletionKind; } +Qt::TextFormat ClangAssistProposalItem::detailFormat() const +{ + return Qt::RichText; +} + bool ClangAssistProposalItem::isSnippet() const { return false; diff --git a/src/plugins/clangcodemodel/clangassistproposalitem.h b/src/plugins/clangcodemodel/clangassistproposalitem.h index 78d37344e9c..64eb8789b34 100644 --- a/src/plugins/clangcodemodel/clangassistproposalitem.h +++ b/src/plugins/clangcodemodel/clangassistproposalitem.h @@ -48,6 +48,7 @@ public: QIcon icon() const final; QString detail() const final; bool isKeyword() const final; + Qt::TextFormat detailFormat() const final; bool isSnippet() const final; bool isValid() const final; quint64 hash() const final; diff --git a/src/plugins/clangcodemodel/clangpreprocessorassistproposalitem.cpp b/src/plugins/clangcodemodel/clangpreprocessorassistproposalitem.cpp index 72c6c2dd09c..1d7a5d96f9f 100644 --- a/src/plugins/clangcodemodel/clangpreprocessorassistproposalitem.cpp +++ b/src/plugins/clangcodemodel/clangpreprocessorassistproposalitem.cpp @@ -131,6 +131,11 @@ QString ClangPreprocessorAssistProposalItem::detail() const return QString(); } +Qt::TextFormat ClangPreprocessorAssistProposalItem::detailFormat() const +{ + return Qt::RichText; +} + bool ClangPreprocessorAssistProposalItem::isSnippet() const { return false; diff --git a/src/plugins/clangcodemodel/clangpreprocessorassistproposalitem.h b/src/plugins/clangcodemodel/clangpreprocessorassistproposalitem.h index 1a5ee440a0d..86073211bed 100644 --- a/src/plugins/clangcodemodel/clangpreprocessorassistproposalitem.h +++ b/src/plugins/clangcodemodel/clangpreprocessorassistproposalitem.h @@ -51,6 +51,8 @@ public: void setDetail(const QString &detail); QString detail() const final; + Qt::TextFormat detailFormat() const final; + bool isSnippet() const final; bool isValid() const final; diff --git a/src/plugins/texteditor/codeassist/assistproposaliteminterface.h b/src/plugins/texteditor/codeassist/assistproposaliteminterface.h index 95c11720569..9ceceb1ddf6 100644 --- a/src/plugins/texteditor/codeassist/assistproposaliteminterface.h +++ b/src/plugins/texteditor/codeassist/assistproposaliteminterface.h @@ -62,7 +62,8 @@ public: virtual void apply(TextDocumentManipulatorInterface &manipulator, int basePosition) const = 0; virtual QIcon icon() const = 0; virtual QString detail() const = 0; - virtual bool isKeyword() const { return false; }; + virtual bool isKeyword() const { return false; } + virtual Qt::TextFormat detailFormat() const { return Qt::AutoText; } virtual bool isSnippet() const = 0; virtual bool isValid() const = 0; virtual quint64 hash() const = 0; // it is only for removing duplicates diff --git a/src/plugins/texteditor/codeassist/genericproposalmodel.cpp b/src/plugins/texteditor/codeassist/genericproposalmodel.cpp index e189472e5ad..b5d9b003404 100644 --- a/src/plugins/texteditor/codeassist/genericproposalmodel.cpp +++ b/src/plugins/texteditor/codeassist/genericproposalmodel.cpp @@ -262,6 +262,11 @@ QString GenericProposalModel::detail(int index) const return m_currentItems.at(index)->detail(); } +Qt::TextFormat GenericProposalModel::detailFormat(int index) const +{ + return m_currentItems.at(index)->detailFormat(); +} + void GenericProposalModel::removeDuplicates() { if (m_duplicatesRemoved) diff --git a/src/plugins/texteditor/codeassist/genericproposalmodel.h b/src/plugins/texteditor/codeassist/genericproposalmodel.h index 47e4f716fc0..de84d60dbe9 100644 --- a/src/plugins/texteditor/codeassist/genericproposalmodel.h +++ b/src/plugins/texteditor/codeassist/genericproposalmodel.h @@ -53,6 +53,7 @@ public: virtual QIcon icon(int index) const; virtual QString detail(int index) const; + virtual Qt::TextFormat detailFormat(int index) const; virtual int persistentId(int index) const; virtual bool containsDuplicates() const; virtual void removeDuplicates(); diff --git a/src/plugins/texteditor/codeassist/genericproposalwidget.cpp b/src/plugins/texteditor/codeassist/genericproposalwidget.cpp index 3b8d8963fc6..aad4096f811 100644 --- a/src/plugins/texteditor/codeassist/genericproposalwidget.cpp +++ b/src/plugins/texteditor/codeassist/genericproposalwidget.cpp @@ -70,6 +70,7 @@ public: int rowCount(const QModelIndex &) const override; QVariant data(const QModelIndex &index, int role) const override; + enum UserRoles{ FixItRole = Qt::UserRole, DetailTextFormatRole }; private: GenericProposalModelPtr m_completionModel; }; @@ -99,7 +100,9 @@ QVariant ModelAdapter::data(const QModelIndex &index, int role) const return m_completionModel->icon(index.row()); } else if (role == Qt::WhatsThisRole) { return m_completionModel->detail(index.row()); - } else if (role == Qt::UserRole) { + } else if (role == DetailTextFormatRole) { + return m_completionModel->detailFormat(index.row()); + } else if (role == FixItRole) { return m_completionModel->proposalItem(index.row())->requiresFixIts(); } @@ -123,7 +126,6 @@ public: // Limit horizontal width m_label->setSizePolicy(QSizePolicy::Fixed, m_label->sizePolicy().verticalPolicy()); - m_label->setTextFormat(Qt::RichText); m_label->setForegroundRole(QPalette::ToolTipText); m_label->setBackgroundRole(QPalette::ToolTipBase); } @@ -133,6 +135,11 @@ public: m_label->setText(text); } + void setTextFormat(Qt::TextFormat format) + { + m_label->setTextFormat(format); + } + // Workaround QTCREATORBUG-11653 void calculateMaximumWidth() { @@ -189,7 +196,7 @@ public: QStyledItemDelegate::paint(painter, option, index); - if (m_parent->model()->data(index, Qt::UserRole).toBool()) { + if (m_parent->model()->data(index, ModelAdapter::FixItRole).toBool()) { const QRect itemRect = m_parent->rectForIndex(index); const QScrollBar *verticalScrollBar = m_parent->verticalScrollBar(); @@ -205,7 +212,7 @@ public: QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override { QSize size(QStyledItemDelegate::sizeHint(option, index)); - if (m_parent->model()->data(index, Qt::UserRole).toBool()) + if (m_parent->model()->data(index, ModelAdapter::FixItRole).toBool()) size.setWidth(size.width() + m_parent->rectForIndex(index).height() - 5); return size; } @@ -313,6 +320,8 @@ void GenericProposalWidgetPrivate::maybeShowInfoTip() m_infoFrame = new GenericProposalInfoFrame(m_completionListView); m_infoFrame->move(m_completionListView->infoFramePos()); + m_infoFrame->setTextFormat( + current.data(ModelAdapter::DetailTextFormatRole).value()); m_infoFrame->setText(infoTip); m_infoFrame->calculateMaximumWidth(); m_infoFrame->adjustSize();