diff options
author | Ulf Hermann <[email protected]> | 2016-08-11 13:44:40 +0200 |
---|---|---|
committer | Ulf Hermann <[email protected]> | 2016-11-23 16:13:03 +0000 |
commit | 1bb19cc48e571c1442dd52ff088c4a88d83b4ed1 (patch) | |
tree | f9ac1c5202c0d7562214d6cb1e9826624c65fd0d /src/plugins/qmlprofiler/qmlprofilertraceview.cpp | |
parent | 824f5f443a0b56cb675250ede0706e10e7ad2bce (diff) |
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 <[email protected]>
Diffstat (limited to 'src/plugins/qmlprofiler/qmlprofilertraceview.cpp')
-rw-r--r-- | src/plugins/qmlprofiler/qmlprofilertraceview.cpp | 21 |
1 files 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 <debugger/analyzer/analyzermanager.h> #include <coreplugin/findplaceholder.h> #include <utils/styledbar.h> +#include <utils/algorithm.h> #include <QQmlContext> #include <QToolButton> @@ -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; } }); |