Timeline: Move modelId generation into aggregator

The way the notes model works requires every timeline model to have a
different ID. Conversely no other kind of model actually needs an ID.
Therefore it makes sense to have the TimelineModelAggregator manage the
IDs as every timeline model will sooner or later be associated with an
aggregator.

Change-Id: Ib8b2c88ed883351d4e3e156dd13e1dd113c21808
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
Ulf Hermann
2018-03-28 15:40:13 +02:00
parent 181ad6671c
commit 780d4c6a43
49 changed files with 188 additions and 141 deletions

View File

@@ -30,7 +30,8 @@
namespace QmlProfiler {
namespace Internal {
DebugMessagesModel::DebugMessagesModel(QmlProfilerModelManager *manager, QObject *parent) :
DebugMessagesModel::DebugMessagesModel(QmlProfilerModelManager *manager,
Timeline::TimelineModelAggregator *parent) :
QmlProfilerTimelineModel(manager, DebugMessage, MaximumRangeType, ProfileDebugMessages, parent),
m_maximumMsgType(-1)
{

View File

@@ -35,7 +35,7 @@ class DebugMessagesModel : public QmlProfilerTimelineModel
Q_OBJECT
public:
DebugMessagesModel(QmlProfilerModelManager *manager, QObject *parent = 0);
DebugMessagesModel(QmlProfilerModelManager *manager, Timeline::TimelineModelAggregator *parent);
int typeId(int index) const override;
QRgb color(int index) const override;

View File

@@ -57,7 +57,6 @@ FlameGraphModel::FlameGraphModel(QmlProfilerModelManager *modelManager,
this, &FlameGraphModel::onTypeDetailsFinished);
connect(modelManager->notesModel(), &Timeline::TimelineNotesModel::changed,
this, [this](int typeId, int, int){loadNotes(typeId, true);});
m_modelId = modelManager->registerModelProxy();
m_acceptedFeatures = supportedFeatures();
modelManager->announceFeatures(m_acceptedFeatures,

View File

@@ -36,7 +36,8 @@
namespace QmlProfiler {
namespace Internal {
InputEventsModel::InputEventsModel(QmlProfilerModelManager *manager, QObject *parent) :
InputEventsModel::InputEventsModel(QmlProfilerModelManager *manager,
Timeline::TimelineModelAggregator *parent) :
QmlProfilerTimelineModel(manager, Event, MaximumRangeType, ProfileInputEvents, parent),
m_keyTypeId(-1), m_mouseTypeId(-1)
{

View File

@@ -42,7 +42,7 @@ public:
int b;
};
InputEventsModel(QmlProfilerModelManager *manager, QObject *parent = 0);
InputEventsModel(QmlProfilerModelManager *manager, Timeline::TimelineModelAggregator *parent);
bool accepted(const QmlEventType &type) const override;
void loadEvent(const QmlEvent &event, const QmlEventType &type) override;

View File

@@ -32,7 +32,8 @@
namespace QmlProfiler {
namespace Internal {
MemoryUsageModel::MemoryUsageModel(QmlProfilerModelManager *manager, QObject *parent) :
MemoryUsageModel::MemoryUsageModel(QmlProfilerModelManager *manager,
Timeline::TimelineModelAggregator *parent) :
QmlProfilerTimelineModel(manager, MemoryAllocation, MaximumRangeType, ProfileMemory, parent)
{
// Announce additional features. The base class already announces the main feature.

View File

@@ -51,7 +51,7 @@ public:
void update(qint64 amount);
};
MemoryUsageModel(QmlProfilerModelManager *manager, QObject *parent = 0);
MemoryUsageModel(QmlProfilerModelManager *manager, Timeline::TimelineModelAggregator *parent);
qint64 rowMaxValue(int rowNumber) const override;

View File

@@ -32,7 +32,8 @@
namespace QmlProfiler {
namespace Internal {
PixmapCacheModel::PixmapCacheModel(QmlProfilerModelManager *manager, QObject *parent) :
PixmapCacheModel::PixmapCacheModel(QmlProfilerModelManager *manager,
Timeline::TimelineModelAggregator *parent) :
QmlProfilerTimelineModel(manager, PixmapCacheEvent, MaximumRangeType, ProfilePixmapCache,
parent)
{

View File

@@ -94,7 +94,7 @@ public:
qint64 cacheSize = 0;
};
PixmapCacheModel(QmlProfilerModelManager *manager, QObject *parent = 0);
PixmapCacheModel(QmlProfilerModelManager *manager, Timeline::TimelineModelAggregator *parent);
qint64 rowMaxValue(int rowNumber) const override;

View File

@@ -41,7 +41,7 @@ namespace QmlProfiler {
namespace Internal {
QmlProfilerAnimationsModel::QmlProfilerAnimationsModel(QmlProfilerModelManager *manager,
QObject *parent) :
Timeline::TimelineModelAggregator *parent) :
QmlProfilerTimelineModel(manager, Event, MaximumRangeType, ProfileAnimations, parent)
{
m_minNextStartTimes[0] = m_minNextStartTimes[1] = 0;

View File

@@ -49,7 +49,8 @@ public:
int typeId;
};
QmlProfilerAnimationsModel(QmlProfilerModelManager *manager, QObject *parent = 0);
QmlProfilerAnimationsModel(QmlProfilerModelManager *manager,
Timeline::TimelineModelAggregator *parent);
qint64 rowMaxValue(int rowNumber) const override;

View File

@@ -76,7 +76,6 @@ public:
QmlProfilerModelManager::State state = Empty;
int numRegisteredModels = 0;
int numFinishedFinalizers = 0;
int numLoadedEvents = 0;
@@ -193,11 +192,6 @@ int QmlProfilerModelManager::numEventTypes() const
return d->eventTypes.count();
}
int QmlProfilerModelManager::registerModelProxy()
{
return d->numRegisteredModels++;
}
int QmlProfilerModelManager::numFinishedFinalizers() const
{
return d->numFinishedFinalizers;

View File

@@ -76,7 +76,6 @@ public:
int numEvents() const;
int numEventTypes() const;
int registerModelProxy();
void announceFeatures(quint64 features, EventLoader eventLoader, Finalizer finalizer);
int numFinishedFinalizers() const;

View File

@@ -43,7 +43,7 @@ namespace QmlProfiler {
namespace Internal {
QmlProfilerRangeModel::QmlProfilerRangeModel(QmlProfilerModelManager *manager, RangeType range,
QObject *parent) :
Timeline::TimelineModelAggregator *parent) :
QmlProfilerTimelineModel(manager, MaximumMessage, range, featureFromRangeType(range), parent)
{
m_expandedRowTypes << -1;

View File

@@ -56,7 +56,8 @@ public:
int bindingLoopHead;
};
QmlProfilerRangeModel(QmlProfilerModelManager *manager, RangeType range, QObject *parent = 0);
QmlProfilerRangeModel(QmlProfilerModelManager *manager, RangeType range,
Timeline::TimelineModelAggregator *parent);
Q_INVOKABLE int expandedRow(int index) const override;
Q_INVOKABLE int collapsedRow(int index) const override;

View File

@@ -70,7 +70,6 @@ QmlProfilerStatisticsModel::QmlProfilerStatisticsModel(QmlProfilerModelManager *
this, &QmlProfilerStatisticsModel::modelManagerStateChanged);
connect(modelManager->notesModel(), &Timeline::TimelineNotesModel::changed,
this, &QmlProfilerStatisticsModel::notesChanged);
modelManager->registerModelProxy();
m_acceptedTypes << Compiling << Creating << Binding << HandlingSignal << Javascript;

View File

@@ -29,9 +29,9 @@ namespace QmlProfiler {
QmlProfilerTimelineModel::QmlProfilerTimelineModel(QmlProfilerModelManager *modelManager,
Message message, RangeType rangeType,
ProfileFeature mainFeature, QObject *parent) :
TimelineModel(modelManager->registerModelProxy(), parent),
m_message(message), m_rangeType(rangeType), m_mainFeature(mainFeature),
ProfileFeature mainFeature,
Timeline::TimelineModelAggregator *parent) :
TimelineModel(parent), m_message(message), m_rangeType(rangeType), m_mainFeature(mainFeature),
m_modelManager(modelManager)
{
setDisplayName(tr(QmlProfilerModelManager::featureName(mainFeature)));

View File

@@ -28,6 +28,7 @@
#include "qmlprofiler_global.h"
#include "qmlprofilermodelmanager.h"
#include "timeline/timelinemodel.h"
#include "timeline/timelinemodelaggregator.h"
namespace QmlProfiler {
@@ -39,7 +40,8 @@ class QMLPROFILER_EXPORT QmlProfilerTimelineModel : public Timeline::TimelineMod
public:
QmlProfilerTimelineModel(QmlProfilerModelManager *modelManager, Message message,
RangeType rangeType, ProfileFeature mainFeature, QObject *parent);
RangeType rangeType, ProfileFeature mainFeature,
Timeline::TimelineModelAggregator *parent);
QmlProfilerModelManager *modelManager() const;

View File

@@ -76,7 +76,7 @@ Q_STATIC_ASSERT(sizeof(StageLabels) ==
SceneGraphTimelineModel::MaximumSceneGraphStage * sizeof(const char *));
SceneGraphTimelineModel::SceneGraphTimelineModel(QmlProfilerModelManager *manager,
QObject *parent) :
Timeline::TimelineModelAggregator *parent) :
QmlProfilerTimelineModel(manager, SceneGraphFrame, MaximumRangeType, ProfileSceneGraph, parent)
{
}

View File

@@ -82,7 +82,8 @@ public:
int glyphCount; // only used for one event type
};
SceneGraphTimelineModel(QmlProfilerModelManager *manager, QObject *parent = 0);
SceneGraphTimelineModel(QmlProfilerModelManager *manager,
Timeline::TimelineModelAggregator *parent);
int expandedRow(int index) const override;
int collapsedRow(int index) const override;

View File

@@ -33,7 +33,7 @@ namespace QmlProfiler {
namespace Internal {
DebugMessagesModelTest::DebugMessagesModelTest(QObject *parent) :
QObject(parent), manager(nullptr), model(&manager)
QObject(parent), model(&manager, &aggregator)
{
}

View File

@@ -51,6 +51,7 @@ private slots:
private:
QmlProfilerModelManager manager;
Timeline::TimelineModelAggregator aggregator;
DebugMessagesModel model;
};

View File

@@ -37,10 +37,11 @@ FlameGraphModelTest::FlameGraphModelTest(QObject *parent) :
{
}
int FlameGraphModelTest::generateData(QmlProfilerModelManager *manager)
int FlameGraphModelTest::generateData(QmlProfilerModelManager *manager,
Timeline::TimelineModelAggregator *aggregator)
{
// Notes only work with timeline models
QmlProfilerRangeModel *rangeModel = new QmlProfilerRangeModel(manager, Javascript, manager);
QmlProfilerRangeModel *rangeModel = new QmlProfilerRangeModel(manager, Javascript, aggregator);
int rangeModelId = rangeModel->modelId();
manager->notesModel()->addTimelineModel(rangeModel);
@@ -95,7 +96,7 @@ int FlameGraphModelTest::generateData(QmlProfilerModelManager *manager)
void FlameGraphModelTest::initTestCase()
{
QCOMPARE(model.modelManager(), &manager);
rangeModelId = generateData(&manager);
rangeModelId = generateData(&manager, &aggregator);
QCOMPARE(manager.state(), QmlProfilerModelManager::Done);
}

View File

@@ -27,6 +27,9 @@
#include <qmlprofiler/flamegraphmodel.h>
#include <qmlprofiler/qmlprofilermodelmanager.h>
#include <timeline/timelinemodelaggregator.h>
#include <QObject>
namespace QmlProfiler {
@@ -37,7 +40,8 @@ class FlameGraphModelTest : public QObject
Q_OBJECT
public:
FlameGraphModelTest(QObject *parent = nullptr);
static int generateData(QmlProfilerModelManager *manager);
static int generateData(QmlProfilerModelManager *manager,
Timeline::TimelineModelAggregator *aggregator);
private slots:
void initTestCase();
@@ -50,6 +54,7 @@ private slots:
private:
QmlProfilerModelManager manager;
Timeline::TimelineModelAggregator aggregator;
FlameGraphModel model;
int rangeModelId = -1;
};

View File

@@ -34,7 +34,8 @@
namespace QmlProfiler {
namespace Internal {
FlameGraphViewTest::FlameGraphViewTest(QObject *parent) : QObject(parent), view(&manager)
FlameGraphViewTest::FlameGraphViewTest(QObject *parent)
: QObject(parent), view(&manager)
{
}
@@ -42,7 +43,7 @@ void FlameGraphViewTest::initTestCase()
{
connect(&view, &QmlProfilerEventsView::showFullRange,
this, [this](){ manager.restrictToRange(-1, -1); });
FlameGraphModelTest::generateData(&manager);
FlameGraphModelTest::generateData(&manager, &aggregator);
QCOMPARE(manager.state(), QmlProfilerModelManager::Done);
view.resize(500, 500);
view.show();

View File

@@ -27,6 +27,9 @@
#include <qmlprofiler/flamegraphview.h>
#include <qmlprofiler/qmlprofilermodelmanager.h>
#include <timeline/timelinemodelaggregator.h>
#include <QObject>
namespace QmlProfiler {
@@ -46,6 +49,7 @@ private slots:
private:
QmlProfilerModelManager manager;
Timeline::TimelineModelAggregator aggregator;
FlameGraphView view;
};

View File

@@ -38,7 +38,7 @@ static InputEventType inputType(int i)
}
InputEventsModelTest::InputEventsModelTest(QObject *parent) :
QObject(parent), manager(nullptr), model(&manager)
QObject(parent), model(&manager, &aggregator)
{
keyTypeId = manager.numEventTypes();
manager.addEventType(QmlEventType(Event, MaximumRangeType, Key));

View File

@@ -51,6 +51,7 @@ private slots:
private:
QmlProfilerModelManager manager;
Timeline::TimelineModelAggregator aggregator;
InputEventsModel model;
int mouseTypeId = -1;

View File

@@ -30,7 +30,7 @@ namespace QmlProfiler {
namespace Internal {
MemoryUsageModelTest::MemoryUsageModelTest(QObject *parent) : QObject(parent),
manager(nullptr), model(&manager)
model(&manager, &aggregator)
{
}

View File

@@ -54,6 +54,7 @@ private slots:
private:
QmlProfilerModelManager manager;
Timeline::TimelineModelAggregator aggregator;
MemoryUsageModel model;
int heapPageTypeId = -1;

View File

@@ -31,7 +31,7 @@ namespace QmlProfiler {
namespace Internal {
PixmapCacheModelTest::PixmapCacheModelTest(QObject *parent) : QObject(parent),
manager(nullptr), model(&manager)
model(&manager, &aggregator)
{
}

View File

@@ -48,6 +48,7 @@ private slots:
private:
QmlProfilerModelManager manager;
Timeline::TimelineModelAggregator aggregator;
PixmapCacheModel model;
int eventTypeIndices[2 * MaximumPixmapEventType];

View File

@@ -31,7 +31,7 @@ namespace QmlProfiler {
namespace Internal {
QmlProfilerAnimationsModelTest::QmlProfilerAnimationsModelTest(QObject *parent) :
QObject(parent), manager(nullptr), model(&manager)
QObject(parent), model(&manager, &aggregator)
{
}

View File

@@ -52,6 +52,7 @@ private slots:
private:
QmlProfilerModelManager manager;
Timeline::TimelineModelAggregator aggregator;
QmlProfilerAnimationsModel model;
};

View File

@@ -37,12 +37,13 @@ namespace Internal {
class DummyModel : public QmlProfilerRangeModel {
public:
DummyModel(QmlProfilerModelManager *manager);
DummyModel(QmlProfilerModelManager *manager, Timeline::TimelineModelAggregator *aggregator);
void loadData();
};
DummyModel::DummyModel(QmlProfilerModelManager *manager) :
QmlProfilerRangeModel(manager, Binding)
DummyModel::DummyModel(QmlProfilerModelManager *manager,
Timeline::TimelineModelAggregator *aggregator) :
QmlProfilerRangeModel(manager, Binding, aggregator)
{
}
@@ -90,8 +91,9 @@ void QmlProfilerBindingLoopsRenderPassTest::testUpdate()
inst->update(&renderer, &parentState, 0, 0, 0, true, 1);
QCOMPARE(result, nullState);
QmlProfilerModelManager manager(nullptr);
DummyModel model(&manager);
QmlProfilerModelManager manager;
Timeline::TimelineModelAggregator aggregator;
DummyModel model(&manager, &aggregator);
renderer.setModel(&model);
result = inst->update(&renderer, &parentState, 0, 0, 0, true, 1);
QCOMPARE(result, nullState);