From 1bb19cc48e571c1442dd52ff088c4a88d83b4ed1 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Thu, 11 Aug 2016 13:44:40 +0200 Subject: [PATCH] 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 --- .../qmlprofiler/qmlprofilertraceview.cpp | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmlprofiler/qmlprofilertraceview.cpp b/src/plugins/qmlprofiler/qmlprofilertraceview.cpp index bf676a4968a..54e739636cd 100644 --- a/src/plugins/qmlprofiler/qmlprofilertraceview.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertraceview.cpp @@ -53,6 +53,7 @@ #include #include #include +#include #include #include @@ -80,6 +81,7 @@ public: QmlProfilerViewManager *m_viewContainer; QQuickWidget *m_mainView; QmlProfilerModelManager *m_modelManager; + QVariantList m_suspendedModels; Timeline::TimelineModelAggregator *m_modelProxy; Timeline::TimelineZoomControl *m_zoomControl; }; @@ -92,13 +94,28 @@ QmlProfilerTraceView::QmlProfilerTraceView(QWidget *parent, QmlProfilerViewManag d->m_zoomControl = new Timeline::TimelineZoomControl(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 end = modelManager->traceTime()->endTime(); d->m_zoomControl->setTrace(start, end); 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(); + // 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; } });