QmlProfiler: Separate expanded and collapsed row heights and counts

We'll need to access both of them when building the scene graph. This
change also clarifies the dynamics between expanding categories and
row heights and offsets.

Change-Id: I2e2bf488ad973c95d05f230bf6fff63598f39bf2
Reviewed-by: Kai Koehne <kai.koehne@theqtcompany.com>
This commit is contained in:
Ulf Hermann
2014-11-18 17:37:25 +01:00
parent bc4586ffbe
commit 725623583f
10 changed files with 98 additions and 62 deletions

View File

@@ -174,7 +174,7 @@ Item {
onMouseYChanged: { onMouseYChanged: {
if (resizing) { if (resizing) {
column.parentModel.setRowHeight(index + 1, y + mouseY); column.parentModel.setExpandedRowHeight(index + 1, y + mouseY);
parent.height = column.parentModel.rowHeight(index + 1); parent.height = column.parentModel.rowHeight(index + 1);
} }
} }

View File

@@ -62,8 +62,8 @@ Item {
Connections { Connections {
target: model target: model
onRowHeightChanged: { onExpandedRowHeightChanged: {
if (row >= 0) if (model && model.expanded && row >= 0)
rowRepeater.itemAt(row).height = height; rowRepeater.itemAt(row).height = height;
} }
} }

View File

@@ -135,11 +135,6 @@ int QmlProfilerAnimationsModel::rowFromThreadId(int threadId) const
return (threadId == QmlDebug::GuiThread || m_maxGuiThreadAnimations == 0) ? 1 : 2; return (threadId == QmlDebug::GuiThread || m_maxGuiThreadAnimations == 0) ? 1 : 2;
} }
int QmlProfilerAnimationsModel::row(int index) const
{
return rowFromThreadId(selectionId(index));
}
int QmlProfilerAnimationsModel::rowMaxValue(int rowNumber) const int QmlProfilerAnimationsModel::rowMaxValue(int rowNumber) const
{ {
switch (rowNumber) { switch (rowNumber) {
@@ -157,6 +152,16 @@ int QmlProfilerAnimationsModel::typeId(int index) const
return m_data[index].typeId; return m_data[index].typeId;
} }
int QmlProfilerAnimationsModel::expandedRow(int index) const
{
return rowFromThreadId(selectionId(index));
}
int QmlProfilerAnimationsModel::collapsedRow(int index) const
{
return rowFromThreadId(selectionId(index));
}
QColor QmlProfilerAnimationsModel::color(int index) const QColor QmlProfilerAnimationsModel::color(int index) const
{ {
double fpsFraction = m_data[index].framerate / 60.0; double fpsFraction = m_data[index].framerate / 60.0;

View File

@@ -65,7 +65,8 @@ public:
int rowMaxValue(int rowNumber) const; int rowMaxValue(int rowNumber) const;
int typeId(int index) const; int typeId(int index) const;
int row(int index) const; Q_INVOKABLE int expandedRow(int index) const;
Q_INVOKABLE int collapsedRow(int index) const;
QColor color(int index) const; QColor color(int index) const;
float relativeHeight(int index) const; float relativeHeight(int index) const;

View File

@@ -188,12 +188,14 @@ QString QmlProfilerRangeModel::categoryLabel(QmlDebug::RangeType rangeType)
QmlProfilerModelManager::featureName(QmlDebug::featureFromRangeType(rangeType))); QmlProfilerModelManager::featureName(QmlDebug::featureFromRangeType(rangeType)));
} }
int QmlProfilerRangeModel::row(int index) const int QmlProfilerRangeModel::expandedRow(int index) const
{ {
if (expanded()) return m_data[index].displayRowExpanded;
return m_data[index].displayRowExpanded; }
else
return m_data[index].displayRowCollapsed; int QmlProfilerRangeModel::collapsedRow(int index) const
{
return m_data[index].displayRowCollapsed;
} }
int QmlProfilerRangeModel::bindingLoopDest(int index) const int QmlProfilerRangeModel::bindingLoopDest(int index) const

View File

@@ -66,7 +66,8 @@ public:
static QString categoryLabel(QmlDebug::RangeType categoryIndex); static QString categoryLabel(QmlDebug::RangeType categoryIndex);
int row(int index) const; Q_INVOKABLE int expandedRow(int index) const;
Q_INVOKABLE int collapsedRow(int index) const;
int bindingLoopDest(int index) const; int bindingLoopDest(int index) const;
QColor color(int index) const; QColor color(int index) const;

View File

