From fbe9925d8cc424a82987ac4ab98a66fbe320b09c Mon Sep 17 00:00:00 2001 From: Christiaan Janssen <christiaan.janssen@nokia.com> Date: Thu, 24 Mar 2011 12:42:15 +0100 Subject: [PATCH] QmlProfiler: ongoing work --- src/plugins/analyzerbase/analyzermanager.h | 4 +-- src/plugins/qmlprofiler/Elapsed.qml | 26 -------------- src/plugins/qmlprofiler/MainView.qml | 36 ++++++++++++------- src/plugins/qmlprofiler/qmlprofiler.qrc | 1 - src/plugins/qmlprofiler/qmlprofilerengine.cpp | 30 ++++++++++++---- src/plugins/qmlprofiler/qmlprofilerengine.h | 7 ++-- src/plugins/qmlprofiler/qmlprofilertool.cpp | 31 ++++++++++++++-- src/plugins/qmlprofiler/qmlprofilertool.h | 4 +++ src/plugins/qmlprofiler/tracewindow.cpp | 6 ++++ src/plugins/qmlprofiler/tracewindow.h | 2 ++ 10 files changed, 93 insertions(+), 54 deletions(-) delete mode 100644 src/plugins/qmlprofiler/Elapsed.qml diff --git a/src/plugins/analyzerbase/analyzermanager.h b/src/plugins/analyzerbase/analyzermanager.h index b069d49483b..8f9b8af2931 100644 --- a/src/plugins/analyzerbase/analyzermanager.h +++ b/src/plugins/analyzerbase/analyzermanager.h @@ -96,10 +96,10 @@ public: public slots: void showStatusMessage(const QString &message, int timeoutMS = 10000); void showPermanentStatusMessage(const QString &message); - -private slots: void startTool(); void stopTool(); + +private slots: void handleToolFinished(); void toolSelected(int); void toolSelected(QAction *); diff --git a/src/plugins/qmlprofiler/Elapsed.qml b/src/plugins/qmlprofiler/Elapsed.qml deleted file mode 100644 index 298782e120b..00000000000 --- a/src/plugins/qmlprofiler/Elapsed.qml +++ /dev/null @@ -1,26 +0,0 @@ -import QtQuick 1.1 -import Monitor 1.0 -import "MainView.js" as Plotter - -Text { - id: elapsed - color: "white" - - Timer { - property date startDate - property bool reset: true - running: connection.recording - repeat: true - onRunningChanged: if (running) reset = true - interval: 100 - triggeredOnStart: true - onTriggered: { - if (reset) { - startDate = new Date() - reset = false - } - var time = (new Date() - startDate)/1000 - elapsed.text = time.toFixed(1) + "s" - } - } -} diff --git a/src/plugins/qmlprofiler/MainView.qml b/src/plugins/qmlprofiler/MainView.qml index c8fb2620550..a4980b5a10e 100644 --- a/src/plugins/qmlprofiler/MainView.qml +++ b/src/plugins/qmlprofiler/MainView.qml @@ -60,6 +60,29 @@ Rectangle { } + // Elapsed + property real elapsedTime; + signal updateTimer; + Timer { + property date startDate + property bool reset: true + running: connection.recording + repeat: true + onRunningChanged: if (running) reset = true + interval: 100 + triggeredOnStart: true + onTriggered: { + if (reset) { + startDate = new Date() + reset = false + } + var time = (new Date() - startDate)/1000 + //elapsed.text = time.toFixed(1) + "s" + root.elapsedTime = time.toFixed(1); + root.updateTimer(); + } + } + //timeline background Item { anchors.fill: flick @@ -246,17 +269,4 @@ Rectangle { anchors.top: canvas.top } - Rectangle { - width: 50 - height: 30 - anchors.right: root.right - anchors.top: root.top - radius: 4 - color: "#606085" - Elapsed { - anchors.centerIn: parent - horizontalAlignment: Text.AlignHCenter - } - } - } diff --git a/src/plugins/qmlprofiler/qmlprofiler.qrc b/src/plugins/qmlprofiler/qmlprofiler.qrc index f2763e2f2de..217aab822b3 100644 --- a/src/plugins/qmlprofiler/qmlprofiler.qrc +++ b/src/plugins/qmlprofiler/qmlprofiler.qrc @@ -1,7 +1,6 @@ <RCC> <qresource prefix="/qml"> <file>Detail.qml</file> - <file>Elapsed.qml</file> <file>Label.qml</file> <file>lock.png</file> <file>MainView.js</file> diff --git a/src/plugins/qmlprofiler/qmlprofilerengine.cpp b/src/plugins/qmlprofiler/qmlprofilerengine.cpp index 283a1d1a1de..657ac872b76 100644 --- a/src/plugins/qmlprofiler/qmlprofilerengine.cpp +++ b/src/plugins/qmlprofiler/qmlprofilerengine.cpp @@ -3,6 +3,9 @@ #include "qmlprofilerplugin.h" #include "qmlprofilertool.h" +#include <analyzerbase/analyzermanager.h> +#include <analyzerbase/analyzerconstants.h> + #include <projectexplorer/applicationrunconfiguration.h> #include <private/qdeclarativedebugclient_p.h> @@ -83,16 +86,27 @@ void QmlProfilerEngine::stop() emit stopRecording(); } +void QmlProfilerEngine::spontaneousStop() +{ + AnalyzerManager::instance()->stopTool(); +} + void QmlProfilerEngine::viewUpdated() { - d->m_process->terminate(); - if (!d->m_process->waitForFinished(1000)) { - d->m_process->kill(); - d->m_process->waitForFinished(); + if (d->m_process) { + disconnect(d->m_process,SIGNAL(finished(int)),this,SLOT(spontaneousStop())); + if (d->m_process->state() == QProcess::Running) { + d->m_process->terminate(); + if (!d->m_process->waitForFinished(1000)) { + d->m_process->kill(); + d->m_process->waitForFinished(); + } + } + delete d->m_process; + d->m_process = 0; } emit processTerminated(); - delete d->m_process; } bool QmlProfilerEngine::QmlProfilerEnginePrivate::launchperfmonitor() @@ -113,16 +127,18 @@ bool QmlProfilerEngine::QmlProfilerEnginePrivate::launchperfmonitor() m_process->setProcessChannelMode(QProcess::ForwardedChannels); m_process->setWorkingDirectory(m_workingDirectory); + connect(m_process,SIGNAL(finished(int)),q,SLOT(spontaneousStop())); m_process->start(m_executable, arguments); + // give the process time to start + sleep(1); + if (!m_process->waitForStarted()) { if (QmlProfilerPlugin::debugOutput) qWarning("QmlProfiler: %s failed to start", qPrintable(m_executable)); return false; } - sleep(1); - if (QmlProfilerPlugin::debugOutput) qWarning("QmlProfiler: Connecting to %s:%d", qPrintable(QmlProfilerTool::host), QmlProfilerTool::port); diff --git a/src/plugins/qmlprofiler/qmlprofilerengine.h b/src/plugins/qmlprofiler/qmlprofilerengine.h index a3c5292b742..cc3449cb050 100644 --- a/src/plugins/qmlprofiler/qmlprofilerengine.h +++ b/src/plugins/qmlprofiler/qmlprofilerengine.h @@ -14,15 +14,16 @@ public: explicit QmlProfilerEngine(ProjectExplorer::RunConfiguration *runConfiguration); ~QmlProfilerEngine(); - void start(); - void stop(); - signals: void processRunning(); void processTerminated(); void stopRecording(); public slots: + void start(); + void stop(); + void spontaneousStop(); + void viewUpdated(); private: diff --git a/src/plugins/qmlprofiler/qmlprofilertool.cpp b/src/plugins/qmlprofiler/qmlprofilertool.cpp index 37aae4c9280..9e3d2553bb9 100644 --- a/src/plugins/qmlprofiler/qmlprofilertool.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertool.cpp @@ -25,12 +25,15 @@ #include <QtCore/QFile> +#include <QtGui/QHBoxLayout> +#include <QtGui/QLabel> + using namespace Analyzer; using namespace Analyzer::Internal; QString QmlProfilerTool::host = QLatin1String("localhost"); -quint16 QmlProfilerTool::port = 33455; +quint16 QmlProfilerTool::port = 33456; // Adapter for output pane. @@ -112,6 +115,7 @@ IAnalyzerEngine *QmlProfilerTool::createEngine(ProjectExplorer::RunConfiguration connect(engine, SIGNAL(stopRecording()), this, SLOT(stopRecording())); connect(d->m_traceWindow, SIGNAL(viewUpdated()), engine, SLOT(viewUpdated())); connect(d->m_traceWindow, SIGNAL(gotoSourceLocation(QString,int)), this, SLOT(gotoSourceLocation(QString,int))); + connect(d->m_traceWindow, SIGNAL(timeChanged(qreal)), this, SLOT(updateTimer(qreal))); return engine; @@ -142,7 +146,23 @@ IAnalyzerOutputPaneAdapter *QmlProfilerTool::outputPaneAdapter() QWidget *QmlProfilerTool::createToolBarWidget() { // custom toolbar (TODO) - return 0; + QWidget *toolbarWidget = new QWidget; + toolbarWidget->setObjectName(QLatin1String("QmlProfilerToolBarWidget")); + + QHBoxLayout *layout = new QHBoxLayout; + layout->setMargin(0); + layout->setSpacing(0); + + QLabel *timeLabel = new QLabel(tr("elapsed: 0 s")); + QPalette palette = timeLabel->palette(); + palette.setColor(QPalette::WindowText, Qt::white); + timeLabel->setPalette(palette); + + connect(this,SIGNAL(setTimeLabel(QString)),timeLabel,SLOT(setText(QString))); + layout->addWidget(timeLabel); + toolbarWidget->setLayout(layout); + + return toolbarWidget; } QWidget *QmlProfilerTool::createTimeLineWidget() @@ -203,3 +223,10 @@ void QmlProfilerTool::gotoSourceLocation(const QString &fileName, int lineNumber textEditor->widget()->setFocus(); } } + +void QmlProfilerTool::updateTimer(qreal elapsedSeconds) +{ + QString timeString = QString::number(elapsedSeconds,'f',1); + timeString = QString(" ").left(6-timeString.length()) + timeString; + emit setTimeLabel(tr("elapsed: ")+timeString+QLatin1String(" s")); +} diff --git a/src/plugins/qmlprofiler/qmlprofilertool.h b/src/plugins/qmlprofiler/qmlprofilertool.h index 00439a995db..19c3a7ce337 100644 --- a/src/plugins/qmlprofiler/qmlprofilertool.h +++ b/src/plugins/qmlprofiler/qmlprofilertool.h @@ -33,6 +33,10 @@ public slots: void stopRecording(); void gotoSourceLocation(const QString &fileName, int lineNumber); + void updateTimer(qreal elapsedSeconds); + +signals: + void setTimeLabel(const QString &); public: // Todo: configurable parameters diff --git a/src/plugins/qmlprofiler/tracewindow.cpp b/src/plugins/qmlprofiler/tracewindow.cpp index 94362327b1b..aa245fd1f32 100644 --- a/src/plugins/qmlprofiler/tracewindow.cpp +++ b/src/plugins/qmlprofiler/tracewindow.cpp @@ -288,6 +288,7 @@ void TraceWindow::reset(QDeclarativeDebugConnection *conn) m_view->setSource(QUrl("qrc:/qml/MainView.qml")); connect(m_view->rootObject(), SIGNAL(updateCursorPosition()), this, SLOT(updateCursorPosition())); + connect(m_view->rootObject(), SIGNAL(updateTimer()), this, SLOT(updateTimer())); } void TraceWindow::updateCursorPosition() @@ -296,6 +297,11 @@ void TraceWindow::updateCursorPosition() m_view->rootObject()->property("lineNumber").toInt()); } +void TraceWindow::updateTimer() +{ + emit timeChanged(m_view->rootObject()->property("elapsedTime").toDouble()); +} + void TraceWindow::setRecordAtStart(bool record) { m_recordAtStart = record; diff --git a/src/plugins/qmlprofiler/tracewindow.h b/src/plugins/qmlprofiler/tracewindow.h index 558b2bef87e..03d3cc37547 100644 --- a/src/plugins/qmlprofiler/tracewindow.h +++ b/src/plugins/qmlprofiler/tracewindow.h @@ -60,10 +60,12 @@ public: public slots: void updateCursorPosition(); + void updateTimer(); signals: void viewUpdated(); void gotoSourceLocation(const QString &fileName, int lineNumber); + void timeChanged(qreal newTime); private: TracePlugin *m_plugin; -- GitLab