QmlProfiler: Reduce code duplication between timeline models

Change-Id: Ic898ad06437209040c029304ee156f5aef5929da
Reviewed-by: Kai Koehne <kai.koehne@digia.com>
This commit is contained in:
Ulf Hermann
2014-02-14 16:20:13 +01:00
parent 9cbee15341
commit 4bfa5d62e0
13 changed files with 478 additions and 271 deletions

View File

@@ -28,21 +28,33 @@
****************************************************************************/ ****************************************************************************/
#include "abstracttimelinemodel.h" #include "abstracttimelinemodel.h"
#include "abstracttimelinemodel_p.h"
namespace QmlProfiler { namespace QmlProfiler {
AbstractTimelineModel::AbstractTimelineModel(const QString &name, QObject *parent) : AbstractTimelineModel::AbstractTimelineModel(AbstractTimelineModelPrivate *dd, const QString &name,
QObject(parent), m_name(name), m_modelManager(0) QObject *parent) :
{} QObject(parent), d_ptr(dd)
{
Q_D(AbstractTimelineModel);
d->q_ptr = this;
d->name = name;
d->modelId = 0;
d->modelManager = 0;
}
AbstractTimelineModel::~AbstractTimelineModel() AbstractTimelineModel::~AbstractTimelineModel()
{} {
Q_D(AbstractTimelineModel);
delete d;
}
void AbstractTimelineModel::setModelManager(QmlProfilerModelManager *modelManager) void AbstractTimelineModel::setModelManager(QmlProfilerModelManager *modelManager)
{ {
m_modelManager = modelManager; Q_D(AbstractTimelineModel);
connect(modelManager->simpleModel(),SIGNAL(changed()),this,SLOT(dataChanged())); d->modelManager = modelManager;
m_modelId = modelManager->registerModelProxy(); connect(d->modelManager->simpleModel(),SIGNAL(changed()),this,SLOT(dataChanged()));
d->modelId = d->modelManager->registerModelProxy();
} }
QStringList AbstractTimelineModel::categoryTitles() const QStringList AbstractTimelineModel::categoryTitles() const
@@ -55,7 +67,56 @@ QStringList AbstractTimelineModel::categoryTitles() const
QString AbstractTimelineModel::name() const QString AbstractTimelineModel::name() const
{ {
return m_name; Q_D(const AbstractTimelineModel);
return d->name;
}
int AbstractTimelineModel::count() const
{
Q_D(const AbstractTimelineModel);
return d->count();
}
qint64 AbstractTimelineModel::lastTimeMark() const
{
Q_D(const AbstractTimelineModel);
return d->lastEndTime();
}
int AbstractTimelineModel::findFirstIndex(qint64 startTime) const
{
Q_D(const AbstractTimelineModel);
return d->findFirstIndex(startTime);
}
int AbstractTimelineModel::findFirstIndexNoParents(qint64 startTime) const
{
Q_D(const AbstractTimelineModel);
return d->findFirstIndexNoParents(startTime);
}
int AbstractTimelineModel::findLastIndex(qint64 endTime) const
{
Q_D(const AbstractTimelineModel);
return d->findLastIndex(endTime);
}
qint64 AbstractTimelineModel::getDuration(int index) const
{
Q_D(const AbstractTimelineModel);
return d->duration(index);
}
qint64 AbstractTimelineModel::getStartTime(int index) const
{
Q_D(const AbstractTimelineModel);
return d->startTime(index);
}
qint64 AbstractTimelineModel::getEndTime(int index) const
{
Q_D(const AbstractTimelineModel);
return d->startTime(index) + d->duration(index);
} }
bool AbstractTimelineModel::isEmpty() const bool AbstractTimelineModel::isEmpty() const
@@ -65,22 +126,47 @@ bool AbstractTimelineModel::isEmpty() const
qint64 AbstractTimelineModel::traceStartTime() const qint64 AbstractTimelineModel::traceStartTime() const
{ {
return m_modelManager->traceTime()->startTime(); Q_D(const AbstractTimelineModel);
return d->modelManager->traceTime()->startTime();
} }
qint64 AbstractTimelineModel::traceEndTime() const qint64 AbstractTimelineModel::traceEndTime() const
{ {
return m_modelManager->traceTime()->endTime(); Q_D(const AbstractTimelineModel);
return d->modelManager->traceTime()->endTime();
} }
qint64 AbstractTimelineModel::traceDuration() const qint64 AbstractTimelineModel::traceDuration() const
{ {
return m_modelManager->traceTime()->duration(); Q_D(const AbstractTimelineModel);
return d->modelManager->traceTime()->duration();
} }
int AbstractTimelineModel::getState() const int AbstractTimelineModel::getState() const
{ {
return (int)m_modelManager->state(); Q_D(const AbstractTimelineModel);
return (int)d->modelManager->state();
}
const QVariantMap AbstractTimelineModel::getEventLocation(int index) const
{
Q_UNUSED(index);
QVariantMap map;
return map;
}
int AbstractTimelineModel::getEventIdForHash(const QString &eventHash) const
{
Q_UNUSED(eventHash);
return -1;
}
int AbstractTimelineModel::getEventIdForLocation(const QString &filename, int line, int column) const
{
Q_UNUSED(filename);
Q_UNUSED(line);
Q_UNUSED(column);
return -1;
} }
int AbstractTimelineModel::rowCount() const int AbstractTimelineModel::rowCount() const
@@ -97,9 +183,16 @@ int AbstractTimelineModel::getBindingLoopDest(int index) const
return -1; return -1;
} }
float AbstractTimelineModel::getHeight(int index) const
{
Q_UNUSED(index);
return 1.0f;
}
void AbstractTimelineModel::dataChanged() void AbstractTimelineModel::dataChanged()
{ {
switch (m_modelManager->state()) { Q_D(AbstractTimelineModel);
switch (d->modelManager->state()) {
case QmlProfilerDataState::ProcessingData: case QmlProfilerDataState::ProcessingData:
loadData(); loadData();
break; break;

View File

@@ -45,59 +45,54 @@ class QMLPROFILER_EXPORT AbstractTimelineModel : public QObject
Q_OBJECT Q_OBJECT
public: public:
explicit AbstractTimelineModel(const QString &name, QObject *parent = 0); class AbstractTimelineModelPrivate;
~AbstractTimelineModel(); ~AbstractTimelineModel();
// Trivial methods implemented by the abstract model itself
void setModelManager(QmlProfilerModelManager *modelManager); void setModelManager(QmlProfilerModelManager *modelManager);
QStringList categoryTitles() const; QStringList categoryTitles() const;
QString name() const; QString name() const;
virtual int count() const = 0;
bool isEmpty() const; bool isEmpty() const;
virtual bool eventAccepted(const QmlProfilerSimpleModel::QmlEventData &event) const = 0; // Methods are directly passed on to the private model and relying on its virtual methods.
Q_INVOKABLE qint64 lastTimeMark() const;
Q_INVOKABLE virtual qint64 lastTimeMark() const = 0;
Q_INVOKABLE qint64 traceStartTime() const; Q_INVOKABLE qint64 traceStartTime() const;
Q_INVOKABLE qint64 traceEndTime() const; Q_INVOKABLE qint64 traceEndTime() const;
Q_INVOKABLE qint64 traceDuration() const; Q_INVOKABLE qint64 traceDuration() const;
Q_INVOKABLE int getState() const; Q_INVOKABLE int getState() const;
Q_INVOKABLE int rowCount() const;
Q_INVOKABLE qint64 getDuration(int index) const;
Q_INVOKABLE qint64 getStartTime(int index) const;
Q_INVOKABLE qint64 getEndTime(int index) const;
int findFirstIndex(qint64 startTime) const;
int findFirstIndexNoParents(qint64 startTime) const;
int findLastIndex(qint64 endTime) const;
int count() const;
// Methods that have to be implemented by child models
Q_INVOKABLE virtual bool expanded(int category) const = 0; Q_INVOKABLE virtual bool expanded(int category) const = 0;
Q_INVOKABLE virtual void setExpanded(int category, bool expanded) = 0; Q_INVOKABLE virtual void setExpanded(int category, bool expanded) = 0;
Q_INVOKABLE virtual int categoryDepth(int categoryIndex) const = 0; Q_INVOKABLE virtual int categoryDepth(int categoryIndex) const = 0;
Q_INVOKABLE virtual int categoryCount() const = 0; Q_INVOKABLE virtual int categoryCount() const = 0;
Q_INVOKABLE virtual int rowCount() const;
Q_INVOKABLE virtual const QString categoryLabel(int categoryIndex) const = 0; Q_INVOKABLE virtual const QString categoryLabel(int categoryIndex) const = 0;
Q_INVOKABLE virtual int getEventId(int index) const = 0;
virtual int findFirstIndex(qint64 startTime) const = 0; Q_INVOKABLE virtual QColor getColor(int index) const = 0;
virtual int findFirstIndexNoParents(qint64 startTime) const = 0; Q_INVOKABLE virtual const QVariantList getLabelsForCategory(int category) const = 0;
virtual int findLastIndex(qint64 endTime) const = 0; Q_INVOKABLE virtual const QVariantList getEventDetails(int index) const = 0;
virtual bool eventAccepted(const QmlProfilerSimpleModel::QmlEventData &event) const = 0;
virtual int getEventType(int index) const = 0; virtual int getEventType(int index) const = 0;
virtual int getEventCategory(int index) const = 0; virtual int getEventCategory(int index) const = 0;
virtual int getEventRow(int index) const = 0; virtual int getEventRow(int index) const = 0;
virtual void loadData() = 0; virtual void loadData() = 0;
virtual void clear() = 0; virtual void clear() = 0;
Q_INVOKABLE virtual qint64 getDuration(int index) const = 0; // Methods which can optionally be implemented by child models.
Q_INVOKABLE virtual qint64 getStartTime(int index) const = 0;
Q_INVOKABLE virtual qint64 getEndTime(int index) const = 0;
Q_INVOKABLE virtual int getEventId(int index) const = 0;
Q_INVOKABLE virtual int getBindingLoopDest(int index) const;
Q_INVOKABLE virtual QColor getColor(int index) const = 0;
Q_INVOKABLE virtual float getHeight(int index) const = 0;
Q_INVOKABLE virtual const QVariantList getLabelsForCategory(int category) const = 0;
Q_INVOKABLE virtual const QVariantList getEventDetails(int index) const = 0;
// returned map should contain "file", "line", "column" properties, or be empty // returned map should contain "file", "line", "column" properties, or be empty
Q_INVOKABLE virtual const QVariantMap getEventLocation(int index) const = 0; Q_INVOKABLE virtual const QVariantMap getEventLocation(int index) const;
Q_INVOKABLE virtual int getEventIdForHash(const QString &eventHash) const = 0; Q_INVOKABLE virtual int getEventIdForHash(const QString &eventHash) const;
Q_INVOKABLE virtual int getEventIdForLocation(const QString &filename, int line, int column) const = 0; Q_INVOKABLE virtual int getEventIdForLocation(const QString &filename, int line, int column) const;
Q_INVOKABLE virtual int getBindingLoopDest(int index) const;
Q_INVOKABLE virtual float getHeight(int index) const;
signals: signals:
void dataAvailable(); void dataAvailable();
@@ -106,12 +101,15 @@ signals:
void expandedChanged(); void expandedChanged();
protected: protected:
QString m_name; explicit AbstractTimelineModel(AbstractTimelineModelPrivate *dd, const QString &name,
QmlProfilerModelManager *m_modelManager; QObject *parent = 0);
int m_modelId; AbstractTimelineModelPrivate *d_ptr;
protected slots: protected slots:
void dataChanged(); void dataChanged();
private:
Q_DECLARE_PRIVATE(AbstractTimelineModel)
}; };
} }