@@ -109,6 +109,7 @@ void TimelineModel::setCollapsedRowCount(int rows)
Q_D(TimelineModel); Q_D(TimelineModel);
if (d->collapsedRowCount != rows) { if (d->collapsedRowCount != rows) {
d->collapsedRowCount = rows; d->collapsedRowCount = rows;
emit collapsedRowCountChanged();
if (!d->expanded) if (!d->expanded)
emit rowCountChanged(); emit rowCountChanged();
} }
@@ -120,16 +121,21 @@ int TimelineModel::expandedRowCount() const
return d->expandedRowCount; return d->expandedRowCount;
} }
void QmlProfiler::TimelineModel::setExpandedRowCount(int rows) void TimelineModel::setExpandedRowCount(int rows)
{ {
Q_D(TimelineModel); Q_D(TimelineModel);
if (d->expandedRowCount != rows) { if (d->expandedRowCount != rows) {
d->expandedRowCount = rows; d->expandedRowCount = rows;
emit expandedRowCountChanged();
if (d->expanded) if (d->expanded)
emit rowCountChanged(); emit rowCountChanged();
} }
} }
int TimelineModel::row(int index) const
{
return expanded() ? expandedRow(index) : collapsedRow(index);
}
TimelineModel::TimelineModelPrivate::TimelineModelPrivate(int modelId, const QString &displayName) : TimelineModel::TimelineModelPrivate::TimelineModelPrivate(int modelId, const QString &displayName) :
modelId(modelId), displayName(displayName), expanded(false), hidden(false), modelId(modelId), displayName(displayName), expanded(false), hidden(false),
@@ -140,7 +146,6 @@ TimelineModel::TimelineModelPrivate::TimelineModelPrivate(int modelId, const QSt
void TimelineModel::TimelineModelPrivate::init(TimelineModel *q) void TimelineModel::TimelineModelPrivate::init(TimelineModel *q)
{ {
q_ptr = q; q_ptr = q;
connect(q,SIGNAL(rowHeightChanged(int,int)),q,SIGNAL(heightChanged()));
connect(q,SIGNAL(expandedChanged()),q,SIGNAL(heightChanged())); connect(q,SIGNAL(expandedChanged()),q,SIGNAL(heightChanged()));
connect(q,SIGNAL(hiddenChanged()),q,SIGNAL(heightChanged())); connect(q,SIGNAL(hiddenChanged()),q,SIGNAL(heightChanged()));
connect(q,SIGNAL(emptyChanged()),q,SIGNAL(heightChanged())); connect(q,SIGNAL(emptyChanged()),q,SIGNAL(heightChanged()));
@@ -176,24 +181,30 @@ int TimelineModel::modelId() const
return d->modelId; return d->modelId;
} }
int TimelineModel::rowHeight(int rowNumber) const int TimelineModel::collapsedRowHeight(int rowNumber) const
{
Q_UNUSED(rowNumber);
return TimelineModelPrivate::DefaultRowHeight;
}
int TimelineModel::collapsedRowOffset(int rowNumber) const
{
return rowNumber * TimelineModelPrivate::DefaultRowHeight;
}
int TimelineModel::expandedRowHeight(int rowNumber) const
{ {
Q_D(const TimelineModel); Q_D(const TimelineModel);
if (!expanded())
return TimelineModelPrivate::DefaultRowHeight;
if (d->rowOffsets.size() > rowNumber) if (d->rowOffsets.size() > rowNumber)
return d->rowOffsets[rowNumber] - (rowNumber > 0 ? d->rowOffsets[rowNumber - 1] : 0); return d->rowOffsets[rowNumber] - (rowNumber > 0 ? d->rowOffsets[rowNumber - 1] : 0);
return TimelineModelPrivate::DefaultRowHeight; return TimelineModelPrivate::DefaultRowHeight;
} }
int TimelineModel::rowOffset(int rowNumber) const int TimelineModel::expandedRowOffset(int rowNumber) const
{ {
Q_D(const TimelineModel); Q_D(const TimelineModel);
if (rowNumber == 0) if (rowNumber == 0)
return 0; return 0;
if (!expanded())
return TimelineModelPrivate::DefaultRowHeight * rowNumber;
if (d->rowOffsets.size() >= rowNumber) if (d->rowOffsets.size() >= rowNumber)
return d->rowOffsets[rowNumber - 1]; return d->rowOffsets[rowNumber - 1];
@@ -203,11 +214,9 @@ int TimelineModel::rowOffset(int rowNumber) const
return rowNumber * TimelineModelPrivate::DefaultRowHeight; return rowNumber * TimelineModelPrivate::DefaultRowHeight;
} }
void TimelineModel::setRowHeight(int rowNumber, int height) void TimelineModel::setExpandedRowHeight(int rowNumber, int height)
{ {
Q_D(TimelineModel); Q_D(TimelineModel);
if (d->hidden || !d->expanded)
return;
if (height < TimelineModelPrivate::DefaultRowHeight) if (height < TimelineModelPrivate::DefaultRowHeight)
height = TimelineModelPrivate::DefaultRowHeight; height = TimelineModelPrivate::DefaultRowHeight;
@@ -220,20 +229,34 @@ void TimelineModel::setRowHeight(int rowNumber, int height)
for (int offsetRow = rowNumber; offsetRow < d->rowOffsets.size(); ++offsetRow) { for (int offsetRow = rowNumber; offsetRow < d->rowOffsets.size(); ++offsetRow) {
d->rowOffsets[offsetRow] += difference; d->rowOffsets[offsetRow] += difference;
} }
emit rowHeightChanged(rowNumber, height); emit expandedRowHeightChanged(rowNumber, height);
if (d->expanded)
emit heightChanged();
} }
} }
int TimelineModel::rowOffset(int rowNumber) const
{
return expanded() ? expandedRowOffset(rowNumber) : collapsedRowOffset(rowNumber);
}
int TimelineModel::rowHeight(int rowNumber) const
{
return expanded() ? expandedRowHeight(rowNumber) : collapsedRowHeight(rowNumber);
}
int TimelineModel::height() const int TimelineModel::height() const
{ {
Q_D(const TimelineModel); Q_D(const TimelineModel);
if (d->hidden || isEmpty()) if (d->hidden || isEmpty())
return 0; return 0;
if (!d->expanded || d->rowOffsets.empty()) if (!d->expanded)
return rowCount() * TimelineModelPrivate::DefaultRowHeight; return collapsedRowCount() * TimelineModelPrivate::DefaultRowHeight;
if (d->rowOffsets.empty())
return expandedRowCount() * TimelineModelPrivate::DefaultRowHeight;
return d->rowOffsets.last() + (rowCount() - d->rowOffsets.size()) * return d->rowOffsets.last() + (expandedRowCount() - d->rowOffsets.size()) *
TimelineModelPrivate::DefaultRowHeight; TimelineModelPrivate::DefaultRowHeight;
} }
@@ -499,25 +522,17 @@ int TimelineModel::selectionId(int index) const
void TimelineModel::clear() void TimelineModel::clear()
{ {
Q_D(TimelineModel); Q_D(TimelineModel);
bool hadRows = (rowCount() != 1);
bool wasExpanded = d->expanded;
bool wasHidden = d->hidden;
bool hadRowHeights = !d->rowOffsets.empty(); bool hadRowHeights = !d->rowOffsets.empty();
bool wasEmpty = isEmpty(); bool wasEmpty = isEmpty();
d->collapsedRowCount = d->expandedRowCount = 1; setExpandedRowCount(1);
setCollapsedRowCount(1);
setExpanded(false);
setHidden(false);
d->rowOffsets.clear(); d->rowOffsets.clear();
d->expanded = false;
d->hidden = false;
d->ranges.clear(); d->ranges.clear();
d->endTimes.clear(); d->endTimes.clear();
if (hadRowHeights) if (hadRowHeights)
emit rowHeightChanged(-1, -1); emit expandedRowHeightChanged(-1, -1);
if (wasExpanded)
emit expandedChanged();
if (wasHidden)
emit hiddenChanged();
if (hadRows)
emit rowCountChanged();
if (!wasEmpty) if (!wasEmpty)
emit emptyChanged(); emit emptyChanged();
} }

