~bzoltan/kubuntu-packaging/decouple_cmake_plugin

« back to all changes in this revision

Viewing changes to src/plugins/qmlprofiler/qmlprofilertraceview.cpp

  • Committer: Timo Jyrinki
  • Date: 2013-11-15 12:25:23 UTC
  • mfrom: (1.1.28)
  • Revision ID: timo.jyrinki@canonical.com-20131115122523-i2kyamsu4gs2mu1m
New upstream release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
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"
34
36
 
35
37
// Needed for the load&save actions in the context menu
36
38
#include <analyzerbase/ianalyzertool.h>
37
39
 
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"
40
42
 
41
43
#include <utils/styledbar.h>
42
44
 
43
 
#include <QDeclarativeContext>
 
45
#include <QQmlContext>
44
46
#include <QToolButton>
45
47
#include <QEvent>
46
48
#include <QVBoxLayout>
48
50
#include <QScrollBar>
49
51
#include <QSlider>
50
52
#include <QMenu>
 
53
#include <QQuickItem>
51
54
 
52
55
#include <math.h>
53
56
 
84
87
}
85
88
 
86
89
/////////////////////////////////////////////////////////
87
 
ScrollableDeclarativeView::ScrollableDeclarativeView(QWidget *parent)
88
 
    : QDeclarativeView(parent)
89
 
{
90
 
}
91
 
 
92
 
ScrollableDeclarativeView::~ScrollableDeclarativeView()
93
 
{
94
 
}
95
 
 
96
 
void ScrollableDeclarativeView::scrollContentsBy(int dx, int dy)
 
90
ScrollableQuickView::ScrollableQuickView(QQuickView *parent)
 
91
    : QQuickView(parent)
 
92
{
 
93
}
 
94
 
 
95
ScrollableQuickView::~ScrollableQuickView()
 
96
{
 
97
}
 
98
 
 
99
void ScrollableQuickView::scrollContentsBy(int /*dx*/, int dy)
97
100
{
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));
102
105
    }
103
 
    QDeclarativeView::scrollContentsBy(dx,dy);
104
106
}
105
107
 
106
108
/////////////////////////////////////////////////////////
108
110
{
109
111
public:
110
112
    QmlProfilerTraceViewPrivate(QmlProfilerTraceView *qq) : q(qq) {}
 
113
    ~QmlProfilerTraceViewPrivate()
 
114
    {
 
115
        delete m_mainView;
 
116
        delete m_timebar;
 
117
        delete m_overview;
 
118
    }
 
119
 
111
120
    QmlProfilerTraceView *q;
112
121
 
113
122
    QmlProfilerStateManager *m_profilerState;
116
125
 
117
126
    QSize m_sizeHint;
118
127
 
119
 
    ScrollableDeclarativeView *m_mainView;
120
 
    QDeclarativeView *m_timebar;
121
 
    QDeclarativeView *m_overview;
122
 
    QmlProfilerDataModel *m_profilerDataModel;
 
128
    ScrollableQuickView *m_mainView;
 
129
    QQuickView *m_timebar;
 
130
    QQuickView *m_overview;
 
131
    QmlProfilerModelManager *m_modelManager;
 
132
    TimelineModelAggregator *m_modelProxy;
 
133
 
123
134
 
124
135
    ZoomControl *m_zoomControl;
125
136
 
129
140
    int m_currentZoomLevel;
130
141
};
131
142
 
132
 
QmlProfilerTraceView::QmlProfilerTraceView(QWidget *parent, Analyzer::IAnalyzerTool *profilerTool, QmlProfilerViewManager *container, QmlProfilerDataModel *model, QmlProfilerStateManager *profilerState)
 
143
QmlProfilerTraceView::QmlProfilerTraceView(QWidget *parent, Analyzer::IAnalyzerTool *profilerTool, QmlProfilerViewManager *container, QmlProfilerModelManager *modelManager, QmlProfilerStateManager *profilerState)
133
144
    : QWidget(parent), d(new QmlProfilerTraceViewPrivate(this))
