forked from qt-creator/qt-creator
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:
@@ -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;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user