30
30
#include "qmlprofilertraceview.h"
31
31
#include "qmlprofilertool.h"
32
32
#include "qmlprofilerstatemanager.h"
33
#include "qmlprofilerdatamodel.h"
33
#include "qmlprofilermodelmanager.h"
34
#include "qmlprofilertimelinemodelproxy.h"
35
#include "timelinemodelaggregator.h"
35
37
// Needed for the load&save actions in the context menu
36
38
#include <analyzerbase/ianalyzertool.h>
38
// Comunication with the other views (limit events to range)
40
// Communication with the other views (limit events to range)
39
41
#include "qmlprofilerviewmanager.h"
41
43
#include <utils/styledbar.h>
43
#include <QDeclarativeContext>
45
#include <QQmlContext>
44
46
#include <QToolButton>
46
48
#include <QVBoxLayout>
86
89
/////////////////////////////////////////////////////////
87
ScrollableDeclarativeView::ScrollableDeclarativeView(QWidget *parent)
88
: QDeclarativeView(parent)
92
ScrollableDeclarativeView::~ScrollableDeclarativeView()
96
void ScrollableDeclarativeView::scrollContentsBy(int dx, int dy)
90
ScrollableQuickView::ScrollableQuickView(QQuickView *parent)
95
ScrollableQuickView::~ScrollableQuickView()
99
void ScrollableQuickView::scrollContentsBy(int /*dx*/, int dy)
98
101
// special workaround to track the scrollbar
99
102
if (rootObject()) {
100
103
int scrollY = rootObject()->property("scrollY").toInt();
101
104
rootObject()->setProperty("scrollY", QVariant(scrollY - dy));
103
QDeclarativeView::scrollContentsBy(dx,dy);
106
108
/////////////////////////////////////////////////////////
141
152
groupLayout->setContentsMargins(0, 0, 0, 0);
142
153
groupLayout->setSpacing(0);
144
d->m_mainView = new ScrollableDeclarativeView(this);
145
d->m_mainView->setResizeMode(QDeclarativeView::SizeViewToRootObject);
146
d->m_mainView->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
147
d->m_mainView->setBackgroundBrush(QBrush(Qt::white));
148
d->m_mainView->setAlignment(Qt::AlignLeft | Qt::AlignTop);
149
d->m_mainView->setFocus();
155
d->m_mainView = new ScrollableQuickView();
156
d->m_mainView->setResizeMode(QQuickView::SizeViewToRootObject);
157
QWidget *mainViewContainer = QWidget::createWindowContainer(d->m_mainView);
151
159
MouseWheelResizer *resizer = new MouseWheelResizer(this);
152
160
connect(resizer,SIGNAL(mouseWheelMoved(int,int,int)), this, SLOT(mouseWheelMoved(int,int,int)));
153
d->m_mainView->viewport()->installEventFilter(resizer);
155
162
QHBoxLayout *toolsLayout = new QHBoxLayout;
157
d->m_timebar = new QDeclarativeView(this);
158
d->m_timebar->setResizeMode(QDeclarativeView::SizeRootObjectToView);
159
d->m_timebar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
160
d->m_timebar->setFixedHeight(24);
164
d->m_timebar = new QQuickView();
165
d->m_timebar->setResizeMode(QQuickView::SizeRootObjectToView);
166
QWidget *timeBarContainer = QWidget::createWindowContainer(d->m_timebar);
167
timeBarContainer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
168
timeBarContainer->setFixedHeight(24);
162
d->m_overview = new QDeclarativeView(this);
163
d->m_overview->setResizeMode(QDeclarativeView::SizeRootObjectToView);
164
d->m_overview->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
165
d->m_overview->setMaximumHeight(50);
170
d->m_overview = new QQuickView();
171
d->m_overview->setResizeMode(QQuickView::SizeRootObjectToView);
172
QWidget *overviewContainer = QWidget::createWindowContainer(d->m_overview);
173
overviewContainer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
174
overviewContainer->setMaximumHeight(50);
167
176
d->m_zoomToolbar = createZoomToolbar();
168
177
d->m_zoomToolbar->move(0, d->m_timebar->height());
169
178
d->m_zoomToolbar->setVisible(false);
171
180
toolsLayout->addWidget(createToolbar());
172
toolsLayout->addWidget(d->m_timebar);
181
toolsLayout->addWidget(timeBarContainer);
173
182
emit enableToolbar(false);
175
184
groupLayout->addLayout(toolsLayout);
176
groupLayout->addWidget(d->m_mainView);
177
groupLayout->addWidget(d->m_overview);
185
groupLayout->addWidget(mainViewContainer);
186
groupLayout->addWidget(overviewContainer);
179
188
setLayout(groupLayout);
181
190
d->m_profilerTool = profilerTool;
182
191
d->m_viewContainer = container;
183
d->m_profilerDataModel = model;
184
connect(d->m_profilerDataModel, SIGNAL(stateChanged()),
192
d->m_modelManager = modelManager;
193
d->m_modelProxy = new TimelineModelAggregator(this);
194
d->m_modelProxy->setModelManager(modelManager);
195
connect(d->m_modelManager, SIGNAL(stateChanged()),
185
196
this, SLOT(profilerDataModelStateChanged()));
186
d->m_mainView->rootContext()->setContextProperty(QLatin1String("qmlProfilerDataModel"),
187
d->m_profilerDataModel);
188
d->m_overview->rootContext()->setContextProperty(QLatin1String("qmlProfilerDataModel"),
189
d->m_profilerDataModel);
197
d->m_mainView->rootContext()->setContextProperty(QLatin1String("qmlProfilerModelProxy"),
199
d->m_overview->rootContext()->setContextProperty(QLatin1String("qmlProfilerModelProxy"),
191
202
d->m_profilerState = profilerState;
192
203
connect(d->m_profilerState, SIGNAL(stateChanged()),
372
383
QMetaObject::invokeMethod(d->m_overview->rootObject(), "clearDisplay");
375
void QmlProfilerTraceView::selectNextEventWithId(int eventId)
386
void QmlProfilerTraceView::selectNextEventByHash(const QString &hash)
377
QGraphicsObject *rootObject = d->m_mainView->rootObject();
388
QQuickItem *rootObject = d->m_mainView->rootObject();
379
QMetaObject::invokeMethod(rootObject, "selectNextWithId",
380
Q_ARG(QVariant,QVariant(eventId)));
391
QMetaObject::invokeMethod(rootObject, "selectNextByHash",
392
Q_ARG(QVariant,QVariant(hash)));
395
void QmlProfilerTraceView::selectNextEventByLocation(const QString &filename, const int line, const int column)
397
int eventId = d->m_modelProxy->getEventIdForLocation(filename, line, column);
400
QQuickItem *rootObject = d->m_mainView->rootObject();
402
QMetaObject::invokeMethod(rootObject, "selectNextById",
403
Q_ARG(QVariant,QVariant(eventId)));
383
407
/////////////////////////////////////////////////////////
384
408
// Goto source location
385
409
void QmlProfilerTraceView::updateCursorPosition()
387
QGraphicsObject *rootObject = d->m_mainView->rootObject();
411
QQuickItem *rootObject = d->m_mainView->rootObject();
388
412
emit gotoSourceLocation(rootObject->property("fileName").toString(),
389
413
rootObject->property("lineNumber").toInt(),
390
414
rootObject->property("columnNumber").toInt());
445
469
void QmlProfilerTraceView::updateRange()
447
if (!d->m_profilerDataModel)
471
if (!d->m_modelManager)
449
473
qreal duration = d->m_zoomControl->endTime() - d->m_zoomControl->startTime();
450
474
if (duration <= 0)
452
if (d->m_profilerDataModel->traceDuration() <= 0)
476
if (d->m_modelManager->traceTime()->duration() <= 0)
454
int newLevel = pow(duration / d->m_profilerDataModel->traceDuration(), 1/sliderExp) * sliderTicks;
478
int newLevel = pow(duration / d->m_modelManager->traceTime()->duration(), 1/sliderExp) * sliderTicks;
455
479
if (d->m_currentZoomLevel != newLevel) {
456
480
d->m_currentZoomLevel = newLevel;
457
481
emit zoomLevelChanged(newLevel);
558
579
// Profiler State
559
580
void QmlProfilerTraceView::profilerDataModelStateChanged()
561
switch (d->m_profilerDataModel->currentState()) {
562
case QmlProfilerDataModel::Empty :
563
emit enableToolbar(false);
565
case QmlProfilerDataModel::AcquiringData :
566
// nothing to be done
568
case QmlProfilerDataModel::ProcessingData :
569
// nothing to be done
571
case QmlProfilerDataModel::Done :
572
emit enableToolbar(true);
582
switch (d->m_modelManager->state()) {
583
case QmlProfilerDataState::Empty:
584
emit enableToolbar(false);
586
case QmlProfilerDataState::AcquiringData: break;
587
case QmlProfilerDataState::ProcessingData: break;
588
case QmlProfilerDataState::Done:
589
emit enableToolbar(true);