View File

@@ -49,6 +49,8 @@ class QMLPROFILER_EXPORT TimelineModel : public QObject
Q_PROPERTY(bool hidden READ hidden WRITE setHidden NOTIFY hiddenChanged) Q_PROPERTY(bool hidden READ hidden WRITE setHidden NOTIFY hiddenChanged)
Q_PROPERTY(bool expanded READ expanded WRITE setExpanded NOTIFY expandedChanged) Q_PROPERTY(bool expanded READ expanded WRITE setExpanded NOTIFY expandedChanged)
Q_PROPERTY(int height READ height NOTIFY heightChanged) Q_PROPERTY(int height READ height NOTIFY heightChanged)
Q_PROPERTY(int expandedRowCount READ expandedRowCount NOTIFY expandedRowCountChanged)
Q_PROPERTY(int collapsedRowCount READ collapsedRowCount NOTIFY collapsedRowCountChanged)
Q_PROPERTY(int rowCount READ rowCount NOTIFY rowCountChanged) Q_PROPERTY(int rowCount READ rowCount NOTIFY rowCountChanged)
Q_PROPERTY(QVariantList labels READ labels NOTIFY labelsChanged) Q_PROPERTY(QVariantList labels READ labels NOTIFY labelsChanged)
Q_PROPERTY(int count READ count NOTIFY emptyChanged) Q_PROPERTY(int count READ count NOTIFY emptyChanged)
@@ -63,9 +65,16 @@ public:
// Methods implemented by the abstract model itself // Methods implemented by the abstract model itself
bool isEmpty() const; bool isEmpty() const;
int modelId() const; int modelId() const;
Q_INVOKABLE int collapsedRowHeight(int rowNumber) const;
Q_INVOKABLE int expandedRowHeight(int rowNumber) const;
Q_INVOKABLE int rowHeight(int rowNumber) const; Q_INVOKABLE int rowHeight(int rowNumber) const;
Q_INVOKABLE void setExpandedRowHeight(int rowNumber, int height);
Q_INVOKABLE int collapsedRowOffset(int rowNumber) const;
Q_INVOKABLE int expandedRowOffset(int rowNumber) const;
Q_INVOKABLE int rowOffset(int rowNumber) const; Q_INVOKABLE int rowOffset(int rowNumber) const;
Q_INVOKABLE void setRowHeight(int rowNumber, int height);
int height() const; int height() const;
int count() const; int count() const;
Q_INVOKABLE qint64 duration(int index) const; Q_INVOKABLE qint64 duration(int index) const;
@@ -81,13 +90,17 @@ public:
void setExpanded(bool expanded); void setExpanded(bool expanded);
void setHidden(bool hidden); void setHidden(bool hidden);
QString displayName() const; QString displayName() const;
int expandedRowCount() const;
int collapsedRowCount() const;
int rowCount() const; int rowCount() const;
// Methods that have to be implemented by child models // Methods that have to be implemented by child models
Q_INVOKABLE virtual QColor color(int index) const = 0; Q_INVOKABLE virtual QColor color(int index) const = 0;
virtual QVariantList labels() const = 0; virtual QVariantList labels() const = 0;
Q_INVOKABLE virtual QVariantMap details(int index) const = 0; Q_INVOKABLE virtual QVariantMap details(int index) const = 0;
Q_INVOKABLE virtual int row(int index) const = 0; Q_INVOKABLE virtual int expandedRow(int index) const = 0;
Q_INVOKABLE virtual int collapsedRow(int index) const = 0;
Q_INVOKABLE int row(int index) const;
// Methods which can optionally be implemented by child models. // Methods which can optionally be implemented by child models.
// returned map should contain "file", "line", "column" properties, or be empty // returned map should contain "file", "line", "column" properties, or be empty
@@ -110,9 +123,11 @@ public:
signals: signals:
void expandedChanged(); void expandedChanged();
void hiddenChanged(); void hiddenChanged();
void rowHeightChanged(int row, int height); void expandedRowHeightChanged(int row, int height);
void emptyChanged(); void emptyChanged();
void heightChanged(); void heightChanged();
void expandedRowCountChanged();
void collapsedRowCountChanged();
void rowCountChanged(); void rowCountChanged();
void labelsChanged(); void labelsChanged();
@@ -126,10 +141,7 @@ protected:
void insertEnd(int index, qint64 duration); void insertEnd(int index, qint64 duration);
void computeNesting(); void computeNesting();
int collapsedRowCount() const;
void setCollapsedRowCount(int rows); void setCollapsedRowCount(int rows);
int expandedRowCount() const;
void setExpandedRowCount(int rows); void setExpandedRowCount(int rows);
virtual void clear(); virtual void clear();