View File

@@ -0,0 +1,62 @@
/****************************************************************************
**
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
****************************************************************************/
#ifndef ABSTRACTTIMELINEMODEL_P_H
#define ABSTRACTTIMELINEMODEL_P_H
#include "abstracttimelinemodel.h"
namespace QmlProfiler {
class QMLPROFILER_EXPORT AbstractTimelineModel::AbstractTimelineModelPrivate {
public:
virtual ~AbstractTimelineModelPrivate() {}
virtual int count() const = 0;
virtual qint64 duration(int index) const = 0;
virtual qint64 startTime(int index) const = 0;
virtual qint64 lastEndTime() const = 0;
virtual qint64 firstStartTime() const = 0;
virtual int findFirstIndex(qint64 startTime) const = 0;
virtual int findFirstIndexNoParents(qint64 startTime) const = 0;
virtual int findLastIndex(qint64 endTime) const = 0;
QString name;
QmlProfilerModelManager *modelManager;
int modelId;
protected:
AbstractTimelineModel *q_ptr;
private:
Q_DECLARE_PUBLIC(AbstractTimelineModel)
};
}
#endif // ABSTRACTTIMELINEMODEL_P_H

View File

@@ -32,7 +32,8 @@ SOURCES += \
timelinemodelaggregator.cpp \ timelinemodelaggregator.cpp \
qmlprofilerpainteventsmodelproxy.cpp \ qmlprofilerpainteventsmodelproxy.cpp \
sortedtimelinemodel.cpp \ sortedtimelinemodel.cpp \
qmlprofilerbasemodel.cpp qmlprofilerbasemodel.cpp \
singlecategorytimelinemodel.cpp
HEADERS += \ HEADERS += \
qmlprofilerconstants.h \ qmlprofilerconstants.h \
@@ -65,7 +66,10 @@ HEADERS += \
timelinemodelaggregator.h \ timelinemodelaggregator.h \
qmlprofilerpainteventsmodelproxy.h \ qmlprofilerpainteventsmodelproxy.h \
sortedtimelinemodel.h \ sortedtimelinemodel.h \
qmlprofilerbasemodel.h qmlprofilerbasemodel.h \
abstracttimelinemodel_p.h \
singlecategorytimelinemodel.h \
singlecategorytimelinemodel_p.h
RESOURCES += \ RESOURCES += \
qml/qmlprofiler.qrc qml/qmlprofiler.qrc

