From f94e048c2f990f55b074f15ea5b441081377b45a Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Fri, 23 Mar 2018 09:28:57 +0100 Subject: [PATCH] QmlProfiler: Un-pimpl statistics classes They aren't part of any public API and the pimpl pattern just gets in the way here. Also, initialize members inline where possible, remove redundant deletes, prefer explicit ownership over parenting, and use std::unique_ptr for owned objects and QPointer for non-owned QObjects. Change-Id: Ibe1e1f88d0e38b6ca26544fccb1db6b809d1556b Reviewed-by: Tobias Hunger --- .../qmlprofilerstatisticsmodel.cpp | 144 +++++----- .../qmlprofiler/qmlprofilerstatisticsmodel.h | 53 ++-- .../qmlprofiler/qmlprofilerstatisticsview.cpp | 252 ++++++++---------- .../qmlprofiler/qmlprofilerstatisticsview.h | 28 +- 4 files changed, 219 insertions(+), 258 deletions(-) diff --git a/src/plugins/qmlprofiler/qmlprofilerstatisticsmodel.cpp b/src/plugins/qmlprofiler/qmlprofilerstatisticsmodel.cpp index d691f992cf7..c7cd5009ed7 100644 --- a/src/plugins/qmlprofiler/qmlprofilerstatisticsmodel.cpp +++ b/src/plugins/qmlprofiler/qmlprofilerstatisticsmodel.cpp @@ -32,58 +32,35 @@ #include #include #include -#include #include namespace QmlProfiler { -class QmlProfilerStatisticsModel::QmlProfilerStatisticsModelPrivate -{ -public: - QHash data; - - QPointer childrenModel; - QPointer parentsModel; - - QmlProfilerModelManager *modelManager; - - int modelId; - - QList acceptedTypes; - QHash notes; - - QStack callStack; - QStack compileStack; - QHash > durations; -}; - double QmlProfilerStatisticsModel::durationPercent(int typeId) const { - const QmlEventStats &global = d->data[-1]; - const QmlEventStats &stats = d->data[typeId]; + const QmlEventStats &global = m_data[-1]; + const QmlEventStats &stats = m_data[typeId]; return double(stats.duration - stats.durationRecursive) / double(global.duration) * 100l; } double QmlProfilerStatisticsModel::durationSelfPercent(int typeId) const { - const QmlEventStats &global = d->data[-1]; - const QmlEventStats &stats = d->data[typeId]; + const QmlEventStats &global = m_data[-1]; + const QmlEventStats &stats = m_data[typeId]; return double(stats.durationSelf) / double(global.duration) * 100l; } -QmlProfilerStatisticsModel::QmlProfilerStatisticsModel(QmlProfilerModelManager *modelManager, - QObject *parent) : - QObject(parent), d(new QmlProfilerStatisticsModelPrivate) +QmlProfilerStatisticsModel::QmlProfilerStatisticsModel(QmlProfilerModelManager *modelManager) + : m_modelManager(modelManager) { - d->modelManager = modelManager; connect(modelManager, &QmlProfilerModelManager::stateChanged, this, &QmlProfilerStatisticsModel::dataChanged); connect(modelManager->notesModel(), &Timeline::TimelineNotesModel::changed, this, &QmlProfilerStatisticsModel::notesChanged); - d->modelId = modelManager->registerModelProxy(); + modelManager->registerModelProxy(); - d->acceptedTypes << Compiling << Creating << Binding << HandlingSignal << Javascript; + m_acceptedTypes << Compiling << Creating << Binding << HandlingSignal << Javascript; modelManager->announceFeatures(Constants::QML_JS_RANGE_FEATURES, [this](const QmlEvent &event, const QmlEventType &type) { @@ -93,11 +70,6 @@ QmlProfilerStatisticsModel::QmlProfilerStatisticsModel(QmlProfilerModelManager * }); } -QmlProfilerStatisticsModel::~QmlProfilerStatisticsModel() -{ - delete d; -} - void QmlProfilerStatisticsModel::restrictToFeatures(quint64 features) { bool didChange = false; @@ -106,25 +78,25 @@ void QmlProfilerStatisticsModel::restrictToFeatures(quint64 features) quint64 featureFlag = 1ULL << featureFromRangeType(type); if (Constants::QML_JS_RANGE_FEATURES & featureFlag) { bool accepted = features & featureFlag; - if (accepted && !d->acceptedTypes.contains(type)) { - d->acceptedTypes << type; + if (accepted && !m_acceptedTypes.contains(type)) { + m_acceptedTypes << type; didChange = true; - } else if (!accepted && d->acceptedTypes.contains(type)) { - d->acceptedTypes.removeOne(type); + } else if (!accepted && m_acceptedTypes.contains(type)) { + m_acceptedTypes.removeOne(type); didChange = true; } } } - if (!didChange || d->modelManager->state() != QmlProfilerModelManager::Done) + if (!didChange || m_modelManager->state() != QmlProfilerModelManager::Done) return; clear(); - if (!d->modelManager->replayEvents(d->modelManager->traceTime()->startTime(), - d->modelManager->traceTime()->endTime(), + if (!m_modelManager->replayEvents(m_modelManager->traceTime()->startTime(), + m_modelManager->traceTime()->endTime(), std::bind(&QmlProfilerStatisticsModel::loadEvent, this, std::placeholders::_1, std::placeholders::_2))) { - emit d->modelManager->error(tr("Could not re-read events from temporary trace file.")); + emit m_modelManager->error(tr("Could not re-read events from temporary trace file.")); clear(); } else { finalize(); @@ -132,63 +104,68 @@ void QmlProfilerStatisticsModel::restrictToFeatures(quint64 features) } } +bool QmlProfilerStatisticsModel::isRestrictedToRange() const +{ + return m_modelManager->isRestrictedToRange(); +} + const QHash &QmlProfilerStatisticsModel::getData() const { - return d->data; + return m_data; } const QVector &QmlProfilerStatisticsModel::getTypes() const { - return d->modelManager->eventTypes(); + return m_modelManager->eventTypes(); } const QHash &QmlProfilerStatisticsModel::getNotes() const { - return d->notes; + return m_notes; } void QmlProfilerStatisticsModel::clear() { - d->data.clear(); - d->notes.clear(); - d->callStack.clear(); - d->compileStack.clear(); - d->durations.clear(); - if (!d->childrenModel.isNull()) - d->childrenModel->clear(); - if (!d->parentsModel.isNull()) - d->parentsModel->clear(); + m_data.clear(); + m_notes.clear(); + m_callStack.clear(); + m_compileStack.clear(); + m_durations.clear(); + if (!m_calleesModel.isNull()) + m_calleesModel->clear(); + if (!m_callersModel.isNull()) + m_callersModel->clear(); } void QmlProfilerStatisticsModel::setRelativesModel(QmlProfilerStatisticsRelativesModel *relative, QmlProfilerStatisticsRelation relation) { if (relation == QmlProfilerStatisticsParents) - d->parentsModel = relative; + m_callersModel = relative; else - d->childrenModel = relative; + m_calleesModel = relative; } QmlProfilerModelManager *QmlProfilerStatisticsModel::modelManager() const { - return d->modelManager; + return m_modelManager; } void QmlProfilerStatisticsModel::dataChanged() { - if (d->modelManager->state() == QmlProfilerModelManager::ClearingData) + if (m_modelManager->state() == QmlProfilerModelManager::ClearingData) clear(); } void QmlProfilerStatisticsModel::notesChanged(int typeIndex) { - const QmlProfilerNotesModel *notesModel = d->modelManager->notesModel(); + const QmlProfilerNotesModel *notesModel = m_modelManager->notesModel(); if (typeIndex == -1) { - d->notes.clear(); + m_notes.clear(); for (int noteId = 0; noteId < notesModel->count(); ++noteId) { int noteType = notesModel->typeId(noteId); if (noteType != -1) { - QString ¬e = d->notes[noteType]; + QString ¬e = m_notes[noteType]; if (note.isEmpty()) { note = notesModel->text(noteId); } else { @@ -197,7 +174,7 @@ void QmlProfilerStatisticsModel::notesChanged(int typeIndex) } } } else { - d->notes.remove(typeIndex); + m_notes.remove(typeIndex); const QVariantList changedNotes = notesModel->byTypeId(typeIndex); if (!changedNotes.isEmpty()) { QStringList newNotes; @@ -205,7 +182,7 @@ void QmlProfilerStatisticsModel::notesChanged(int typeIndex) ++it) { newNotes << notesModel->text(it->toInt()); } - d->notes[typeIndex] = newNotes.join(QStringLiteral("\n")); + m_notes[typeIndex] = newNotes.join(QStringLiteral("\n")); } } @@ -214,11 +191,11 @@ void QmlProfilerStatisticsModel::notesChanged(int typeIndex) void QmlProfilerStatisticsModel::loadEvent(const QmlEvent &event, const QmlEventType &type) { - if (!d->acceptedTypes.contains(type.rangeType())) + if (!m_acceptedTypes.contains(type.rangeType())) return; bool isRecursive = false; - QStack &stack = type.rangeType() == Compiling ? d->compileStack : d->callStack; + QStack &stack = type.rangeType() == Compiling ? m_compileStack : m_callStack; switch (event.rangeStage()) { case RangeStart: stack.push(event); @@ -227,7 +204,7 @@ void QmlProfilerStatisticsModel::loadEvent(const QmlEvent &event, const QmlEvent // update stats QTC_ASSERT(!stack.isEmpty(), return); QTC_ASSERT(stack.top().typeIndex() == event.typeIndex(), return); - QmlEventStats *stats = &d->data[event.typeIndex()]; + QmlEventStats *stats = &m_data[event.typeIndex()]; qint64 duration = event.timestamp() - stack.top().timestamp(); stats->duration += duration; stats->durationSelf += duration; @@ -237,7 +214,7 @@ void QmlProfilerStatisticsModel::loadEvent(const QmlEvent &event, const QmlEvent stats->maxTime = duration; stats->calls++; // for median computing - d->durations[event.typeIndex()].append(duration); + m_durations[event.typeIndex()].append(duration); stack.pop(); // recursion detection: check whether event was already in stack @@ -250,27 +227,27 @@ void QmlProfilerStatisticsModel::loadEvent(const QmlEvent &event, const QmlEvent } if (!stack.isEmpty()) - d->data[stack.top().typeIndex()].durationSelf -= duration; + m_data[stack.top().typeIndex()].durationSelf -= duration; else - d->data[-1].duration += duration; + m_data[-1].duration += duration; break; } default: return; } - if (!d->childrenModel.isNull()) - d->childrenModel->loadEvent(type.rangeType(), event, isRecursive); - if (!d->parentsModel.isNull()) - d->parentsModel->loadEvent(type.rangeType(), event, isRecursive); + if (!m_calleesModel.isNull()) + m_calleesModel->loadEvent(type.rangeType(), event, isRecursive); + if (!m_callersModel.isNull()) + m_callersModel->loadEvent(type.rangeType(), event, isRecursive); } void QmlProfilerStatisticsModel::finalize() { // post-process: calc mean time, median time, percentoftime - for (QHash::iterator it = d->data.begin(); it != d->data.end(); ++it) { - QVector eventDurations = d->durations[it.key()]; + for (QHash::iterator it = m_data.begin(); it != m_data.end(); ++it) { + QVector eventDurations = m_durations[it.key()]; if (!eventDurations.isEmpty()) { Utils::sort(eventDurations); it->medianTime = eventDurations.at(eventDurations.count()/2); @@ -278,7 +255,7 @@ void QmlProfilerStatisticsModel::finalize() } // insert root event - QmlEventStats &rootEvent = d->data[-1]; + QmlEventStats &rootEvent = m_data[-1]; rootEvent.minTime = rootEvent.maxTime = rootEvent.medianTime = rootEvent.duration; rootEvent.durationSelf = 0; rootEvent.calls = 1; @@ -288,17 +265,16 @@ void QmlProfilerStatisticsModel::finalize() int QmlProfilerStatisticsModel::count() const { - return d->data.count(); + return m_data.count(); } QmlProfilerStatisticsRelativesModel::QmlProfilerStatisticsRelativesModel( - QmlProfilerModelManager *modelManager, QmlProfilerStatisticsModel *statisticsModel, - QmlProfilerStatisticsRelation relation, QObject *parent) : - QObject(parent), m_relation(relation) + QmlProfilerModelManager *modelManager, + QmlProfilerStatisticsModel *statisticsModel, + QmlProfilerStatisticsRelation relation) : + m_modelManager(modelManager), m_relation(relation) { QTC_CHECK(modelManager); - m_modelManager = modelManager; - QTC_CHECK(statisticsModel); statisticsModel->setRelativesModel(this, relation); diff --git a/src/plugins/qmlprofiler/qmlprofilerstatisticsmodel.h b/src/plugins/qmlprofiler/qmlprofilerstatisticsmodel.h index a4722de0138..2c2bac88f6e 100644 --- a/src/plugins/qmlprofiler/qmlprofilerstatisticsmodel.h +++ b/src/plugins/qmlprofiler/qmlprofilerstatisticsmodel.h @@ -34,6 +34,7 @@ #include #include #include +#include namespace QmlProfiler { class QmlProfilerModelManager; @@ -49,24 +50,23 @@ class QmlProfilerStatisticsModel : public QObject Q_OBJECT public: struct QmlEventStats { - QmlEventStats() : duration(0), durationSelf(0), durationRecursive(0), calls(0), - minTime(std::numeric_limits::max()), maxTime(0), medianTime(0) {} - qint64 duration; - qint64 durationSelf; - qint64 durationRecursive; - qint64 calls; - qint64 minTime; - qint64 maxTime; - qint64 medianTime; + qint64 duration = 0; + qint64 durationSelf = 0; + qint64 durationRecursive = 0; + qint64 calls = 0; + qint64 minTime = std::numeric_limits::max(); + qint64 maxTime = 0; + qint64 medianTime = 0; }; double durationPercent(int typeId) const; double durationSelfPercent(int typeId) const; - QmlProfilerStatisticsModel(QmlProfilerModelManager *modelManager, QObject *parent = 0); - ~QmlProfilerStatisticsModel(); + QmlProfilerStatisticsModel(QmlProfilerModelManager *modelManager); + ~QmlProfilerStatisticsModel() override = default; void restrictToFeatures(quint64 features); + bool isRestrictedToRange() const; const QHash &getData() const; const QVector &getTypes() const; @@ -90,8 +90,18 @@ private: void dataChanged(); void notesChanged(int typeIndex); - class QmlProfilerStatisticsModelPrivate; - QmlProfilerStatisticsModelPrivate *d; + QHash m_data; + + QPointer m_calleesModel; + QPointer m_callersModel; + QPointer m_modelManager; + + QList m_acceptedTypes; + QHash m_notes; + + QStack m_callStack; + QStack m_compileStack; + QHash> m_durations; }; class QmlProfilerStatisticsRelativesModel : public QObject @@ -100,16 +110,15 @@ class QmlProfilerStatisticsRelativesModel : public QObject public: struct QmlStatisticsRelativesData { - qint64 duration; - qint64 calls; - bool isRecursive; + qint64 duration = 0; + qint64 calls = 0; + bool isRecursive = false; }; typedef QHash QmlStatisticsRelativesMap; QmlProfilerStatisticsRelativesModel(QmlProfilerModelManager *modelManager, QmlProfilerStatisticsModel *statisticsModel, - QmlProfilerStatisticsRelation relation, - QObject *parent = 0); + QmlProfilerStatisticsRelation relation); int count() const; void clear(); @@ -125,12 +134,12 @@ signals: void dataAvailable(); protected: - QHash m_data; - QmlProfilerModelManager *m_modelManager; + QHash m_data; + QPointer m_modelManager; struct Frame { - qint64 startTime; - int typeId; + qint64 startTime = 0; + int typeId = -1; }; QStack m_callStack; QStack m_compileStack; diff --git a/src/plugins/qmlprofiler/qmlprofilerstatisticsview.cpp b/src/plugins/qmlprofiler/qmlprofilerstatisticsview.cpp index 080925e5af6..97f970de072 100644 --- a/src/plugins/qmlprofiler/qmlprofilerstatisticsview.cpp +++ b/src/plugins/qmlprofiler/qmlprofilerstatisticsview.cpp @@ -64,15 +64,14 @@ struct SortPreserver { view->sortByColumn(column, order); } - int column; - Qt::SortOrder order; - Utils::TreeView *view; + int column = DEFAULT_SORT_COLUMN; + Qt::SortOrder order = Qt::DescendingOrder; + Utils::TreeView *view = nullptr; }; struct Colors { - Colors () : noteBackground(QColor("orange")), defaultBackground(QColor("white")) {} - QColor noteBackground; - QColor defaultBackground; + QColor noteBackground = QColor("orange"); + QColor defaultBackground = QColor("white"); }; struct RootEventType : public QmlEventType { @@ -108,16 +107,6 @@ public: } }; -class QmlProfilerStatisticsView::QmlProfilerStatisticsViewPrivate -{ -public: - QmlProfilerStatisticsMainView *m_statsTree; - QmlProfilerStatisticsRelativesView *m_statsChildren; - QmlProfilerStatisticsRelativesView *m_statsParents; - - QmlProfilerStatisticsModel *model; -}; - static void setViewDefaults(Utils::TreeView *view) { view->setFrameStyle(QFrame::NoFrame); @@ -195,38 +184,35 @@ static void getSourceLocation(QStandardItem *infoItem, QmlProfilerStatisticsView::QmlProfilerStatisticsView(QmlProfilerModelManager *profilerModelManager, QWidget *parent) - : QmlProfilerEventsView(parent), d(new QmlProfilerStatisticsViewPrivate) + : QmlProfilerEventsView(parent) { setObjectName(QLatin1String("QmlProfiler.Statistics.Dock")); setWindowTitle(tr("Statistics")); - d->model = new QmlProfilerStatisticsModel(profilerModelManager, this); - - d->m_statsTree = new QmlProfilerStatisticsMainView(this, d->model); - connect(d->m_statsTree, &QmlProfilerStatisticsMainView::gotoSourceLocation, + QmlProfilerStatisticsModel *model = new QmlProfilerStatisticsModel(profilerModelManager); + m_mainView.reset(new QmlProfilerStatisticsMainView(model)); + connect(m_mainView.get(), &QmlProfilerStatisticsMainView::gotoSourceLocation, this, &QmlProfilerStatisticsView::gotoSourceLocation); - connect(d->m_statsTree, &QmlProfilerStatisticsMainView::typeSelected, + connect(m_mainView.get(), &QmlProfilerStatisticsMainView::typeSelected, this, &QmlProfilerStatisticsView::typeSelected); - d->m_statsChildren = new QmlProfilerStatisticsRelativesView( - new QmlProfilerStatisticsRelativesModel(profilerModelManager, d->model, - QmlProfilerStatisticsChilden, this), - this); - d->m_statsParents = new QmlProfilerStatisticsRelativesView( - new QmlProfilerStatisticsRelativesModel(profilerModelManager, d->model, - QmlProfilerStatisticsParents, this), - this); - connect(d->m_statsTree, &QmlProfilerStatisticsMainView::typeSelected, - d->m_statsChildren, &QmlProfilerStatisticsRelativesView::displayType); - connect(d->m_statsTree, &QmlProfilerStatisticsMainView::typeSelected, - d->m_statsParents, &QmlProfilerStatisticsRelativesView::displayType); - connect(d->m_statsChildren, &QmlProfilerStatisticsRelativesView::typeClicked, - d->m_statsTree, &QmlProfilerStatisticsMainView::selectType); - connect(d->m_statsParents, &QmlProfilerStatisticsRelativesView::typeClicked, - d->m_statsTree, &QmlProfilerStatisticsMainView::selectType); - connect(d->m_statsChildren, &QmlProfilerStatisticsRelativesView::gotoSourceLocation, + m_calleesView.reset(new QmlProfilerStatisticsRelativesView( + new QmlProfilerStatisticsRelativesModel(profilerModelManager, model, + QmlProfilerStatisticsChilden))); + m_callersView.reset(new QmlProfilerStatisticsRelativesView( + new QmlProfilerStatisticsRelativesModel(profilerModelManager, model, + QmlProfilerStatisticsParents))); + connect(m_mainView.get(), &QmlProfilerStatisticsMainView::typeSelected, + m_calleesView.get(), &QmlProfilerStatisticsRelativesView::displayType); + connect(m_mainView.get(), &QmlProfilerStatisticsMainView::typeSelected, + m_callersView.get(), &QmlProfilerStatisticsRelativesView::displayType); + connect(m_calleesView.get(), &QmlProfilerStatisticsRelativesView::typeClicked, + m_mainView.get(), &QmlProfilerStatisticsMainView::selectType); + connect(m_callersView.get(), &QmlProfilerStatisticsRelativesView::typeClicked, + m_mainView.get(), &QmlProfilerStatisticsMainView::selectType); + connect(m_calleesView.get(), &QmlProfilerStatisticsRelativesView::gotoSourceLocation, this, &QmlProfilerStatisticsView::gotoSourceLocation); - connect(d->m_statsParents, &QmlProfilerStatisticsRelativesView::gotoSourceLocation, + connect(m_callersView.get(), &QmlProfilerStatisticsRelativesView::gotoSourceLocation, this, &QmlProfilerStatisticsView::gotoSourceLocation); // widget arrangement @@ -235,10 +221,10 @@ QmlProfilerStatisticsView::QmlProfilerStatisticsView(QmlProfilerModelManager *pr groupLayout->setSpacing(0); Core::MiniSplitter *splitterVertical = new Core::MiniSplitter; - splitterVertical->addWidget(d->m_statsTree); + splitterVertical->addWidget(m_mainView.get()); Core::MiniSplitter *splitterHorizontal = new Core::MiniSplitter; - splitterHorizontal->addWidget(d->m_statsParents); - splitterHorizontal->addWidget(d->m_statsChildren); + splitterHorizontal->addWidget(m_callersView.get()); + splitterHorizontal->addWidget(m_calleesView.get()); splitterHorizontal->setOrientation(Qt::Horizontal); splitterVertical->addWidget(splitterHorizontal); splitterVertical->setOrientation(Qt::Vertical); @@ -248,17 +234,11 @@ QmlProfilerStatisticsView::QmlProfilerStatisticsView(QmlProfilerModelManager *pr setLayout(groupLayout); } -QmlProfilerStatisticsView::~QmlProfilerStatisticsView() -{ - delete d->model; - delete d; -} - void QmlProfilerStatisticsView::clear() { - d->m_statsTree->clear(); - d->m_statsChildren->clear(); - d->m_statsParents->clear(); + m_mainView->clear(); + m_calleesView->clear(); + m_callersView->clear(); } QString QmlProfilerStatisticsView::summary(const QVector &typeIds) const @@ -269,7 +249,7 @@ QString QmlProfilerStatisticsView::summary(const QVector &typeIds) const double sum = 0; for (int typeId : typeIds) { - const double percentage = d->model->durationPercent(typeId); + const double percentage = m_mainView->durationPercent(typeId); if (percentage > maximum) maximum = percentage; sum += percentage; @@ -292,7 +272,7 @@ QString QmlProfilerStatisticsView::summary(const QVector &typeIds) const QStringList QmlProfilerStatisticsView::details(int typeId) const { - const QmlEventType &type = d->model->getTypes()[typeId]; + const QmlEventType &type = m_mainView->getType(typeId); const QChar ellipsisChar(0x2026); const int maxColumnWidth = 32; @@ -304,13 +284,13 @@ QStringList QmlProfilerStatisticsView::details(int typeId) const return QStringList({ QmlProfilerStatisticsMainView::nameForType(type.rangeType()), data, - QString::number(d->model->durationPercent(typeId), 'f', 2) + QLatin1Char('%') + QString::number(m_mainView->durationPercent(typeId), 'f', 2) + QLatin1Char('%') }); } QModelIndex QmlProfilerStatisticsView::selectedModelIndex() const { - return d->m_statsTree->selectedModelIndex(); + return m_mainView->selectedModelIndex(); } void QmlProfilerStatisticsView::contextMenuEvent(QContextMenuEvent *ev) @@ -340,7 +320,7 @@ void QmlProfilerStatisticsView::contextMenuEvent(QContextMenuEvent *ev) menu.addSeparator(); getGlobalStatsAction = menu.addAction(tr("Show Full Range")); - if (!d->model->modelManager()->isRestrictedToRange()) + if (!m_mainView->isRestrictedToRange()) getGlobalStatsAction->setEnabled(false); QAction *selectedAction = menu.exec(position); @@ -359,74 +339,57 @@ void QmlProfilerStatisticsView::contextMenuEvent(QContextMenuEvent *ev) bool QmlProfilerStatisticsView::mouseOnTable(const QPoint &position) const { - QPoint tableTopLeft = d->m_statsTree->mapToGlobal(QPoint(0,0)); - QPoint tableBottomRight = d->m_statsTree->mapToGlobal(QPoint(d->m_statsTree->width(), d->m_statsTree->height())); + QPoint tableTopLeft = m_mainView->mapToGlobal(QPoint(0,0)); + QPoint tableBottomRight = m_mainView->mapToGlobal(QPoint(m_mainView->width(), m_mainView->height())); return (position.x() >= tableTopLeft.x() && position.x() <= tableBottomRight.x() && position.y() >= tableTopLeft.y() && position.y() <= tableBottomRight.y()); } void QmlProfilerStatisticsView::copyTableToClipboard() const { - d->m_statsTree->copyTableToClipboard(); + m_mainView->copyTableToClipboard(); } void QmlProfilerStatisticsView::copyRowToClipboard() const { - d->m_statsTree->copyRowToClipboard(); + m_mainView->copyRowToClipboard(); } void QmlProfilerStatisticsView::selectByTypeId(int typeIndex) { - if (d->m_statsTree->selectedTypeId() != typeIndex) - d->m_statsTree->selectType(typeIndex); + if (m_mainView->selectedTypeId() != typeIndex) + m_mainView->selectType(typeIndex); } void QmlProfilerStatisticsView::onVisibleFeaturesChanged(quint64 features) { - d->model->restrictToFeatures(features); + m_mainView->restrictToFeatures(features); } void QmlProfilerStatisticsView::setShowExtendedStatistics(bool show) { - d->m_statsTree->setShowExtendedStatistics(show); + m_mainView->setShowExtendedStatistics(show); } bool QmlProfilerStatisticsView::showExtendedStatistics() const { - return d->m_statsTree->showExtendedStatistics(); + return m_mainView->showExtendedStatistics(); } -class QmlProfilerStatisticsMainView::QmlProfilerStatisticsMainViewPrivate -{ -public: - QmlProfilerStatisticsMainViewPrivate(QmlProfilerStatisticsMainView *qq) : q(qq) {} - - QString textForItem(QStandardItem *item) const; - - QmlProfilerStatisticsMainView *q; - - QmlProfilerStatisticsModel *model; - QStandardItemModel *m_model; - bool m_showExtendedStatistics; -}; - -QmlProfilerStatisticsMainView::QmlProfilerStatisticsMainView( - QWidget *parent, QmlProfilerStatisticsModel *model) : - Utils::TreeView(parent), d(new QmlProfilerStatisticsMainViewPrivate(this)) +QmlProfilerStatisticsMainView::QmlProfilerStatisticsMainView(QmlProfilerStatisticsModel *model) : + m_model(model) { setViewDefaults(this); setObjectName(QLatin1String("QmlProfilerEventsTable")); - d->m_model = new QStandardItemModel(this); - d->m_model->setSortRole(SortRole); - setModel(d->m_model); + m_standardItemModel.reset(new QStandardItemModel); + m_standardItemModel->setSortRole(SortRole); + setModel(m_standardItemModel.get()); connect(this, &QAbstractItemView::activated, this, &QmlProfilerStatisticsMainView::jumpToItem); - d->model = model; - connect(d->model, &QmlProfilerStatisticsModel::dataAvailable, + connect(m_model.get(), &QmlProfilerStatisticsModel::dataAvailable, this, &QmlProfilerStatisticsMainView::buildModel); - connect(d->model, &QmlProfilerStatisticsModel::notesAvailable, + connect(m_model.get(), &QmlProfilerStatisticsModel::notesAvailable, this, &QmlProfilerStatisticsMainView::updateNotes); - d->m_showExtendedStatistics = false; setSortingEnabled(true); sortByColumn(DEFAULT_SORT_COLUMN, Qt::DescendingOrder); @@ -437,20 +400,20 @@ QmlProfilerStatisticsMainView::QmlProfilerStatisticsMainView( QmlProfilerStatisticsMainView::~QmlProfilerStatisticsMainView() { clear(); - delete d->m_model; - delete d; } void QmlProfilerStatisticsMainView::setHeaderLabels() { - for (int i = 0; i < MaxMainField; ++i) - d->m_model->setHeaderData(i, Qt::Horizontal, displayHeader(static_cast(i))); + for (int i = 0; i < MaxMainField; ++i) { + m_standardItemModel->setHeaderData(i, Qt::Horizontal, + displayHeader(static_cast(i))); + } } void QmlProfilerStatisticsMainView::setShowExtendedStatistics(bool show) { // Not checking if already set because we don't want the first call to skip - d->m_showExtendedStatistics = show; + m_showExtendedStatistics = show; if (show) { showColumn(MainMedianTime); showColumn(MainMaxTime); @@ -464,14 +427,14 @@ void QmlProfilerStatisticsMainView::setShowExtendedStatistics(bool show) bool QmlProfilerStatisticsMainView::showExtendedStatistics() const { - return d->m_showExtendedStatistics; + return m_showExtendedStatistics; } void QmlProfilerStatisticsMainView::clear() { SortPreserver sorter(this); - d->m_model->clear(); - d->m_model->setColumnCount(MaxMainField); + m_standardItemModel->clear(); + m_standardItemModel->setColumnCount(MaxMainField); setHeaderLabels(); } @@ -482,7 +445,7 @@ void QmlProfilerStatisticsMainView::buildModel() { SortPreserver sorter(this); parseModel(); - setShowExtendedStatistics(d->m_showExtendedStatistics); + setShowExtendedStatistics(m_showExtendedStatistics); setRootIsDecorated(false); } @@ -492,9 +455,9 @@ void QmlProfilerStatisticsMainView::buildModel() void QmlProfilerStatisticsMainView::updateNotes(int typeIndex) { - const QHash &eventList = d->model->getData(); - const QHash ¬eList = d->model->getNotes(); - QStandardItem *parentItem = d->m_model->invisibleRootItem(); + const QHash &eventList = m_model->getData(); + const QHash ¬eList = m_model->getNotes(); + QStandardItem *parentItem = m_standardItemModel->invisibleRootItem(); for (int rowIndex = 0; rowIndex < parentItem->rowCount(); ++rowIndex) { int rowType = parentItem->child(rowIndex)->data(TypeIdRole).toInt(); @@ -520,17 +483,37 @@ void QmlProfilerStatisticsMainView::updateNotes(int typeIndex) } } +void QmlProfilerStatisticsMainView::restrictToFeatures(quint64 features) +{ + m_model->restrictToFeatures(features); +} + +bool QmlProfilerStatisticsMainView::isRestrictedToRange() const +{ + return m_model->isRestrictedToRange(); +} + +double QmlProfilerStatisticsMainView::durationPercent(int typeId) const +{ + return m_model->durationPercent(typeId); +} + +const QmlEventType &QmlProfilerStatisticsMainView::getType(int typeId) const +{ + return m_model->getTypes()[typeId]; +} + void QmlProfilerStatisticsMainView::parseModel() { - const QHash &eventList = d->model->getData(); - const QVector &typeList = d->model->getTypes(); + const QHash &eventList = m_model->getData(); + const QVector &typeList = m_model->getTypes(); QHash::ConstIterator it; for (it = eventList.constBegin(); it != eventList.constEnd(); ++it) { int typeIndex = it.key(); const QmlProfilerStatisticsModel::QmlEventStats &stats = it.value(); const QmlEventType &type = (typeIndex != -1 ? typeList[typeIndex] : *rootEventType()); - QStandardItem *parentItem = d->m_model->invisibleRootItem(); + QStandardItem *parentItem = m_standardItemModel->invisibleRootItem(); QList newRow; newRow << new StatisticsViewItem( @@ -540,7 +523,7 @@ void QmlProfilerStatisticsMainView::parseModel() QString typeString = QmlProfilerStatisticsMainView::nameForType(type.rangeType()); newRow << new StatisticsViewItem(typeString, typeString); - const double percent = d->model->durationPercent(typeIndex); + const double percent = m_model->durationPercent(typeIndex); newRow << new StatisticsViewItem(QString::number(percent, 'f', 2) + QLatin1String(" %"), percent); @@ -548,7 +531,7 @@ void QmlProfilerStatisticsMainView::parseModel() Timeline::formatTime(stats.duration - stats.durationRecursive), stats.duration - stats.durationRecursive); - const double percentSelf = d->model->durationSelfPercent(typeIndex); + const double percentSelf = m_model->durationSelfPercent(typeIndex); newRow << new StatisticsViewItem(QString::number(percentSelf, 'f', 2) + QLatin1String(" %"), percentSelf); @@ -592,12 +575,11 @@ void QmlProfilerStatisticsMainView::parseModel() QStandardItem *QmlProfilerStatisticsMainView::itemFromIndex(const QModelIndex &index) const { - QStandardItem *indexItem = d->m_model->itemFromIndex(index); + QStandardItem *indexItem = m_standardItemModel->itemFromIndex(index); if (indexItem->parent()) return indexItem->parent()->child(indexItem->row()); else - return d->m_model->item(index.row()); - + return m_standardItemModel->item(index.row()); } QString QmlProfilerStatisticsMainView::nameForType(RangeType typeNumber) @@ -618,7 +600,7 @@ int QmlProfilerStatisticsMainView::selectedTypeId() const QModelIndex index = selectedModelIndex(); if (!index.isValid()) return -1; - QStandardItem *item = d->m_model->item(index.row()); + QStandardItem *item = m_standardItemModel->item(index.row()); return item->data(TypeIdRole).toInt(); } @@ -638,7 +620,7 @@ void QmlProfilerStatisticsMainView::jumpToItem(const QModelIndex &index) void QmlProfilerStatisticsMainView::selectItem(const QStandardItem *item) { // If the same item is already selected, don't reselect it. - QModelIndex index = d->m_model->indexFromItem(item); + QModelIndex index = m_standardItemModel->indexFromItem(item); if (index != currentIndex()) { setCurrentIndex(index); @@ -649,8 +631,8 @@ void QmlProfilerStatisticsMainView::selectItem(const QStandardItem *item) void QmlProfilerStatisticsMainView::selectType(int typeIndex) { - for (int i=0; im_model->rowCount(); i++) { - QStandardItem *infoItem = d->m_model->item(i); + for (int i = 0; i < m_standardItemModel->rowCount(); i++) { + QStandardItem *infoItem = m_standardItemModel->item(i); if (infoItem->data(TypeIdRole).toInt() == typeIndex) { selectItem(infoItem); return; @@ -667,16 +649,15 @@ QModelIndex QmlProfilerStatisticsMainView::selectedModelIndex() const return sel.first(); } -QString QmlProfilerStatisticsMainView::QmlProfilerStatisticsMainViewPrivate::textForItem( - QStandardItem *item) const +QString QmlProfilerStatisticsMainView::textForItem(QStandardItem *item) const { QString str; // item's data - int colCount = m_model->columnCount(); + int colCount = m_standardItemModel->columnCount(); for (int j = 0; j < colCount; ++j) { QStandardItem *colItem = item->parent() ? item->parent()->child(item->row(),j) : - m_model->item(item->row(),j); + m_standardItemModel->item(item->row(),j); str += colItem->data(Qt::DisplayRole).toString(); if (j < colCount-1) str += QLatin1Char('\t'); } @@ -689,18 +670,18 @@ void QmlProfilerStatisticsMainView::copyTableToClipboard() const { QString str; // headers - int columnCount = d->m_model->columnCount(); + int columnCount = m_standardItemModel->columnCount(); for (int i = 0; i < columnCount; ++i) { - str += d->m_model->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString(); + str += m_standardItemModel->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString(); if (i < columnCount - 1) str += QLatin1Char('\t'); else str += QLatin1Char('\n'); } // data - int rowCount = d->m_model->rowCount(); + int rowCount = m_standardItemModel->rowCount(); for (int i = 0; i != rowCount; ++i) { - str += d->textForItem(d->m_model->item(i)); + str += textForItem(m_standardItemModel->item(i)); } QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(str, QClipboard::Selection); @@ -709,29 +690,17 @@ void QmlProfilerStatisticsMainView::copyTableToClipboard() const void QmlProfilerStatisticsMainView::copyRowToClipboard() const { - QString str = d->textForItem(d->m_model->itemFromIndex(selectedModelIndex())); + QString str = textForItem(m_standardItemModel->itemFromIndex(selectedModelIndex())); QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(str, QClipboard::Selection); clipboard->setText(str, QClipboard::Clipboard); } -class QmlProfilerStatisticsRelativesView::QmlProfilerStatisticsRelativesViewPrivate -{ -public: - QmlProfilerStatisticsRelativesViewPrivate(QmlProfilerStatisticsRelativesView *qq):q(qq) {} - ~QmlProfilerStatisticsRelativesViewPrivate() {} - - QmlProfilerStatisticsRelativesModel *model; - - QmlProfilerStatisticsRelativesView *q; -}; - QmlProfilerStatisticsRelativesView::QmlProfilerStatisticsRelativesView( - QmlProfilerStatisticsRelativesModel *model, QWidget *parent) : - Utils::TreeView(parent), d(new QmlProfilerStatisticsRelativesViewPrivate(this)) + QmlProfilerStatisticsRelativesModel *model) : + m_model(model) { setViewDefaults(this); - d->model = model; QStandardItemModel *itemModel = new QStandardItemModel(this); itemModel->setSortRole(SortRole); setModel(itemModel); @@ -745,19 +714,18 @@ QmlProfilerStatisticsRelativesView::QmlProfilerStatisticsRelativesView( this, &QmlProfilerStatisticsRelativesView::jumpToItem); // Clear when new data available as the selection may be invalid now. - connect(d->model, &QmlProfilerStatisticsRelativesModel::dataAvailable, + connect(m_model.get(), &QmlProfilerStatisticsRelativesModel::dataAvailable, this, &QmlProfilerStatisticsRelativesView::clear); } QmlProfilerStatisticsRelativesView::~QmlProfilerStatisticsRelativesView() { - delete d; } void QmlProfilerStatisticsRelativesView::displayType(int typeIndex) { SortPreserver sorter(this); - rebuildTree(d->model->getData(typeIndex)); + rebuildTree(m_model->getData(typeIndex)); updateHeader(); resizeColumnToContents(RelativeLocation); @@ -770,7 +738,7 @@ void QmlProfilerStatisticsRelativesView::rebuildTree( treeModel()->clear(); QStandardItem *topLevelItem = treeModel()->invisibleRootItem(); - const QVector &typeList = d->model->getTypes(); + const QVector &typeList = m_model->getTypes(); QmlProfilerStatisticsRelativesModel::QmlStatisticsRelativesMap::const_iterator it; for (it = map.constBegin(); it != map.constEnd(); ++it) { @@ -825,7 +793,7 @@ void QmlProfilerStatisticsRelativesView::clear() void QmlProfilerStatisticsRelativesView::updateHeader() { - const QmlProfilerStatisticsRelation relation = d->model->relation(); + const QmlProfilerStatisticsRelation relation = m_model->relation(); if (QStandardItemModel *model = treeModel()) { model->setColumnCount(MaxRelativeField); for (int i = 0; i < MaxRelativeField; ++i) { diff --git a/src/plugins/qmlprofiler/qmlprofilerstatisticsview.h b/src/plugins/qmlprofiler/qmlprofilerstatisticsview.h index 75434a041a3..957ac190155 100644 --- a/src/plugins/qmlprofiler/qmlprofilerstatisticsview.h +++ b/src/plugins/qmlprofiler/qmlprofilerstatisticsview.h @@ -33,6 +33,7 @@ #include #include +#include #include namespace QmlProfiler { @@ -80,7 +81,7 @@ class QmlProfilerStatisticsView : public QmlProfilerEventsView public: explicit QmlProfilerStatisticsView(QmlProfilerModelManager *profilerModelManager, QWidget *parent = nullptr); - ~QmlProfilerStatisticsView(); + ~QmlProfilerStatisticsView() override = default; void clear() override; QString summary(const QVector &typeIds) const; @@ -100,15 +101,16 @@ private: void setShowExtendedStatistics(bool show); bool showExtendedStatistics() const; - class QmlProfilerStatisticsViewPrivate; - QmlProfilerStatisticsViewPrivate *d; + std::unique_ptr m_mainView; + std::unique_ptr m_calleesView; + std::unique_ptr m_callersView; }; class QmlProfilerStatisticsMainView : public Utils::TreeView { Q_OBJECT public: - explicit QmlProfilerStatisticsMainView(QWidget *parent, QmlProfilerStatisticsModel *model); + explicit QmlProfilerStatisticsMainView(QmlProfilerStatisticsModel *model); ~QmlProfilerStatisticsMainView(); QModelIndex selectedModelIndex() const; @@ -128,6 +130,12 @@ public: void buildModel(); void updateNotes(int typeIndex); + void restrictToFeatures(quint64 features); + bool isRestrictedToRange() const; + double durationPercent(int typeId) const; + + const QmlEventType &getType(int typeId) const; + signals: void gotoSourceLocation(const QString &fileName, int lineNumber, int columnNumber); void typeSelected(int typeIndex); @@ -137,17 +145,18 @@ private: void setHeaderLabels(); void parseModel(); QStandardItem *itemFromIndex(const QModelIndex &index) const; + QString textForItem(QStandardItem *item) const; - class QmlProfilerStatisticsMainViewPrivate; - QmlProfilerStatisticsMainViewPrivate *d; + std::unique_ptr m_model; + std::unique_ptr m_standardItemModel; + bool m_showExtendedStatistics = false; }; class QmlProfilerStatisticsRelativesView : public Utils::TreeView { Q_OBJECT public: - explicit QmlProfilerStatisticsRelativesView(QmlProfilerStatisticsRelativesModel *model, - QWidget *parent); + explicit QmlProfilerStatisticsRelativesView(QmlProfilerStatisticsRelativesModel *model); ~QmlProfilerStatisticsRelativesView(); void displayType(int typeIndex); @@ -163,8 +172,7 @@ private: void updateHeader(); QStandardItemModel *treeModel(); - class QmlProfilerStatisticsRelativesViewPrivate; - QmlProfilerStatisticsRelativesViewPrivate *d; + std::unique_ptr m_model; }; } // namespace Internal