From e675bb7860d356e9fd1c788b261ab629d0468f9e Mon Sep 17 00:00:00 2001 From: David Schulz Date: Wed, 27 Apr 2022 11:02:16 +0200 Subject: [PATCH] QmlProfiler: Use annotions instead of custom icons on marks To display the relative cost in the editor a custom text mark icon was painted with a custom width factor for qml profiler marks. Move this textual information into a line annotation and be a bit more verbose what kind of information was collected in that line. Change-Id: I863c2afa52f2acdf19ffcab3dfc95af566ac0efe Reviewed-by: Ulf Hermann Reviewed-by: --- .../qmlprofilerstatisticsmodel.cpp | 14 +++++-- .../qmlprofiler/qmlprofilertextmark.cpp | 37 +++++++++++-------- src/plugins/qmlprofiler/qmlprofilertextmark.h | 1 - 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/src/plugins/qmlprofiler/qmlprofilerstatisticsmodel.cpp b/src/plugins/qmlprofiler/qmlprofilerstatisticsmodel.cpp index ad203258a6d..92a1b1b623a 100644 --- a/src/plugins/qmlprofiler/qmlprofilerstatisticsmodel.cpp +++ b/src/plugins/qmlprofiler/qmlprofilerstatisticsmodel.cpp @@ -156,26 +156,32 @@ QString QmlProfilerStatisticsModel::summary(const QVector &typeIds) const double maximum = 0; double sum = 0; + QSet types; + for (int typeId : typeIds) { + types << m_modelManager->eventType(typeId).rangeType(); const double percentage = durationPercent(typeId); if (percentage > maximum) maximum = percentage; sum += percentage; } + const QStringList typeNames = Utils::transform(types, &nameForType); + const QString typeSummary = QString(" (%1)").arg(typeNames.join(", ")); + const QLatin1Char percent('%'); if (sum < cutoff) - return QLatin1Char('<') + QString::number(cutoff, 'f', 1) + percent; + return QLatin1Char('<') + QString::number(cutoff, 'f', 1) + percent + typeSummary; if (typeIds.length() == 1) - return QLatin1Char('~') + QString::number(maximum, 'f', 1) + percent; + return QLatin1Char('~') + QString::number(maximum, 'f', 1) + percent + typeSummary; // add/subtract 0.05 to avoid problematic rounding if (maximum < cutoff) - return QChar(0x2264) + QString::number(sum + round, 'f', 1) + percent; + return QChar(0x2264) + QString::number(sum + round, 'f', 1) + percent + typeSummary; - return QChar(0x2265) + QString::number(qMax(maximum - round, cutoff), 'f', 1) + percent; + return QChar(0x2265) + QString::number(qMax(maximum - round, cutoff), 'f', 1) + percent + typeSummary; } void QmlProfilerStatisticsModel::clear() diff --git a/src/plugins/qmlprofiler/qmlprofilertextmark.cpp b/src/plugins/qmlprofiler/qmlprofilertextmark.cpp index 3630d6a2d2f..f0e19fc80c4 100644 --- a/src/plugins/qmlprofiler/qmlprofilertextmark.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertextmark.cpp @@ -39,29 +39,21 @@ namespace QmlProfiler { namespace Internal { QmlProfilerTextMark::QmlProfilerTextMark(QmlProfilerViewManager *viewManager, int typeId, - const FilePath &fileName, int lineNumber) : - TextMark(fileName, lineNumber, Constants::TEXT_MARK_CATEGORY, 3.5), m_viewManager(viewManager), - m_typeIds(1, typeId) + const FilePath &fileName, int lineNumber) + : TextMark(fileName, lineNumber, Constants::TEXT_MARK_CATEGORY) + , m_viewManager(viewManager) { + addTypeId(typeId); } void QmlProfilerTextMark::addTypeId(int typeId) { m_typeIds.append(typeId); -} -void QmlProfilerTextMark::paintIcon(QPainter *painter, const QRect &paintRect) const -{ const QmlProfilerStatisticsView *statisticsView = m_viewManager->statisticsView(); QTC_ASSERT(statisticsView, return); - painter->save(); - painter->setPen(Qt::black); - painter->fillRect(paintRect, Qt::white); - painter->drawRect(paintRect); - painter->drawText(paintRect, statisticsView->summary(m_typeIds), - Qt::AlignRight | Qt::AlignVCenter); - painter->restore(); + setLineAnnotation(statisticsView->summary(m_typeIds)); } void QmlProfilerTextMark::clicked() @@ -142,12 +134,27 @@ bool QmlProfilerTextMark::addToolTipContent(QLayout *target) const auto layout = new QGridLayout; layout->setHorizontalSpacing(10); for (int row = 0, rowEnd = m_typeIds.length(); row != rowEnd; ++row) { + int typeId = m_typeIds[row]; const QStringList typeDetails = statisticsView->details(m_typeIds[row]); for (int column = 0, columnEnd = typeDetails.length(); column != columnEnd; ++column) { QLabel *label = new QLabel; label->setAlignment(column == columnEnd - 1 ? Qt::AlignRight : Qt::AlignLeft); - label->setTextFormat(Qt::PlainText); - label->setText(typeDetails[column]); + if (column == 0) { + label->setTextFormat(Qt::RichText); + label->setTextInteractionFlags(Qt::LinksAccessibleByMouse + | Qt::LinksAccessibleByKeyboard); + label->setText(QString("%1") + .arg(typeDetails[column])); + QObject::connect(label, + &QLabel::linkActivated, + m_viewManager, + [this, typeId]() { + emit m_viewManager->typeSelected(typeId); + }); + } else { + label->setTextFormat(Qt::PlainText); + label->setText(typeDetails[column]); + } layout->addWidget(label, row, column); } } diff --git a/src/plugins/qmlprofiler/qmlprofilertextmark.h b/src/plugins/qmlprofiler/qmlprofilertextmark.h index 5b529cd3c16..1c7edea23fe 100644 --- a/src/plugins/qmlprofiler/qmlprofilertextmark.h +++ b/src/plugins/qmlprofiler/qmlprofilertextmark.h @@ -39,7 +39,6 @@ public: const Utils::FilePath &fileName, int lineNumber); void addTypeId(int typeId); - void paintIcon(QPainter *painter, const QRect &rect) const override; void clicked() override; bool isClickable() const override { return true; } bool addToolTipContent(QLayout *target) const override;