134
145
{
135
146
    setObjectName(QLatin1String("QML Profiler"));
141
152
    groupLayout->setContentsMargins(0, 0, 0, 0);
142
153
    groupLayout->setSpacing(0);
143
154
 
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);
150
158
 
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);
154
161
 
155
162
    QHBoxLayout *toolsLayout = new QHBoxLayout;
156
163
 
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);
161
169
 
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);
166
175
 
167
176
    d->m_zoomToolbar = createZoomToolbar();
168
177
    d->m_zoomToolbar->move(0, d->m_timebar->height());
169
178
    d->m_zoomToolbar->setVisible(false);
170
179
 
171
180
    toolsLayout->addWidget(createToolbar());
172
 
    toolsLayout->addWidget(d->m_timebar);
 
181
    toolsLayout->addWidget(timeBarContainer);
173
182
    emit enableToolbar(false);
174
183
 
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);
178
187
 
179
188
    setLayout(groupLayout);
180
189
 
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"),
 
198
                                                     d->m_modelProxy);
 
199
    d->m_overview->rootContext()->setContextProperty(QLatin1String("qmlProfilerModelProxy"),
 
200
                                                     d->m_modelProxy);
190
201
 
191
202
    d->m_profilerState = profilerState;
192
203
    connect(d->m_profilerState, SIGNAL(stateChanged()),
218
229
    d->m_overview->setSource(QUrl(QLatin1String("qrc:/qmlprofiler/Overview.qml")));
219
230
 
220
231
    d->m_mainView->setSource(QUrl(QLatin1String("qrc:/qmlprofiler/MainView.qml")));
221
 
    QGraphicsObject *rootObject = d->m_mainView->rootObject();
 
232
    QQuickItem *rootObject = d->m_mainView->rootObject();
222
233
    rootObject->setProperty("width", QVariant(width()));
223
234
    rootObject->setProperty("candidateHeight", QVariant(height() - d->m_timebar->height() - d->m_overview->height()));
224
235
 
339
350
/////////////////////////////////////////////////////////
340
351
bool QmlProfilerTraceView::hasValidSelection() const
341
352
{
342
 
    QGraphicsObject *rootObject = d->m_mainView->rootObject();
 
353
    QQuickItem *rootObject = d->m_mainView->rootObject();
343
354
    if (rootObject)
344
355
        return rootObject->property("selectionRangeReady").toBool();
345
356
    return false;
347
358
 
348
359
qint64 QmlProfilerTraceView::selectionStart() const
349
360
{
350
 
    QGraphicsObject *rootObject = d->m_mainView->rootObject();
 
361
    QQuickItem *rootObject = d->m_mainView->rootObject();
351
362
    if (rootObject)
352
363
        return rootObject->property("selectionRangeStart").toLongLong();
353
364
    return 0;
355
366
 
356
367
qint64 QmlProfilerTraceView::selectionEnd() const
357
368
{
358
 
    QGraphicsObject *rootObject = d->m_mainView->rootObject();
 
369
    QQuickItem *rootObject = d->m_mainView->rootObject();
359
370
    if (rootObject)
360
371
        return rootObject->property("selectionRangeEnd").toLongLong();
361
372
    return 0;
372
383
    QMetaObject::invokeMethod(d->m_overview->rootObject(), "clearDisplay");
373
384
}
374
385
 
375
 
void QmlProfilerTraceView::selectNextEventWithId(int eventId)
 
386
void QmlProfilerTraceView::selectNextEventByHash(const QString &hash)
376
387
{
377
 
    QGraphicsObject *rootObject = d->m_mainView->rootObject();
 
388
    QQuickItem *rootObject = d->m_mainView->rootObject();
 
389
 
378
390
    if (rootObject)
379
 
        QMetaObject::invokeMethod(rootObject, "selectNextWithId",
380
 
                                  Q_ARG(QVariant,QVariant(eventId)));
 
391
        QMetaObject::invokeMethod(rootObject, "selectNextByHash",
 
392
                                  Q_ARG(QVariant,QVariant(hash)));
 
393
}
 
394
 
 
395
void QmlProfilerTraceView::selectNextEventByLocation(const QString &filename, const int line, const int column)
 
396
{
 
397
    int eventId = d->m_modelProxy->getEventIdForLocation(filename, line, column);
 
398
 
 
399
    if (eventId != -1) {
 
400
        QQuickItem *rootObject = d->m_mainView->rootObject();
 
401
        if (rootObject)
 
402
            QMetaObject::invokeMethod(rootObject, "selectNextById",
 
403
                                      Q_ARG(QVariant,QVariant(eventId)));
 
404
    }
381
405
}
382
406
 
383
407
/////////////////////////////////////////////////////////
384
408
// Goto source location
385
409
void QmlProfilerTraceView::updateCursorPosition()
386
410
{
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());
394
418
// Toolbar buttons
395
419
void QmlProfilerTraceView::toggleRangeMode(bool active)
396
420
{
397
 
    QGraphicsObject *rootObject = d->m_mainView->rootObject();
 
421
    QQuickItem *rootObject = d->m_mainView->rootObject();
398
422
    bool rangeMode = rootObject->property("selectionRangeMode").toBool();
399
423
    if (active != rangeMode) {
400
424
        if (active)
417
441
 
418
442
void QmlProfilerTraceView::toggleLockMode(bool active)
419
443
{
420
 
    QGraphicsObject *rootObject = d->m_mainView->rootObject();
 
444
    QQuickItem *rootObject = d->m_mainView->rootObject();
421
445
    bool lockMode = !rootObject->property("selectionLocked").toBool();
422
446
    if (active != lockMode) {
423
447
        rootObject->setProperty("selectionLocked", QVariant(!active));
444
468
 
445
469
void QmlProfilerTraceView::updateRange()
446
470
{
447
 
    if (!d->m_profilerDataModel)
 
471
    if (!d->m_modelManager)
448
472
        return;
449
473
    qreal duration = d->m_zoomControl->endTime() - d->m_zoomControl->startTime();
450
474
    if (duration <= 0)
451
475
        return;
452
 
    if (d->m_profilerDataModel->traceDuration() <= 0)
 
476
    if (d->m_modelManager->traceTime()->duration() <= 0)
453
477
        return;
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);
461
485
void QmlProfilerTraceView::mouseWheelMoved(int mouseX, int mouseY, int wheelDelta)
462
486
{
463
487
    Q_UNUSED(mouseY);
464
 
    QGraphicsObject *rootObject = d->m_mainView->rootObject();
 
488
    QQuickItem *rootObject = d->m_mainView->rootObject();
465
489
    if (rootObject) {
466
490
        QMetaObject::invokeMethod(rootObject, "wheelZoom",
467
491
                                  Q_ARG(QVariant, QVariant(mouseX)),
474
498
    setToolTip(text);
475
499
}
476
500
 
477
 
void QmlProfilerTraceView::updateVerticalScroll(int newPosition)
 
501
void QmlProfilerTraceView::updateVerticalScroll(int /*newPosition*/)
478
502
{
479
 
    d->m_mainView->verticalScrollBar()->setValue(newPosition);
480
503
}
481
504
 
482
505
void QmlProfilerTraceView::resizeEvent(QResizeEvent *event)
483
506
{
484
507
    QWidget::resizeEvent(event);
485
 
    QGraphicsObject *rootObject = d->m_mainView->rootObject();
 
508
    QQuickItem *rootObject = d->m_mainView->rootObject();
486
509
    if (rootObject) {
487
510
        rootObject->setProperty("width", QVariant(event->size().width()));
488
511
        int newHeight = event->size().height() - d->m_timebar->height() - d->m_overview->height();
513
536
    if (d->m_viewContainer->hasGlobalStats())
514
537
        getGlobalStatsAction->setEnabled(false);
515
538
 
516
 
    if (d->m_profilerDataModel->count() > 0) {
 
539
    if (!d->m_modelProxy->isEmpty()) {
517
540
        menu.addSeparator();
518
541
        viewAllAction = menu.addAction(tr("Reset Zoom"));
519
542
    }
523
546
    if (selectedAction) {
524
547
        if (selectedAction == viewAllAction) {
525
548
            d->m_zoomControl->setRange(
526
 
                        d->m_profilerDataModel->traceStartTime(),
527
 
                        d->m_profilerDataModel->traceEndTime());
 
549
                        d->m_modelManager->traceTime()->startTime(),
 
550
                        d->m_modelManager->traceTime()->endTime());
528
551
        }
529
552
        if (selectedAction == getLocalStatsAction) {
530
553
            d->m_viewContainer->getStatisticsInRange(
532
555
                        d->m_viewContainer->selectionEnd());
533
556
        }
534
557
        if (selectedAction == getGlobalStatsAction) {
535
 
            d->m_viewContainer->getStatisticsInRange(
536
 
                        d->m_profilerDataModel->traceStartTime(),
537
 
                        d->m_profilerDataModel->traceEndTime());
 
558
            d->m_viewContainer->getStatisticsInRange(-1, -1);
538
559
        }
539
560
    }
540
561
}
543
564
// Tell QML the state of the profiler
544
565
void QmlProfilerTraceView::setRecording(bool recording)
545
566
{
546
 
    QGraphicsObject *rootObject = d->m_mainView->rootObject();
 
567
    QQuickItem *rootObject = d->m_mainView->rootObject();
547
568
    if (rootObject)
548
569
        rootObject->setProperty("recordingEnabled", QVariant(recording));
549
570
}
550
571
 
551
572
void QmlProfilerTraceView::setAppKilled()
552
573
{
553
 
    QGraphicsObject *rootObject = d->m_mainView->rootObject();
 
574
    QQuickItem *rootObject = d->m_mainView->rootObject();
554
575
    if (rootObject)
555
576
        rootObject->setProperty("appKilled",QVariant(true));
556
577
}
558
579
// Profiler State
559
580
void QmlProfilerTraceView::profilerDataModelStateChanged()
560
581
{
561
 
    switch (d->m_profilerDataModel->currentState()) {
562
 
    case QmlProfilerDataModel::Empty :
563
 
        emit enableToolbar(false);
564
 
        break;
565
 
    case QmlProfilerDataModel::AcquiringData :
566
 
        // nothing to be done
567
 
        break;
568
 
    case QmlProfilerDataModel::ProcessingData :
569
 
        // nothing to be done
570
 
        break;
571
 
    case QmlProfilerDataModel::Done :
572
 
        emit enableToolbar(true);
573
 
    break;
 
582
    switch (d->m_modelManager->state()) {
 
583
        case QmlProfilerDataState::Empty:
 
584
            emit enableToolbar(false);
 
585
        break;
 
586
        case QmlProfilerDataState::AcquiringData: break;
 
587
        case QmlProfilerDataState::ProcessingData: break;
 
588
        case QmlProfilerDataState::Done:
 
589
            emit enableToolbar(true);
 
590
        break;
574
591
    default:
575
592
        break;
576
593
    }
580
597
{
581
598
    switch (d->m_profilerState->currentState()) {
582
599
    case QmlProfilerStateManager::AppKilled : {
583
 
        if (d->m_profilerDataModel->currentState() == QmlProfilerDataModel::AcquiringData)
 
600
        if (d->m_modelManager->state() == QmlProfilerDataState::AcquiringData)
584
601
            setAppKilled();
585
602
        break;
586
603
    }