View File

@@ -66,14 +66,14 @@ void TimelineRenderer::setModel(QmlProfilerTimelineModel *model)
if (m_model) { if (m_model) {
disconnect(m_model, SIGNAL(expandedChanged()), this, SLOT(requestPaint())); disconnect(m_model, SIGNAL(expandedChanged()), this, SLOT(requestPaint()));
disconnect(m_model, SIGNAL(hiddenChanged()), this, SLOT(requestPaint())); disconnect(m_model, SIGNAL(hiddenChanged()), this, SLOT(requestPaint()));
disconnect(m_model, SIGNAL(rowHeightChanged(int,int)), this, SLOT(requestPaint())); disconnect(m_model, SIGNAL(expandedRowHeightChanged(int,int)), this, SLOT(requestPaint()));
} }
m_model = model; m_model = model;
if (m_model) { if (m_model) {
connect(m_model, SIGNAL(expandedChanged()), this, SLOT(requestPaint())); connect(m_model, SIGNAL(expandedChanged()), this, SLOT(requestPaint()));
connect(m_model, SIGNAL(hiddenChanged()), this, SLOT(requestPaint())); connect(m_model, SIGNAL(hiddenChanged()), this, SLOT(requestPaint()));
connect(m_model, SIGNAL(rowHeightChanged(int,int)), this, SLOT(requestPaint())); connect(m_model, SIGNAL(expandedRowHeightChanged(int,int)), this, SLOT(requestPaint()));
} }
emit modelChanged(m_model); emit modelChanged(m_model);