View File

@@ -24,7 +24,7 @@ QtcPlugin {
name: "General" name: "General"
files: [ files: [
"abstractqmlprofilerrunner.h", "abstractqmlprofilerrunner.h",
"abstracttimelinemodel.h", "abstracttimelinemodel.cpp", "abstracttimelinemodel.h", "abstracttimelinemodel_p.h", "abstracttimelinemodel.cpp",
"localqmlprofilerrunner.cpp", "localqmlprofilerrunner.h", "localqmlprofilerrunner.cpp", "localqmlprofilerrunner.h",
"qmlprofiler_global.h", "qmlprofiler_global.h",
"qmlprofilerattachdialog.cpp", "qmlprofilerattachdialog.h", "qmlprofilerattachdialog.cpp", "qmlprofilerattachdialog.h",
@@ -51,6 +51,8 @@ QtcPlugin {
"qmlprofilerviewmanager.cpp", "qmlprofilerviewmanager.h", "qmlprofilerviewmanager.cpp", "qmlprofilerviewmanager.h",
"qv8profilerdatamodel.cpp", "qv8profilerdatamodel.h", "qv8profilerdatamodel.cpp", "qv8profilerdatamodel.h",
"qv8profilereventview.h", "qv8profilereventview.cpp", "qv8profilereventview.h", "qv8profilereventview.cpp",
"singlecategorytimelinemodel.h", "singlecategorytimelinemodel_p.h",
"singlecategorytimelinemodel.cpp",
"sortedtimelinemodel.h", "sortedtimelinemodel.cpp", "sortedtimelinemodel.h", "sortedtimelinemodel.cpp",
"timelinemodelaggregator.cpp", "timelinemodelaggregator.h", "timelinemodelaggregator.cpp", "timelinemodelaggregator.h",
"timelinerenderer.cpp", "timelinerenderer.h", "timelinerenderer.cpp", "timelinerenderer.h",

View File

@@ -31,6 +31,7 @@
#include "qmlprofilermodelmanager.h" #include "qmlprofilermodelmanager.h"
#include "qmlprofilersimplemodel.h" #include "qmlprofilersimplemodel.h"
#include "sortedtimelinemodel.h" #include "sortedtimelinemodel.h"
#include "singlecategorytimelinemodel_p.h"
#include <QCoreApplication> #include <QCoreApplication>
#include <QVector> #include <QVector>
@@ -50,52 +51,51 @@ struct CategorySpan {
int contractedRows; int contractedRows;
}; };
class PaintEventsModelProxy::PaintEventsModelProxyPrivate : public SortedTimelineModel<QmlPaintEventData> class PaintEventsModelProxy::PaintEventsModelProxyPrivate :
public SortedTimelineModel<QmlPaintEventData,
SingleCategoryTimelineModel::SingleCategoryTimelineModelPrivate>
{ {
public: public:
PaintEventsModelProxyPrivate(PaintEventsModelProxy *qq) : q(qq) {}
~PaintEventsModelProxyPrivate() {}
void computeAnimationCountLimit(); void computeAnimationCountLimit();
int minAnimationCount; int minAnimationCount;
int maxAnimationCount; int maxAnimationCount;
bool expanded;
bool seenForeignPaintEvent; bool seenForeignPaintEvent;
PaintEventsModelProxy *q; private:
Q_DECLARE_PUBLIC(PaintEventsModelProxy)
}; };
PaintEventsModelProxy::PaintEventsModelProxy(QObject *parent) PaintEventsModelProxy::PaintEventsModelProxy(QObject *parent)
: AbstractTimelineModel(QLatin1String("PaintEventsModelProxy"), parent), : SingleCategoryTimelineModel(new PaintEventsModelProxyPrivate,
d(new PaintEventsModelProxyPrivate(this)) QLatin1String("PaintEventsModelProxy"), tr("Painting"),
QmlDebug::Painting, parent)
{ {
} }
PaintEventsModelProxy::~PaintEventsModelProxy()
{
delete d;
}
void PaintEventsModelProxy::clear() void PaintEventsModelProxy::clear()
{ {
Q_D(PaintEventsModelProxy);
d->SortedTimelineModel::clear(); d->SortedTimelineModel::clear();
d->minAnimationCount = 1; d->minAnimationCount = 1;
d->maxAnimationCount = 1; d->maxAnimationCount = 1;
d->expanded = false; d->expanded = false;
d->seenForeignPaintEvent = false; d->seenForeignPaintEvent = false;
m_modelManager->modelProxyCountUpdated(m_modelId, 0, 1); d->modelManager->modelProxyCountUpdated(d->modelId, 0, 1);
} }
bool PaintEventsModelProxy::eventAccepted(const QmlProfilerSimpleModel::QmlEventData &event) const bool PaintEventsModelProxy::eventAccepted(const QmlProfilerSimpleModel::QmlEventData &event) const
{ {
return (event.eventType == QmlDebug::Painting && event.bindingType == QmlDebug::AnimationFrame); return SingleCategoryTimelineModel::eventAccepted(event) &&
event.bindingType == QmlDebug::AnimationFrame;
} }
void PaintEventsModelProxy::loadData() void PaintEventsModelProxy::loadData()
{ {
Q_D(PaintEventsModelProxy);
clear(); clear();
QmlProfilerSimpleModel *simpleModel = m_modelManager->simpleModel(); QmlProfilerSimpleModel *simpleModel = d->modelManager->simpleModel();
if (simpleModel->isEmpty()) if (simpleModel->isEmpty())
return; return;
@@ -133,41 +133,20 @@ void PaintEventsModelProxy::loadData()
minNextStartTime = event.startTime + 1; minNextStartTime = event.startTime + 1;
m_modelManager->modelProxyCountUpdated(m_modelId, d->count(), referenceList.count()); d->modelManager->modelProxyCountUpdated(d->modelId, d->count(), referenceList.count());
} }
d->computeAnimationCountLimit(); d->computeAnimationCountLimit();
d->computeNesting(); d->computeNesting();
m_modelManager->modelProxyCountUpdated(m_modelId, 1, 1); d->modelManager->modelProxyCountUpdated(d->modelId, 1, 1);
} }
/////////////////// QML interface /////////////////// QML interface
int PaintEventsModelProxy::count() const
{
return d->count();
}
qint64 PaintEventsModelProxy::lastTimeMark() const
{
return d->lastEndTime();
}
bool PaintEventsModelProxy::expanded(int ) const
{
return d->expanded;
}
void PaintEventsModelProxy::setExpanded(int category, bool expanded)
{
Q_UNUSED(category);
d->expanded = expanded;
emit expandedChanged();
}
int PaintEventsModelProxy::categoryDepth(int categoryIndex) const int PaintEventsModelProxy::categoryDepth(int categoryIndex) const
{ {
Q_D(const PaintEventsModelProxy);
Q_UNUSED(categoryIndex); Q_UNUSED(categoryIndex);
if (isEmpty()) if (isEmpty())
return d->seenForeignPaintEvent ? 0 : 1; return d->seenForeignPaintEvent ? 0 : 1;
@@ -175,67 +154,12 @@ int PaintEventsModelProxy::categoryDepth(int categoryIndex) const
return 2; return 2;
} }
int PaintEventsModelProxy::categoryCount() const
{
return 1;
}
const QString PaintEventsModelProxy::categoryLabel(int categoryIndex) const
{
Q_UNUSED(categoryIndex);
return tr("Painting");
}
int PaintEventsModelProxy::findFirstIndex(qint64 startTime) const
{
return d->findFirstIndex(startTime);
}
int PaintEventsModelProxy::findFirstIndexNoParents(qint64 startTime) const
{
return d->findFirstIndexNoParents(startTime);
}
int PaintEventsModelProxy::findLastIndex(qint64 endTime) const
{
return d->findLastIndex(endTime);
}
int PaintEventsModelProxy::getEventType(int index) const
{
Q_UNUSED(index);
return (int)QmlDebug::Painting;
}
int PaintEventsModelProxy::getEventCategory(int index) const
{
Q_UNUSED(index);
// there is only one category, all events belong to it
return 0;
}
int PaintEventsModelProxy::getEventRow(int index) const int PaintEventsModelProxy::getEventRow(int index) const
{ {
Q_UNUSED(index); Q_UNUSED(index);
return 1; return 1;
} }
qint64 PaintEventsModelProxy::getDuration(int index) const
{
return d->range(index).duration;
}
qint64 PaintEventsModelProxy::getStartTime(int index) const
{
return d->range(index).start;
}
qint64 PaintEventsModelProxy::getEndTime(int index) const
{
return d->range(index).start + d->range(index).duration;
}
int PaintEventsModelProxy::getEventId(int index) const int PaintEventsModelProxy::getEventId(int index) const
{ {
// there is only one event Id for all painting events // there is only one event Id for all painting events
@@ -245,6 +169,7 @@ int PaintEventsModelProxy::getEventId(int index) const
QColor PaintEventsModelProxy::getColor(int index) const QColor PaintEventsModelProxy::getColor(int index) const
{ {
Q_D(const PaintEventsModelProxy);
double fpsFraction = d->range(index).framerate / 60.0; double fpsFraction = d->range(index).framerate / 60.0;
if (fpsFraction > 1.0) if (fpsFraction > 1.0)
fpsFraction = 1.0; fpsFraction = 1.0;
@@ -255,6 +180,7 @@ QColor PaintEventsModelProxy::getColor(int index) const
float PaintEventsModelProxy::getHeight(int index) const float PaintEventsModelProxy::getHeight(int index) const
{ {
Q_D(const PaintEventsModelProxy);
float scale = d->maxAnimationCount - d->minAnimationCount; float scale = d->maxAnimationCount - d->minAnimationCount;
float fraction = 1.0f; float fraction = 1.0f;
if (scale > 1) if (scale > 1)
@@ -297,6 +223,7 @@ void PaintEventsModelProxy::PaintEventsModelProxyPrivate::computeAnimationCountL
const QVariantList PaintEventsModelProxy::getEventDetails(int index) const const QVariantList PaintEventsModelProxy::getEventDetails(int index) const
{ {
Q_D(const PaintEventsModelProxy);
QVariantList result; QVariantList result;
// int eventId = getEventId(index); // int eventId = getEventId(index);
@@ -332,24 +259,5 @@ const QVariantList PaintEventsModelProxy::getEventDetails(int index) const
return result; return result;
} }
const QVariantMap PaintEventsModelProxy::getEventLocation(int /*index*/) const
{
QVariantMap map;
return map;
}
int PaintEventsModelProxy::getEventIdForHash(const QString &/*eventHash*/) const
{
// paint events do not have an eventHash
return -1;
}
int PaintEventsModelProxy::getEventIdForLocation(const QString &/*filename*/, int /*line*/, int /*column*/) const
{
// paint events do not have a defined location
return -1;
}
} }
} }

View File

@@ -32,7 +32,7 @@
#define QMLPROFILERPAINTEVENTSMODELPROXY_H #define QMLPROFILERPAINTEVENTSMODELPROXY_H
#include <QObject> #include <QObject>
#include "abstracttimelinemodel.h" #include "singlecategorytimelinemodel.h"
#include <qmldebug/qmlprofilereventtypes.h> #include <qmldebug/qmlprofilereventtypes.h>
#include <qmldebug/qmlprofilereventlocation.h> #include <qmldebug/qmlprofilereventlocation.h>
//#include <QHash> //#include <QHash>
@@ -48,7 +48,7 @@ class QmlProfilerModelManager;
namespace Internal { namespace Internal {
class PaintEventsModelProxy : public AbstractTimelineModel class PaintEventsModelProxy : public SingleCategoryTimelineModel
{ {
// Q_PROPERTY(bool empty READ isEmpty NOTIFY emptyChanged) // Q_PROPERTY(bool empty READ isEmpty NOTIFY emptyChanged)
@@ -61,47 +61,26 @@ public:
}; };
PaintEventsModelProxy(QObject *parent = 0); PaintEventsModelProxy(QObject *parent = 0);
~PaintEventsModelProxy();
void loadData(); void loadData();
Q_INVOKABLE int count() const;
void clear(); void clear();
Q_INVOKABLE qint64 lastTimeMark() const;
Q_INVOKABLE bool expanded(int category) const;
Q_INVOKABLE void setExpanded(int category, bool expanded);
Q_INVOKABLE int categoryDepth(int categoryIndex) const; Q_INVOKABLE int categoryDepth(int categoryIndex) const;
Q_INVOKABLE int categoryCount() const;
Q_INVOKABLE const QString categoryLabel(int categoryIndex) const;
int findFirstIndex(qint64 startTime) const;
int findFirstIndexNoParents(qint64 startTime) const;
int findLastIndex(qint64 endTime) const;
int getEventType(int index) const;
Q_INVOKABLE int getEventCategory(int index) const;
int getEventRow(int index) const;
Q_INVOKABLE qint64 getDuration(int index) const;
Q_INVOKABLE qint64 getStartTime(int index) const;
Q_INVOKABLE qint64 getEndTime(int index) const;
Q_INVOKABLE int getEventId(int index) const; Q_INVOKABLE int getEventId(int index) const;
int getEventRow(int index) const;
Q_INVOKABLE QColor getColor(int index) const; Q_INVOKABLE QColor getColor(int index) const;
Q_INVOKABLE float getHeight(int index) const; Q_INVOKABLE float getHeight(int index) const;
Q_INVOKABLE const QVariantList getLabelsForCategory(int category) const; Q_INVOKABLE const QVariantList getLabelsForCategory(int category) const;
Q_INVOKABLE const QVariantList getEventDetails(int index) const; Q_INVOKABLE const QVariantList getEventDetails(int index) const;
Q_INVOKABLE const QVariantMap getEventLocation(int index) const;
Q_INVOKABLE int getEventIdForHash(const QString &eventHash) const;
Q_INVOKABLE int getEventIdForLocation(const QString &filename, int line, int column) const;
private slots: private slots:
bool eventAccepted(const QmlProfilerSimpleModel::QmlEventData &event) const; bool eventAccepted(const QmlProfilerSimpleModel::QmlEventData &event) const;
private: private:
class PaintEventsModelProxyPrivate; class PaintEventsModelProxyPrivate;
PaintEventsModelProxyPrivate *d; Q_DECLARE_PRIVATE(PaintEventsModelProxy)
}; };
} }

View File

@@ -54,9 +54,6 @@ struct CategorySpan {
class BasicTimelineModel::BasicTimelineModelPrivate : public SortedTimelineModel<BasicTimelineModel::QmlRangeEventStartInstance> class BasicTimelineModel::BasicTimelineModelPrivate : public SortedTimelineModel<BasicTimelineModel::QmlRangeEventStartInstance>
{ {
public: public:
BasicTimelineModelPrivate(BasicTimelineModel *qq) : q(qq) {}
~BasicTimelineModelPrivate() {}
// convenience functions // convenience functions
void prepare(); void prepare();
void computeNestingContracted(); void computeNestingContracted();
@@ -68,30 +65,26 @@ public:
QVector <QString> eventHashes; QVector <QString> eventHashes;
QVector <CategorySpan> categorySpan; QVector <CategorySpan> categorySpan;
bool seenPaintEvent; bool seenPaintEvent;
private:
BasicTimelineModel *q; Q_DECLARE_PUBLIC(BasicTimelineModel)
}; };
BasicTimelineModel::BasicTimelineModel(QObject *parent) BasicTimelineModel::BasicTimelineModel(QObject *parent)
: AbstractTimelineModel(QLatin1String("BasicTimelineModel"), parent), : AbstractTimelineModel(new BasicTimelineModelPrivate, QLatin1String("BasicTimelineModel"),
d(new BasicTimelineModelPrivate(this)) parent)
{ {
} }
BasicTimelineModel::~BasicTimelineModel()
{
delete d;
}
void BasicTimelineModel::clear() void BasicTimelineModel::clear()
{ {
Q_D(BasicTimelineModel);
d->SortedTimelineModel::clear(); d->SortedTimelineModel::clear();
d->eventDict.clear(); d->eventDict.clear();
d->eventHashes.clear(); d->eventHashes.clear();
d->categorySpan.clear(); d->categorySpan.clear();
d->seenPaintEvent = false; d->seenPaintEvent = false;
m_modelManager->modelProxyCountUpdated(m_modelId, 0, 1); d->modelManager->modelProxyCountUpdated(d->modelId, 0, 1);
} }
void BasicTimelineModel::BasicTimelineModelPrivate::prepare() void BasicTimelineModel::BasicTimelineModelPrivate::prepare()
@@ -114,8 +107,9 @@ bool BasicTimelineModel::eventAccepted(const QmlProfilerSimpleModel::QmlEventDat
void BasicTimelineModel::loadData() void BasicTimelineModel::loadData()
{ {
Q_D(BasicTimelineModel);
clear(); clear();
QmlProfilerSimpleModel *simpleModel = m_modelManager->simpleModel(); QmlProfilerSimpleModel *simpleModel = d->modelManager->simpleModel();
if (simpleModel->isEmpty()) if (simpleModel->isEmpty())
return; return;
@@ -149,10 +143,10 @@ void BasicTimelineModel::loadData()
// store starttime-based instance // store starttime-based instance
d->insert(event.startTime, event.duration, QmlRangeEventStartInstance(d->eventHashes.indexOf(eventHash))); d->insert(event.startTime, event.duration, QmlRangeEventStartInstance(d->eventHashes.indexOf(eventHash)));
m_modelManager->modelProxyCountUpdated(m_modelId, d->count(), eventList.count() * 6); d->modelManager->modelProxyCountUpdated(d->modelId, d->count(), eventList.count() * 6);
} }
m_modelManager->modelProxyCountUpdated(m_modelId, 2, 6); d->modelManager->modelProxyCountUpdated(d->modelId, 2, 6);
// compute range nesting // compute range nesting
d->computeNesting(); d->computeNesting();
@@ -160,25 +154,26 @@ void BasicTimelineModel::loadData()
// compute nestingLevel - nonexpanded // compute nestingLevel - nonexpanded
d->computeNestingContracted(); d->computeNestingContracted();
m_modelManager->modelProxyCountUpdated(m_modelId, 3, 6); d->modelManager->modelProxyCountUpdated(d->modelId, 3, 6);
// compute nestingLevel - expanded // compute nestingLevel - expanded
d->computeExpandedLevels(); d->computeExpandedLevels();
m_modelManager->modelProxyCountUpdated(m_modelId, 4, 6); d->modelManager->modelProxyCountUpdated(d->modelId, 4, 6);
d->findBindingLoops(); d->findBindingLoops();
m_modelManager->modelProxyCountUpdated(m_modelId, 5, 6); d->modelManager->modelProxyCountUpdated(d->modelId, 5, 6);
d->computeRowStarts(); d->computeRowStarts();
m_modelManager->modelProxyCountUpdated(m_modelId, 1, 1); d->modelManager->modelProxyCountUpdated(d->modelId, 1, 1);
} }
void BasicTimelineModel::BasicTimelineModelPrivate::computeNestingContracted() void BasicTimelineModel::BasicTimelineModelPrivate::computeNestingContracted()
{ {
Q_Q(BasicTimelineModel);
int i; int i;
int eventCount = count(); int eventCount = count();
@@ -276,6 +271,7 @@ void BasicTimelineModel::BasicTimelineModelPrivate::findBindingLoops()
void BasicTimelineModel::BasicTimelineModelPrivate::computeRowStarts() void BasicTimelineModel::BasicTimelineModelPrivate::computeRowStarts()
{ {
Q_Q(BasicTimelineModel);
int rowStart = 0; int rowStart = 0;
for (int i = 0; i < categorySpan.count(); i++) { for (int i = 0; i < categorySpan.count(); i++) {
categorySpan[i].rowStart = rowStart; categorySpan[i].rowStart = rowStart;
@@ -285,18 +281,9 @@ void BasicTimelineModel::BasicTimelineModelPrivate::computeRowStarts()
/////////////////// QML interface /////////////////// QML interface
int BasicTimelineModel::count() const
{
return d->count();
}
qint64 BasicTimelineModel::lastTimeMark() const
{
return d->lastEndTime();
}
bool BasicTimelineModel::expanded(int category) const bool BasicTimelineModel::expanded(int category) const
{ {
Q_D(const BasicTimelineModel);
if (d->categorySpan.count() <= category) if (d->categorySpan.count() <= category)
return false; return false;
return d->categorySpan[category].expanded; return d->categorySpan[category].expanded;
@@ -304,6 +291,7 @@ bool BasicTimelineModel::expanded(int category) const
void BasicTimelineModel::setExpanded(int category, bool expanded) void BasicTimelineModel::setExpanded(int category, bool expanded)
{ {
Q_D(BasicTimelineModel);
if (d->categorySpan.count() <= category) if (d->categorySpan.count() <= category)
return; return;
@@ -314,6 +302,7 @@ void BasicTimelineModel::setExpanded(int category, bool expanded)
int BasicTimelineModel::categoryDepth(int categoryIndex) const int BasicTimelineModel::categoryDepth(int categoryIndex) const
{ {
Q_D(const BasicTimelineModel);
// special for paint events: show only when empty model or there's actual events // special for paint events: show only when empty model or there's actual events
if (categoryIndex == QmlDebug::Painting && !d->seenPaintEvent) if (categoryIndex == QmlDebug::Painting && !d->seenPaintEvent)
return 0; return 0;
@@ -343,29 +332,15 @@ const QString BasicTimelineModel::categoryLabel(int categoryIndex) const
} }
} }
int BasicTimelineModel::findFirstIndex(qint64 startTime) const
{
return d->findFirstIndex(startTime);
}
int BasicTimelineModel::findFirstIndexNoParents(qint64 startTime) const
{
return d->findFirstIndexNoParents(startTime);
}
int BasicTimelineModel::findLastIndex(qint64 endTime) const
{
return d->findLastIndex(endTime);
}
int BasicTimelineModel::getEventType(int index) const int BasicTimelineModel::getEventType(int index) const
{ {
Q_D(const BasicTimelineModel);
return d->eventDict[d->range(index).eventId].eventType; return d->eventDict[d->range(index).eventId].eventType;
} }
int BasicTimelineModel::getEventCategory(int index) const int BasicTimelineModel::getEventCategory(int index) const
{ {
Q_D(const BasicTimelineModel);
int evTy = getEventType(index); int evTy = getEventType(index);
// special: paint events shown? // special: paint events shown?
if (!d->seenPaintEvent) if (!d->seenPaintEvent)
@@ -375,34 +350,22 @@ int BasicTimelineModel::getEventCategory(int index) const
int BasicTimelineModel::getEventRow(int index) const int BasicTimelineModel::getEventRow(int index) const
{ {
Q_D(const BasicTimelineModel);
if (d->categorySpan[getEventType(index)].expanded) if (d->categorySpan[getEventType(index)].expanded)
return d->range(index).displayRowExpanded + d->categorySpan[getEventType(index)].rowStart; return d->range(index).displayRowExpanded + d->categorySpan[getEventType(index)].rowStart;
else else
return d->range(index).displayRowCollapsed + d->categorySpan[getEventType(index)].rowStart; return d->range(index).displayRowCollapsed + d->categorySpan[getEventType(index)].rowStart;
} }
qint64 BasicTimelineModel::getDuration(int index) const
{
return d->range(index).duration;
}
qint64 BasicTimelineModel::getStartTime(int index) const
{
return d->range(index).start;
}
qint64 BasicTimelineModel::getEndTime(int index) const
{
return d->range(index).start + d->range(index).duration;
}
int BasicTimelineModel::getEventId(int index) const int BasicTimelineModel::getEventId(int index) const
{ {
Q_D(const BasicTimelineModel);
return d->range(index).eventId; return d->range(index).eventId;
} }
int BasicTimelineModel::getBindingLoopDest(int index) const int BasicTimelineModel::getBindingLoopDest(int index) const
{ {
Q_D(const BasicTimelineModel);
return d->range(index).bindingLoopHead; return d->range(index).bindingLoopHead;
} }
@@ -412,15 +375,9 @@ QColor BasicTimelineModel::getColor(int index) const
return QColor::fromHsl((ndx*25)%360, 76, 166); return QColor::fromHsl((ndx*25)%360, 76, 166);
} }
float BasicTimelineModel::getHeight(int index) const
{
Q_UNUSED(index);
// 100% height for regular events
return 1.0f;
}
const QVariantList BasicTimelineModel::getLabelsForCategory(int category) const const QVariantList BasicTimelineModel::getLabelsForCategory(int category) const
{ {
Q_D(const BasicTimelineModel);
QVariantList result; QVariantList result;
if (d->categorySpan.count() > category && d->categorySpan[category].expanded) { if (d->categorySpan.count() > category && d->categorySpan[category].expanded) {
@@ -441,6 +398,7 @@ const QVariantList BasicTimelineModel::getLabelsForCategory(int category) const
const QVariantList BasicTimelineModel::getEventDetails(int index) const const QVariantList BasicTimelineModel::getEventDetails(int index) const
{ {
Q_D(const BasicTimelineModel);
QVariantList result; QVariantList result;
int eventId = getEventId(index); int eventId = getEventId(index);
@@ -485,6 +443,7 @@ const QVariantList BasicTimelineModel::getEventDetails(int index) const
const QVariantMap BasicTimelineModel::getEventLocation(int index) const const QVariantMap BasicTimelineModel::getEventLocation(int index) const
{ {
Q_D(const BasicTimelineModel);
QVariantMap result; QVariantMap result;
int eventId = getEventId(index); int eventId = getEventId(index);
@@ -500,11 +459,13 @@ const QVariantMap BasicTimelineModel::getEventLocation(int index) const
int BasicTimelineModel::getEventIdForHash(const QString &eventHash) const int BasicTimelineModel::getEventIdForHash(const QString &eventHash) const
{ {
Q_D(const BasicTimelineModel);
return d->eventHashes.indexOf(eventHash); return d->eventHashes.indexOf(eventHash);
} }
int BasicTimelineModel::getEventIdForLocation(const QString &filename, int line, int column) const int BasicTimelineModel::getEventIdForLocation(const QString &filename, int line, int column) const
{ {
Q_D(const BasicTimelineModel);
// if this is called from v8 view, we don't have the column number, it will be -1 // if this is called from v8 view, we don't have the column number, it will be -1
foreach (const QmlRangeEventData &eventData, d->eventDict) { foreach (const QmlRangeEventData &eventData, d->eventDict) {
if (eventData.location.filename == filename && if (eventData.location.filename == filename &&

View File

@@ -80,15 +80,12 @@ public:
}; };
BasicTimelineModel(QObject *parent = 0); BasicTimelineModel(QObject *parent = 0);
~BasicTimelineModel();
void loadData(); void loadData();
Q_INVOKABLE int count() const;
void clear(); void clear();
// QML interface // QML interface
Q_INVOKABLE qint64 lastTimeMark() const;
Q_INVOKABLE bool expanded(int category) const; Q_INVOKABLE bool expanded(int category) const;
Q_INVOKABLE void setExpanded(int category, bool expanded); Q_INVOKABLE void setExpanded(int category, bool expanded);
@@ -96,20 +93,12 @@ public:
Q_INVOKABLE int categoryCount() const; Q_INVOKABLE int categoryCount() const;
Q_INVOKABLE const QString categoryLabel(int categoryIndex) const; Q_INVOKABLE const QString categoryLabel(int categoryIndex) const;
int findFirstIndex(qint64 startTime) const;
int findFirstIndexNoParents(qint64 startTime) const;
int findLastIndex(qint64 endTime) const;
int getEventType(int index) const; int getEventType(int index) const;
int getEventCategory(int index) const; int getEventCategory(int index) const;
int getEventRow(int index) const; int getEventRow(int index) const;
Q_INVOKABLE qint64 getDuration(int index) const;
Q_INVOKABLE qint64 getStartTime(int index) const;
Q_INVOKABLE qint64 getEndTime(int index) const;
Q_INVOKABLE int getEventId(int index) const; Q_INVOKABLE int getEventId(int index) const;
int getBindingLoopDest(int index) const; int getBindingLoopDest(int index) const;
Q_INVOKABLE QColor getColor(int index) const; Q_INVOKABLE QColor getColor(int index) const;
Q_INVOKABLE float getHeight(int index) const;
Q_INVOKABLE const QVariantList getLabelsForCategory(int category) const; Q_INVOKABLE const QVariantList getLabelsForCategory(int category) const;
Q_INVOKABLE const QVariantList getEventDetails(int index) const; Q_INVOKABLE const QVariantList getEventDetails(int index) const;
@@ -123,8 +112,7 @@ private slots:
private: private:
class BasicTimelineModelPrivate; class BasicTimelineModelPrivate;
BasicTimelineModelPrivate *d; Q_DECLARE_PRIVATE(BasicTimelineModel)
}; };
} }

View File

@@ -0,0 +1,96 @@
/****************************************************************************
**
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
****************************************************************************/
#include "singlecategorytimelinemodel.h"
#include "singlecategorytimelinemodel_p.h"
namespace QmlProfiler {
SingleCategoryTimelineModel::SingleCategoryTimelineModel(SingleCategoryTimelineModelPrivate *dd,
const QString &name, const QString &label, QmlDebug::QmlEventType eventType,
QObject *parent) :
AbstractTimelineModel(dd, name, parent)
{
Q_D(SingleCategoryTimelineModel);
d->expanded = false;
d->label = label;
d->eventType = eventType;
}
/////////////////// QML interface
bool SingleCategoryTimelineModel::eventAccepted(const QmlProfilerSimpleModel::QmlEventData &event) const
{
Q_D(const SingleCategoryTimelineModel);
return (event.eventType == d->eventType);
}
bool SingleCategoryTimelineModel::expanded(int categoryIndex) const
{
Q_D(const SingleCategoryTimelineModel);
Q_UNUSED(categoryIndex);
return d->expanded;
}
void SingleCategoryTimelineModel::setExpanded(int categoryIndex, bool expanded)
{
Q_D(SingleCategoryTimelineModel);
Q_UNUSED(categoryIndex);
if (expanded != d->expanded) {
d->expanded = expanded;
emit expandedChanged();
}
}
int SingleCategoryTimelineModel::categoryCount() const
{
return 1;
}
const QString SingleCategoryTimelineModel::categoryLabel(int categoryIndex) const
{
Q_D(const SingleCategoryTimelineModel);
Q_UNUSED(categoryIndex);
return d->label;
}
int SingleCategoryTimelineModel::getEventType(int index) const
{
Q_D(const SingleCategoryTimelineModel);
Q_UNUSED(index);
return (int)d->eventType;
}
int SingleCategoryTimelineModel::getEventCategory(int index) const
{
Q_UNUSED(index);
return 0;
}
}

View File

@@ -0,0 +1,62 @@
/****************************************************************************
**
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
****************************************************************************/
#ifndef SINGLECATEGORYTIMELINEMODEL_H
#define SINGLECATEGORYTIMELINEMODEL_H
#include <qmldebug/qmlprofilereventtypes.h>
#include "abstracttimelinemodel.h"
namespace QmlProfiler {
class QMLPROFILER_EXPORT SingleCategoryTimelineModel : public AbstractTimelineModel
{
Q_OBJECT
public:
bool eventAccepted(const QmlProfilerSimpleModel::QmlEventData &event) const;
Q_INVOKABLE bool expanded(int) const;
Q_INVOKABLE void setExpanded(int, bool expanded);
Q_INVOKABLE int categoryCount() const;
int getEventType(int index) const;
Q_INVOKABLE int getEventCategory(int index) const;
Q_INVOKABLE const QString categoryLabel(int categoryIndex) const;
protected:
class SingleCategoryTimelineModelPrivate;
SingleCategoryTimelineModel(SingleCategoryTimelineModelPrivate *dd, const QString &name,
const QString &label, QmlDebug::QmlEventType eventType,
QObject *parent);
Q_DECLARE_PRIVATE(SingleCategoryTimelineModel)
};
}
#endif // SINGLECATEGORYTIMELINEMODEL_H

View File

@@ -0,0 +1,47 @@
/****************************************************************************
**
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
****************************************************************************/
#ifndef SINGLECATEGORYTIMELINEMODEL_P_H
#define SINGLECATEGORYTIMELINEMODEL_P_H
#include "singlecategorytimelinemodel.h"
#include "abstracttimelinemodel_p.h"
namespace QmlProfiler {
class SingleCategoryTimelineModel::SingleCategoryTimelineModelPrivate :
public AbstractTimelineModel::AbstractTimelineModelPrivate {
public:
bool expanded;
QString label;
QmlDebug::QmlEventType eventType;
};
}
#endif // SINGLECATEGORYTIMELINEMODEL_P_H

View File

@@ -30,13 +30,17 @@
#ifndef SORTEDTIMELINEMODEL_H #ifndef SORTEDTIMELINEMODEL_H
#define SORTEDTIMELINEMODEL_H #define SORTEDTIMELINEMODEL_H
#include "abstracttimelinemodel_p.h"
#include <QVector> #include <QVector>
#include <QLinkedList> #include <QLinkedList>
namespace QmlProfiler { namespace QmlProfiler {
template<class Data> // The template has to be inserted into the hierarchy of public/private classes when Data is known.
class SortedTimelineModel { // Otherwise we'd have to add implementation details to the public headers. This is why the class to
// be derived from is given as template parameter.
template<class Data, class Base = AbstractTimelineModel::AbstractTimelineModelPrivate>
class SortedTimelineModel : public Base {
public: public:
struct Range : public Data { struct Range : public Data {
Range() : Data(), start(-1), duration(-1), parent(-1) {} Range() : Data(), start(-1), duration(-1), parent(-1) {}
@@ -65,10 +69,13 @@ public:
inline int count() const { return ranges.count(); } inline int count() const { return ranges.count(); }
qint64 duration(int index) const { return range(index).duration; }
qint64 startTime(int index) const { return range(index).start; }
inline qint64 lastEndTime() const { return endTimes.last().end; } inline qint64 lastEndTime() const { return endTimes.last().end; }
inline qint64 firstStartTime() const { return ranges.first().start; } inline qint64 firstStartTime() const { return ranges.first().start; }
inline const Range &range(int index) { return ranges[index]; } inline const Range &range(int index) const { return ranges[index]; }
inline Data &data(int index) { return ranges[index]; } inline Data &data(int index) { return ranges[index]; }
inline int insert(qint64 startTime, qint64 duration, const Data &item) inline int insert(qint64 startTime, qint64 duration, const Data &item)