QmlProfiler: Suspend timelinemodels while editing them

The models are in an inconsistent state while we're processing data.
The items may have out of range row numbers, we don't get a
contentChanged() signal for each item added, the labels may not be
in place, yet, etc. We don't want the models to be accessed during
that time.

Change-Id: Ibe81e0943de78d5bb45d46d005e847ec2d4ae66d
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
Ulf Hermann
2016-08-11 13:44:40 +02:00
parent 824f5f443a
commit 1bb19cc48e

View File

@@ -53,6 +53,7 @@
#include <debugger/analyzer/analyzermanager.h> #include <debugger/analyzer/analyzermanager.h>
#include <coreplugin/findplaceholder.h> #include <coreplugin/findplaceholder.h>
#include <utils/styledbar.h> #include <utils/styledbar.h>
#include <utils/algorithm.h>
#include <QQmlContext> #include <QQmlContext>
#include <QToolButton> #include <QToolButton>
@@ -80,6 +81,7 @@ public:
QmlProfilerViewManager *m_viewContainer; QmlProfilerViewManager *m_viewContainer;
QQuickWidget *m_mainView; QQuickWidget *m_mainView;
QmlProfilerModelManager *m_modelManager; QmlProfilerModelManager *m_modelManager;
QVariantList m_suspendedModels;
Timeline::TimelineModelAggregator *m_modelProxy; Timeline::TimelineModelAggregator *m_modelProxy;
Timeline::TimelineZoomControl *m_zoomControl; Timeline::TimelineZoomControl *m_zoomControl;
}; };
@@ -92,13 +94,28 @@ QmlProfilerTraceView::QmlProfilerTraceView(QWidget *parent, QmlProfilerViewManag
d->m_zoomControl = new Timeline::TimelineZoomControl(this); d->m_zoomControl = new Timeline::TimelineZoomControl(this);
connect(modelManager, &QmlProfilerModelManager::stateChanged, this, [modelManager, this]() { connect(modelManager, &QmlProfilerModelManager::stateChanged, this, [modelManager, this]() {
if (modelManager->state() == QmlProfilerModelManager::Done) { switch (modelManager->state()) {
case QmlProfilerModelManager::Done: {
qint64 start = modelManager->traceTime()->startTime(); qint64 start = modelManager->traceTime()->startTime();
qint64 end = modelManager->traceTime()->endTime(); qint64 end = modelManager->traceTime()->endTime();
d->m_zoomControl->setTrace(start, end); d->m_zoomControl->setTrace(start, end);
d->m_zoomControl->setRange(start, start + (end - start) / 10); d->m_zoomControl->setRange(start, start + (end - start) / 10);
} else if (modelManager->state() == QmlProfilerModelManager::ClearingData) { // Fall through
}
case QmlProfilerModelManager::Empty:
d->m_modelProxy->setModels(d->m_suspendedModels);
d->m_suspendedModels.clear();
break;
case QmlProfilerModelManager::ProcessingData:
break;
case QmlProfilerModelManager::ClearingData:
d->m_zoomControl->clear(); d->m_zoomControl->clear();
// Fall through
case QmlProfilerModelManager::AcquiringData:
// Temporarily remove the models, while we're changing them
d->m_suspendedModels = d->m_modelProxy->models();
d->m_modelProxy->setModels(QVariantList());
break;
} }
}); });