View File

@@ -49,7 +49,8 @@ public:
QColor color(int) const { return QColor(); } QColor color(int) const { return QColor(); }
QVariantList labels() const { return QVariantList(); } QVariantList labels() const { return QVariantList(); }
QVariantMap details(int) const { return QVariantMap(); } QVariantMap details(int) const { return QVariantMap(); }
int row(int) const { return 1; } int expandedRow(int) const { return 1; }
int collapsedRow(int) const { return 1; }
quint64 features() const { return 0; } quint64 features() const { return 0; }
protected: protected:
@@ -102,22 +103,21 @@ void tst_TimelineModel::rowHeight()
DummyModel dummy; DummyModel dummy;
QCOMPARE(dummy.rowHeight(0), DefaultRowHeight); QCOMPARE(dummy.rowHeight(0), DefaultRowHeight);
// Cannot set while not expanded dummy.setExpandedRowHeight(0, 100);
dummy.setRowHeight(0, 100);
QCOMPARE(dummy.rowHeight(0), DefaultRowHeight); QCOMPARE(dummy.rowHeight(0), DefaultRowHeight);
dummy.setExpanded(true); dummy.setExpanded(true);
QCOMPARE(dummy.rowHeight(0), DefaultRowHeight); QCOMPARE(dummy.rowHeight(0), 100);
// Cannot set smaller than default // Cannot set smaller than default
dummy.setRowHeight(0, DefaultRowHeight - 1); dummy.setExpandedRowHeight(0, DefaultRowHeight - 1);
QCOMPARE(dummy.rowHeight(0), DefaultRowHeight); QCOMPARE(dummy.rowHeight(0), DefaultRowHeight);
dummy.setRowHeight(0, 100); dummy.setExpandedRowHeight(0, 100);
QCOMPARE(dummy.rowHeight(0), 100); QCOMPARE(dummy.rowHeight(0), 100);
dummy.loadData(); dummy.loadData();
dummy.setRowHeight(1, 50); dummy.setExpandedRowHeight(1, 50);
QCOMPARE(dummy.rowHeight(0), 100); QCOMPARE(dummy.rowHeight(0), 100);
QCOMPARE(dummy.rowHeight(1), 50); QCOMPARE(dummy.rowHeight(1), 50);
@@ -142,11 +142,11 @@ void tst_TimelineModel::rowOffset()
QCOMPARE(dummy.rowOffset(0), 0); QCOMPARE(dummy.rowOffset(0), 0);
QCOMPARE(dummy.rowOffset(1), DefaultRowHeight); QCOMPARE(dummy.rowOffset(1), DefaultRowHeight);
dummy.setRowHeight(0, 100); dummy.setExpandedRowHeight(0, 100);
QCOMPARE(dummy.rowOffset(0), 0); QCOMPARE(dummy.rowOffset(0), 0);
QCOMPARE(dummy.rowOffset(1), 100); QCOMPARE(dummy.rowOffset(1), 100);
dummy.setRowHeight(1, 50); dummy.setExpandedRowHeight(1, 50);
QCOMPARE(dummy.rowOffset(0), 0); QCOMPARE(dummy.rowOffset(0), 0);
QCOMPARE(dummy.rowOffset(1), 100); QCOMPARE(dummy.rowOffset(1), 100);
@@ -169,7 +169,7 @@ void tst_TimelineModel::height()
QCOMPARE(dummy.height(), 2 * DefaultRowHeight); QCOMPARE(dummy.height(), 2 * DefaultRowHeight);
dummy.setExpanded(true); dummy.setExpanded(true);
QCOMPARE(dummy.height(), 2 * DefaultRowHeight); QCOMPARE(dummy.height(), 2 * DefaultRowHeight);
dummy.setRowHeight(0, 80); dummy.setExpandedRowHeight(0, 80);
QCOMPARE(dummy.height(), DefaultRowHeight + 80); QCOMPARE(dummy.height(), DefaultRowHeight + 80);
} }