diff --git a/src/libs/qmldebug/qmlprofilereventtypes.h b/src/libs/qmldebug/qmlprofilereventtypes.h index bcc353bc527fa802e203f2a81206b16fac1a2443..06517a2cfc2aefb24a74b6fd8837a45109e69895 100644 --- a/src/libs/qmldebug/qmlprofilereventtypes.h +++ b/src/libs/qmldebug/qmlprofilereventtypes.h @@ -120,8 +120,31 @@ enum AnimationThread { MaximumAnimationThread }; +enum ProfileFeature { + ProfileJavaScript, + ProfileMemory, + ProfilePixmapCache, + ProfileSceneGraph, + ProfileAnimations, + ProfilePainting, + ProfileCompiling, + ProfileCreating, + ProfileBinding, + ProfileHandlingSignal, + ProfileInputEvents, + + MaximumProfileFeature +}; + namespace Constants { const int QML_MIN_LEVEL = 1; // Set to 0 to remove the empty line between models in the timeline + +// Shorthand for all QML and JS range features. +const quint64 QML_JS_RANGE_FEATURES = (1 << ProfileCompiling) | + (1 << ProfileCreating) | + (1 << ProfileBinding) | + (1 << ProfileHandlingSignal) | + (1 << ProfileJavaScript); } } // namespace QmlDebug diff --git a/src/libs/qmldebug/qmlprofilertraceclient.cpp b/src/libs/qmldebug/qmlprofilertraceclient.cpp index 64d505068c729abe9d733ad94c1765e8f19b3976..aee96b1d297b2b6d0428b130f333144668577c7f 100644 --- a/src/libs/qmldebug/qmlprofilertraceclient.cpp +++ b/src/libs/qmldebug/qmlprofilertraceclient.cpp @@ -40,6 +40,7 @@ public: , inProgressRanges(0) , maximumTime(0) , recording(false) + , features(0) { ::memset(rangeCount, 0, MaximumRangeType * sizeof(int)); } @@ -56,6 +57,7 @@ public: int rangeCount[MaximumRangeType]; qint64 maximumTime; bool recording; + quint64 features; }; } // namespace QmlDebug @@ -68,16 +70,17 @@ void QmlProfilerTraceClientPrivate::sendRecordingStatus(int engineId) { QByteArray ba; QDataStream stream(&ba, QIODevice::WriteOnly); - stream << recording; - if (engineId != -1) - stream << engineId; + stream << recording << engineId; // engineId -1 is OK. It means "all of them" + if (recording) + stream << features; q->sendMessage(ba); } -QmlProfilerTraceClient::QmlProfilerTraceClient(QmlDebugConnection *client) +QmlProfilerTraceClient::QmlProfilerTraceClient(QmlDebugConnection *client, quint64 features) : QmlDebugClient(QLatin1String("CanvasFrameRate"), client) , d(new QmlProfilerTraceClientPrivate(this, client)) { + d->features = features; connect(&d->engineControl, SIGNAL(engineAboutToBeAdded(int,QString)), this, SLOT(sendRecordingStatus(int))); } @@ -131,6 +134,11 @@ void QmlProfilerTraceClient::setRecording(bool v) emit recordingChanged(v); } +void QmlProfilerTraceClient::setFeatures(quint64 features) +{ + d->features = features; +} + void QmlProfilerTraceClient::setRecordingFromServer(bool v) { if (v == d->recording) diff --git a/src/libs/qmldebug/qmlprofilertraceclient.h b/src/libs/qmldebug/qmlprofilertraceclient.h index 2f56921645fd4aff2ad7ddae348764abba83d1aa..400d662a01b3fa954a860c5e132041d4ffb7d810 100644 --- a/src/libs/qmldebug/qmlprofilertraceclient.h +++ b/src/libs/qmldebug/qmlprofilertraceclient.h @@ -50,7 +50,7 @@ class QMLDEBUG_EXPORT QmlProfilerTraceClient : public QmlDebug::QmlDebugClient using QObject::event; public: - QmlProfilerTraceClient(QmlDebugConnection *client); + QmlProfilerTraceClient(QmlDebugConnection *client, quint64 features); ~QmlProfilerTraceClient(); bool isEnabled() const; @@ -60,6 +60,7 @@ public: public slots: void clearData(); void sendRecordingStatus(int engineId = -1); + void setFeatures(quint64 features); signals: void complete(qint64 maximumTime); diff --git a/src/plugins/qmlprofiler/abstracttimelinemodel.cpp b/src/plugins/qmlprofiler/abstracttimelinemodel.cpp index 95ee07da3d211b523c5a82f5a139d95c3c65fe24..e13cb2272f271815124dcd1f8009c9927a16a7f9 100644 --- a/src/plugins/qmlprofiler/abstracttimelinemodel.cpp +++ b/src/plugins/qmlprofiler/abstracttimelinemodel.cpp @@ -59,6 +59,7 @@ void AbstractTimelineModel::setModelManager(QmlProfilerModelManager *modelManage d->modelManager = modelManager; connect(d->modelManager->qmlModel(),SIGNAL(changed()),this,SLOT(dataChanged())); d->modelId = d->modelManager->registerModelProxy(); + d->modelManager->announceFeatures(d->modelId, features()); } bool AbstractTimelineModel::isEmpty() const diff --git a/src/plugins/qmlprofiler/abstracttimelinemodel.h b/src/plugins/qmlprofiler/abstracttimelinemodel.h index a1e783d2bffbc3553e06e225a19832755933a3f1..552d2de909e8c92eaf79ee9262f15eefaa378c98 100644 --- a/src/plugins/qmlprofiler/abstracttimelinemodel.h +++ b/src/plugins/qmlprofiler/abstracttimelinemodel.h @@ -74,6 +74,7 @@ public: virtual QVariantMap details(int index) const = 0; virtual int row(int index) const = 0; virtual void loadData() = 0; + virtual quint64 features() const = 0; // Methods which can optionally be implemented by child models. // returned map should contain "file", "line", "column" properties, or be empty diff --git a/src/plugins/qmlprofiler/qmlprofilerclientmanager.cpp b/src/plugins/qmlprofiler/qmlprofilerclientmanager.cpp index 2d209f6f9f4a8e9f153871fe301783bd8d71438b..efb1bfef9fae1aabaa47ef25bce3e0af484b2b70 100644 --- a/src/plugins/qmlprofiler/qmlprofilerclientmanager.cpp +++ b/src/plugins/qmlprofiler/qmlprofilerclientmanager.cpp @@ -162,7 +162,8 @@ void QmlProfilerClientManager::enableServices() disconnectClientSignals(); d->profilerState->setServerRecording(false); // false by default (will be set to true when connected) delete d->qmlclientplugin.data(); - d->qmlclientplugin = new QmlProfilerTraceClient(d->connection); + d->qmlclientplugin = new QmlProfilerTraceClient(d->connection, + d->profilerState->recordingFeatures()); delete d->v8clientplugin.data(); d->v8clientplugin = new QV8ProfilerClient(d->connection); connectClientSignals(); @@ -191,6 +192,8 @@ void QmlProfilerClientManager::connectClientSignals() // fixme: this should be unified for both clients connect(d->qmlclientplugin.data(), SIGNAL(recordingChanged(bool)), d->profilerState, SLOT(setServerRecording(bool))); + connect(d->profilerState, SIGNAL(recordingFeaturesChanged(quint64)), + d->qmlclientplugin.data(), SLOT(setFeatures(quint64))); } if (d->v8clientplugin) { connect(d->v8clientplugin.data(), SIGNAL(complete()), this, SLOT(v8Complete())); @@ -223,6 +226,8 @@ void QmlProfilerClientManager::disconnectClientSignals() // fixme: this should be unified for both clients disconnect(d->qmlclientplugin.data(), SIGNAL(recordingChanged(bool)), d->profilerState, SLOT(setServerRecording(bool))); + disconnect(d->profilerState, SIGNAL(recordingFeaturesChanged(quint64)), + d->qmlclientplugin.data(), SLOT(setFeatures(quint64))); } if (d->v8clientplugin) { disconnect(d->v8clientplugin.data(), SIGNAL(complete()), this, SLOT(v8Complete())); diff --git a/src/plugins/qmlprofiler/qmlprofilereventsmodelproxy.cpp b/src/plugins/qmlprofiler/qmlprofilereventsmodelproxy.cpp index 9691dd701e2d0f46cc8713c6b6b0af110903a33b..ceb589f97d38faa4b6baa0042e3df63ed54e6149 100644 --- a/src/plugins/qmlprofiler/qmlprofilereventsmodelproxy.cpp +++ b/src/plugins/qmlprofiler/qmlprofilereventsmodelproxy.cpp @@ -74,6 +74,8 @@ QmlProfilerEventsModelProxy::QmlProfilerEventsModelProxy(QmlProfilerModelManager modelManager->setProxyCountWeight(d->modelId, 2); d->acceptedTypes << QmlDebug::Compiling << QmlDebug::Creating << QmlDebug::Binding << QmlDebug::HandlingSignal << QmlDebug::Javascript; + + modelManager->announceFeatures(d->modelId, QmlDebug::Constants::QML_JS_RANGE_FEATURES); } QmlProfilerEventsModelProxy::~QmlProfilerEventsModelProxy() diff --git a/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp b/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp index 4e633cbdd48dbffa70f2ea59dad67869055e0f63..68a9b3690373271ac89859b97a36798c0478beb6 100644 --- a/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp +++ b/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp @@ -40,6 +40,19 @@ namespace QmlProfiler { namespace Internal { +static const char *ProfileFeatureNames[QmlDebug::MaximumProfileFeature] = { + QT_TRANSLATE_NOOP("MainView", "JavaScript"), + QT_TRANSLATE_NOOP("MainView", "Memory Usage"), + QT_TRANSLATE_NOOP("MainView", "Pixmap Cache"), + QT_TRANSLATE_NOOP("MainView", "Scene Graph"), + QT_TRANSLATE_NOOP("MainView", "Animations"), + QT_TRANSLATE_NOOP("MainView", "Painting"), + QT_TRANSLATE_NOOP("MainView", "Compiling"), + QT_TRANSLATE_NOOP("MainView", "Creating"), + QT_TRANSLATE_NOOP("MainView", "Binding"), + QT_TRANSLATE_NOOP("MainView", "Handling Signal"), + QT_TRANSLATE_NOOP("MainView", "Input Events") +}; ///////////////////////////////////////////////////////////////////// QmlProfilerDataState::QmlProfilerDataState(QmlProfilerModelManager *modelManager, QObject *parent) @@ -163,6 +176,8 @@ public: QVector <double> partialCounts; QVector <int> partialCountWeights; + quint64 features; + int totalWeight; double progress; double previousProgress; @@ -251,6 +266,25 @@ void QmlProfilerModelManager::modelProxyCountUpdated(int proxyId, qint64 count, } } +void QmlProfilerModelManager::announceFeatures(int proxyId, quint64 features) +{ + Q_UNUSED(proxyId); // Will use that later to optimize the event dispatching on loading. + if ((features & d->features) != features) { + d->features |= features; + emit availableFeaturesChanged(d->features); + } +} + +quint64 QmlProfilerModelManager::availableFeatures() +{ + return d->features; +} + +const char *QmlProfilerModelManager::featureName(QmlDebug::ProfileFeature feature) +{ + return ProfileFeatureNames[feature]; +} + qint64 QmlProfilerModelManager::estimatedProfilingTime() const { return d->estimatedTime; diff --git a/src/plugins/qmlprofiler/qmlprofilermodelmanager.h b/src/plugins/qmlprofiler/qmlprofilermodelmanager.h index 2479eb037e388c29207c80d06a38f94c59a573f8..0dd6d583b807ff2214de4e69eb09854ea0d4c3c2 100644 --- a/src/plugins/qmlprofiler/qmlprofilermodelmanager.h +++ b/src/plugins/qmlprofiler/qmlprofilermodelmanager.h @@ -127,6 +127,9 @@ public: int registerModelProxy(); void setProxyCountWeight(int proxyId, int weight); void modelProxyCountUpdated(int proxyId, qint64 count, qint64 max); + void announceFeatures(int proxyId, quint64 features); + quint64 availableFeatures(); + static const char *featureName(QmlDebug::ProfileFeature feature); qint64 estimatedProfilingTime() const; @@ -137,6 +140,7 @@ signals: void dataAvailable(); void requestDetailsForLocation(int eventType, const QmlDebug::QmlEventLocation &location); + void availableFeaturesChanged(quint64 features); public slots: void clear(); diff --git a/src/plugins/qmlprofiler/qmlprofilerpainteventsmodelproxy.cpp b/src/plugins/qmlprofiler/qmlprofilerpainteventsmodelproxy.cpp index 884c066c9b25ac33e3cc75ee46ff8f1e3884e981..4a5453d998bd93b586a04825f79b2cbe29d8dd23 100644 --- a/src/plugins/qmlprofiler/qmlprofilerpainteventsmodelproxy.cpp +++ b/src/plugins/qmlprofiler/qmlprofilerpainteventsmodelproxy.cpp @@ -58,13 +58,18 @@ private: }; PaintEventsModelProxy::PaintEventsModelProxy(QObject *parent) - : AbstractTimelineModel(new PaintEventsModelProxyPrivate, tr("Animations"), QmlDebug::Event, - QmlDebug::MaximumRangeType, parent) + : AbstractTimelineModel(new PaintEventsModelProxyPrivate, + tr(QmlProfilerModelManager::featureName(QmlDebug::ProfileAnimations)), + QmlDebug::Event, QmlDebug::MaximumRangeType, parent) { Q_D(PaintEventsModelProxy); d->maxGuiThreadAnimations = d->maxRenderThreadAnimations = 0; } +quint64 PaintEventsModelProxy::features() const +{ + return 1 << QmlDebug::ProfileAnimations; +} void PaintEventsModelProxy::clear() { diff --git a/src/plugins/qmlprofiler/qmlprofilerpainteventsmodelproxy.h b/src/plugins/qmlprofiler/qmlprofilerpainteventsmodelproxy.h index ef9844b271d7738142fb34c5a35c377e34d004ab..bcdbfbbe81d3544087f6b41ee9343b5759b88efa 100644 --- a/src/plugins/qmlprofiler/qmlprofilerpainteventsmodelproxy.h +++ b/src/plugins/qmlprofiler/qmlprofilerpainteventsmodelproxy.h @@ -75,6 +75,7 @@ public: QVariantList labels() const; QVariantMap details(int index) const; + quint64 features() const; private slots: bool accepted(const QmlProfilerDataModel::QmlEventTypeData &event) const; diff --git a/src/plugins/qmlprofiler/qmlprofilerstatemanager.cpp b/src/plugins/qmlprofiler/qmlprofilerstatemanager.cpp index a272a7ac70180d5fd742c4577e8cda1e997a6573..188fbcff1970cf7df39b481fcd0eb0bcf5883359 100644 --- a/src/plugins/qmlprofiler/qmlprofilerstatemanager.cpp +++ b/src/plugins/qmlprofiler/qmlprofilerstatemanager.cpp @@ -64,6 +64,7 @@ public: QmlProfilerStateManager::QmlProfilerState m_currentState; bool m_clientRecording; bool m_serverRecording; + quint64 m_recordingFeatures; }; QmlProfilerStateManager::QmlProfilerStateManager(QObject *parent) : QObject(parent),d(new QmlProfilerStateManagerPrivate(this)) @@ -71,6 +72,7 @@ QmlProfilerStateManager::QmlProfilerStateManager(QObject *parent) : d->m_currentState = Idle; d->m_clientRecording = true; d->m_serverRecording = false; + d->m_recordingFeatures = 0; } QmlProfilerStateManager::~QmlProfilerStateManager() @@ -93,6 +95,11 @@ bool QmlProfilerStateManager::serverRecording() return d->m_serverRecording; } +quint64 QmlProfilerStateManager::recordingFeatures() const +{ + return d->m_recordingFeatures; +} + QString QmlProfilerStateManager::currentStateAsString() { return stringForState(d->m_currentState); @@ -173,5 +180,13 @@ void QmlProfilerStateManager::setServerRecording(bool recording) } } +void QmlProfilerStateManager::setRecordingFeatures(quint64 features) +{ + if (d->m_recordingFeatures != features) { + d->m_recordingFeatures = features; + emit recordingFeaturesChanged(features); + } +} + } } diff --git a/src/plugins/qmlprofiler/qmlprofilerstatemanager.h b/src/plugins/qmlprofiler/qmlprofilerstatemanager.h index ee46c765ac910055855c66d2f542ef2ef6039e49..6cf009a922348a91f24424e8e9a3b41ab41ae43f 100644 --- a/src/plugins/qmlprofiler/qmlprofilerstatemanager.h +++ b/src/plugins/qmlprofiler/qmlprofilerstatemanager.h @@ -56,6 +56,7 @@ public: QmlProfilerState currentState(); bool clientRecording(); bool serverRecording(); + quint64 recordingFeatures() const; QString currentStateAsString(); @@ -63,11 +64,13 @@ signals: void stateChanged(); void clientRecordingChanged(); void serverRecordingChanged(); + void recordingFeaturesChanged(quint64); public slots: void setCurrentState(QmlProfilerState newState); void setClientRecording(bool recording); void setServerRecording(bool recording); + void setRecordingFeatures(quint64 features); private: class QmlProfilerStateManagerPrivate; diff --git a/src/plugins/qmlprofiler/qmlprofilertimelinemodelproxy.cpp b/src/plugins/qmlprofiler/qmlprofilertimelinemodelproxy.cpp index 31996192c4fffce457c96401eb58a823c5164313..f460789aaf909199f65c101af74128b69d5cc72f 100644 --- a/src/plugins/qmlprofiler/qmlprofilertimelinemodelproxy.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertimelinemodelproxy.cpp @@ -44,6 +44,15 @@ namespace QmlProfiler { namespace Internal { +static const QmlDebug::ProfileFeature RangeFeatures[QmlDebug::MaximumRangeType] = { + QmlDebug::ProfilePainting, + QmlDebug::ProfileCompiling, + QmlDebug::ProfileCreating, + QmlDebug::ProfileBinding, + QmlDebug::ProfileHandlingSignal, + QmlDebug::ProfileJavaScript +}; + class RangeTimelineModel::RangeTimelineModelPrivate : public AbstractTimelineModelPrivate { public: @@ -70,6 +79,12 @@ RangeTimelineModel::RangeTimelineModel(QmlDebug::RangeType rangeType, QObject *p d->contractedRows = 1; } +quint64 RangeTimelineModel::features() const +{ + Q_D(const RangeTimelineModel); + return 1 << RangeFeatures[d->rangeType]; +} + void RangeTimelineModel::clear() { Q_D(RangeTimelineModel); @@ -222,16 +237,19 @@ int RangeTimelineModel::rowCount() const return d->contractedRows; } -QString RangeTimelineModel::categoryLabel(int categoryIndex) +QString RangeTimelineModel::categoryLabel(QmlDebug::RangeType rangeType) { - switch (categoryIndex) { - case 0: return QCoreApplication::translate("MainView", "Painting"); break; - case 1: return QCoreApplication::translate("MainView", "Compiling"); break; - case 2: return QCoreApplication::translate("MainView", "Creating"); break; - case 3: return QCoreApplication::translate("MainView", "Binding"); break; - case 4: return QCoreApplication::translate("MainView", "Handling Signal"); break; - case 5: return QCoreApplication::translate("MainView", "JavaScript"); break; - default: return QString(); + switch (rangeType) { + case QmlDebug::Painting: + case QmlDebug::Compiling: + case QmlDebug::Creating: + case QmlDebug::Binding: + case QmlDebug::HandlingSignal: + case QmlDebug::Javascript: + return QCoreApplication::translate("MainView", + QmlProfilerModelManager::featureName(RangeFeatures[rangeType])); + default: + return QString(); } } diff --git a/src/plugins/qmlprofiler/qmlprofilertimelinemodelproxy.h b/src/plugins/qmlprofiler/qmlprofilertimelinemodelproxy.h index ca49943e7a34b92c04c620f35ed996f3aa15962d..9c6f71a588985472f3a46320ac2d158e01fbf326 100644 --- a/src/plugins/qmlprofiler/qmlprofilertimelinemodelproxy.h +++ b/src/plugins/qmlprofiler/qmlprofilertimelinemodelproxy.h @@ -72,7 +72,8 @@ public: // QML interface int rowCount() const; - static QString categoryLabel(int categoryIndex); + static QString categoryLabel(QmlDebug::RangeType categoryIndex); + quint64 features() const; int row(int index) const; int eventId(int index) const; diff --git a/src/plugins/qmlprofiler/qmlprofilertool.cpp b/src/plugins/qmlprofiler/qmlprofilertool.cpp index 5af5ffc07d747c6aaddb76a02753857ab696552e..7d3d2cf7a2e16fbc66332d548bc5de457435edce 100644 --- a/src/plugins/qmlprofiler/qmlprofilertool.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertool.cpp @@ -81,11 +81,13 @@ using namespace Core; using namespace Core::Constants; using namespace Analyzer; using namespace Analyzer::Constants; -using namespace QmlProfiler::Internal; using namespace QmlProfiler::Constants; using namespace QmlDebug; using namespace ProjectExplorer; +namespace QmlProfiler { +namespace Internal { + class QmlProfilerTool::QmlProfilerToolPrivate { public: @@ -96,6 +98,8 @@ public: QmlProfilerViewManager *m_viewContainer; Utils::FileInProjectFinder m_projectFinder; QToolButton *m_recordButton; + QMenu *m_featuresMenu; + QToolButton *m_clearButton; // elapsed time display @@ -117,6 +121,10 @@ QmlProfilerTool::QmlProfilerTool(QObject *parent) d->m_profilerState = 0; d->m_viewContainer = 0; + d->m_recordButton = 0; + d->m_featuresMenu = 0; + d->m_clearButton = 0; + d->m_timeLabel = 0; qmlRegisterType<TimelineRenderer>("Monitor", 1, 0,"TimelineRenderer"); @@ -132,6 +140,8 @@ QmlProfilerTool::QmlProfilerTool(QObject *parent) d->m_profilerModelManager = new QmlProfilerModelManager(&d->m_projectFinder, this); connect(d->m_profilerModelManager, SIGNAL(stateChanged()), this, SLOT(profilerDataModelStateChanged())); connect(d->m_profilerModelManager, SIGNAL(error(QString)), this, SLOT(showErrorDialog(QString))); + connect(d->m_profilerModelManager, SIGNAL(availableFeaturesChanged(quint64)), + this, SLOT(setAvailableFeatures(quint64))); d->m_profilerConnections->setModelManager(d->m_profilerModelManager); Command *command = 0; @@ -247,6 +257,13 @@ QWidget *QmlProfilerTool::createWidgets() connect(d->m_recordButton,SIGNAL(clicked(bool)), this, SLOT(recordingButtonChanged(bool))); d->m_recordButton->setChecked(true); + d->m_featuresMenu = new QMenu(d->m_recordButton); + d->m_recordButton->setMenu(d->m_featuresMenu); + d->m_recordButton->setPopupMode(QToolButton::MenuButtonPopup); + setAvailableFeatures(d->m_profilerModelManager->availableFeatures()); + connect(d->m_featuresMenu, SIGNAL(triggered(QAction*)), + this, SLOT(toggleRecordingFeature(QAction*))); + setRecording(d->m_profilerState->clientRecording()); layout->addWidget(d->m_recordButton); @@ -326,6 +343,9 @@ void QmlProfilerTool::setRecording(bool recording) } else { d->m_recordingTimer.stop(); } + d->m_recordButton->menu()->setEnabled(!recording); + } else { + d->m_recordButton->menu()->setEnabled(true); } } @@ -508,6 +528,36 @@ void QmlProfilerTool::clientsDisconnected() // If the connection is closed while the app is still running, no special action is needed } +template<QmlDebug::ProfileFeature feature> +void QmlProfilerTool::updateFeaturesMenu(quint64 features) +{ + if (features & (1 << feature)) { + QAction *action = d->m_featuresMenu->addAction(tr(QmlProfilerModelManager::featureName( + static_cast<QmlDebug::ProfileFeature>(feature)))); + action->setCheckable(true); + action->setData(static_cast<uint>(feature)); + action->setChecked(d->m_profilerState->recordingFeatures() & (1 << feature)); + } + updateFeaturesMenu<static_cast<QmlDebug::ProfileFeature>(feature + 1)>(features); +} + +template<> +void QmlProfilerTool::updateFeaturesMenu<QmlDebug::MaximumProfileFeature>(quint64 features) +{ + Q_UNUSED(features); + return; +} + +void QmlProfilerTool::setAvailableFeatures(quint64 features) +{ + if (features != d->m_profilerState->recordingFeatures()) + d->m_profilerState->setRecordingFeatures(features); // by default, enable them all. + if (d->m_featuresMenu) { + d->m_featuresMenu->clear(); + updateFeaturesMenu<static_cast<QmlDebug::ProfileFeature>(0)>(features); + } +} + void QmlProfilerTool::profilerDataModelStateChanged() { switch (d->m_profilerModelManager->state()) { @@ -608,3 +658,20 @@ void QmlProfilerTool::serverRecordingChanged() d->m_clearButton->setEnabled(true); } } + +void QmlProfilerTool::toggleRecordingFeature(QAction *action) +{ + uint feature = action->data().toUInt(); + if (action->isChecked()) + d->m_profilerState->setRecordingFeatures( + d->m_profilerState->recordingFeatures() | (1 << feature)); + else + d->m_profilerState->setRecordingFeatures( + d->m_profilerState->recordingFeatures() & (~(1 << feature))); + + // Keep the menu open to allow for more features to be toggled + d->m_recordButton->showMenu(); +} + +} +} diff --git a/src/plugins/qmlprofiler/qmlprofilertool.h b/src/plugins/qmlprofiler/qmlprofilertool.h index 9c87a53054627fbda581c3a24f5d3ca4acd0a360..2ba237a47714a55f5645b32b90815bdcc1c2120e 100644 --- a/src/plugins/qmlprofiler/qmlprofilertool.h +++ b/src/plugins/qmlprofiler/qmlprofilertool.h @@ -32,6 +32,7 @@ #include <analyzerbase/ianalyzertool.h> #include <analyzerbase/analyzerruncontrol.h> +#include "qmldebug/qmlprofilereventtypes.h" QT_BEGIN_NAMESPACE class QMessageBox; @@ -68,6 +69,7 @@ public slots: void clientRecordingChanged(); void serverRecordingChanged(); void clientsDisconnected(); + void setAvailableFeatures(quint64 features); void recordingButtonChanged(bool recording); void setRecording(bool recording); @@ -84,9 +86,13 @@ private slots: void showSaveDialog(); void showLoadDialog(); + void toggleRecordingFeature(QAction *action); + private: void clearDisplay(); void populateFileFinder(QString projectDirectory = QString(), QString activeSysroot = QString()); + template<QmlDebug::ProfileFeature feature> + void updateFeaturesMenu(quint64 features); class QmlProfilerToolPrivate; QmlProfilerToolPrivate *d;