aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/qmlprofiler/qmlprofilertraceview.cpp
diff options
context:
space:
mode:
authorUlf Hermann <[email protected]>2016-08-11 13:44:40 +0200
committerUlf Hermann <[email protected]>2016-11-23 16:13:03 +0000
commit1bb19cc48e571c1442dd52ff088c4a88d83b4ed1 (patch)
treef9ac1c5202c0d7562214d6cb1e9826624c65fd0d /src/plugins/qmlprofiler/qmlprofilertraceview.cpp
parent824f5f443a0b56cb675250ede0706e10e7ad2bce (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.cpp21
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;
}
});