QmlProfiler: Don't hide the "Painting" category

Hiding a category in the timeline view is highly confusing. Previously
the "Painting" category would only be visible if either the model is
empty or at least one painting event was available. Like this it's
always there. In the obscure case of a mixed Qt4/Qt5 application you can
get two "Painting" categories now.

Change-Id: I54db106ed868b7e5d46d0e0ac22b46c0df8be862
Reviewed-by: Kai Koehne <kai.koehne@digia.com>
This commit is contained in:
Ulf Hermann
2014-01-10 16:43:43 +01:00
parent f10eccff3e
commit 834c89329f
2 changed files with 17 additions and 11 deletions

View File

@@ -62,6 +62,7 @@ public:
int minAnimationCount; int minAnimationCount;
int maxAnimationCount; int maxAnimationCount;
bool expanded; bool expanded;
bool seenForeignPaintEvent;
PaintEventsModelProxy *q; PaintEventsModelProxy *q;
}; };
@@ -100,6 +101,7 @@ void PaintEventsModelProxy::clear()
d->minAnimationCount = 1; d->minAnimationCount = 1;
d->maxAnimationCount = 1; d->maxAnimationCount = 1;
d->expanded = false; d->expanded = false;
d->seenForeignPaintEvent = false;
m_modelManager->modelProxyCountUpdated(m_modelId, 0, 1); m_modelManager->modelProxyCountUpdated(m_modelId, 0, 1);
} }
@@ -122,8 +124,11 @@ void PaintEventsModelProxy::loadData()
qint64 minNextStartTime = 0; qint64 minNextStartTime = 0;
foreach (const QmlProfilerSimpleModel::QmlEventData &event, referenceList) { foreach (const QmlProfilerSimpleModel::QmlEventData &event, referenceList) {
if (!eventAccepted(event)) if (!eventAccepted(event)) {
if (event.eventType == QmlDebug::Painting)
d->seenForeignPaintEvent = true;
continue; continue;
}
// initial estimation of the event duration: 1/framerate // initial estimation of the event duration: 1/framerate
qint64 estimatedDuration = event.numericData1 > 0 ? 1e9/event.numericData1 : 1; qint64 estimatedDuration = event.numericData1 > 0 ? 1e9/event.numericData1 : 1;
@@ -190,7 +195,7 @@ int PaintEventsModelProxy::categoryDepth(int categoryIndex) const
{ {
Q_UNUSED(categoryIndex); Q_UNUSED(categoryIndex);
if (isEmpty()) if (isEmpty())
return 0; return d->seenForeignPaintEvent ? 0 : 1;
else else
return 2; return 2;
} }

View File

@@ -49,7 +49,6 @@ struct CategorySpan {
int expandedRows; int expandedRows;
int contractedRows; int contractedRows;
int rowStart; int rowStart;
bool empty;
}; };
class BasicTimelineModel::BasicTimelineModelPrivate : public SortedTimelineModel<BasicTimelineModel::QmlRangeEventStartInstance> class BasicTimelineModel::BasicTimelineModelPrivate : public SortedTimelineModel<BasicTimelineModel::QmlRangeEventStartInstance>
@@ -70,6 +69,7 @@ public:
QVector <BasicTimelineModel::QmlRangeEventData> eventDict; QVector <BasicTimelineModel::QmlRangeEventData> eventDict;
QVector <QString> eventHashes; QVector <QString> eventHashes;
QVector <CategorySpan> categorySpan; QVector <CategorySpan> categorySpan;
bool seenPaintEvent;
BasicTimelineModel *q; BasicTimelineModel *q;
}; };
@@ -108,6 +108,7 @@ void BasicTimelineModel::clear()
d->eventDict.clear(); d->eventDict.clear();
d->eventHashes.clear(); d->eventHashes.clear();
d->categorySpan.clear(); d->categorySpan.clear();
d->seenPaintEvent = false;
m_modelManager->modelProxyCountUpdated(m_modelId, 0, 1); m_modelManager->modelProxyCountUpdated(m_modelId, 0, 1);
} }
@@ -116,7 +117,7 @@ void BasicTimelineModel::BasicTimelineModelPrivate::prepare()
{ {
categorySpan.clear(); categorySpan.clear();
for (int i = 0; i < QmlDebug::MaximumQmlEventType; i++) { for (int i = 0; i < QmlDebug::MaximumQmlEventType; i++) {
CategorySpan newCategory = {false, 1, 1, i, true}; CategorySpan newCategory = {false, 1, 1, i};
categorySpan << newCategory; categorySpan << newCategory;
} }
} }
@@ -125,7 +126,7 @@ bool BasicTimelineModel::eventAccepted(const QmlProfilerSimpleModel::QmlEventDat
{ {
// only accept Qt4.x Painting events // only accept Qt4.x Painting events
if (event.eventType == QmlDebug::Painting) if (event.eventType == QmlDebug::Painting)
return event.bindingType == QmlDebug::QPainterEvent; return (event.bindingType == QmlDebug::QPainterEvent);
return (event.eventType <= QmlDebug::HandlingSignal); return (event.eventType <= QmlDebug::HandlingSignal);
} }
@@ -146,6 +147,8 @@ void BasicTimelineModel::loadData()
foreach (const QmlProfilerSimpleModel::QmlEventData &event, eventList) { foreach (const QmlProfilerSimpleModel::QmlEventData &event, eventList) {
if (!eventAccepted(event)) if (!eventAccepted(event))
continue; continue;
if (event.eventType == QmlDebug::Painting)
d->seenPaintEvent = true;
QString eventHash = QmlProfilerSimpleModel::getHashString(event); QString eventHash = QmlProfilerSimpleModel::getHashString(event);
@@ -231,7 +234,6 @@ void BasicTimelineModel::BasicTimelineModelPrivate::computeNestingContracted()
// nestingdepth // nestingdepth
for (i = 0; i < eventCount; i++) { for (i = 0; i < eventCount; i++) {
int eventType = q->getEventType(i); int eventType = q->getEventType(i);
categorySpan[eventType].empty = false;
if (categorySpan[eventType].contractedRows <= ranges[i].displayRowCollapsed) if (categorySpan[eventType].contractedRows <= ranges[i].displayRowCollapsed)
categorySpan[eventType].contractedRows = ranges[i].displayRowCollapsed + 1; categorySpan[eventType].contractedRows = ranges[i].displayRowCollapsed + 1;
} }
@@ -245,7 +247,6 @@ void BasicTimelineModel::BasicTimelineModelPrivate::computeExpandedLevels()
int eventId = ranges[i].eventId; int eventId = ranges[i].eventId;
int eventType = eventDict[eventId].eventType; int eventType = eventDict[eventId].eventType;
if (!eventRow.contains(eventId)) { if (!eventRow.contains(eventId)) {
categorySpan[eventType].empty = false;
eventRow[eventId] = categorySpan[eventType].expandedRows++; eventRow[eventId] = categorySpan[eventType].expandedRows++;
} }
ranges[i].displayRowExpanded = eventRow[eventId]; ranges[i].displayRowExpanded = eventRow[eventId];
@@ -340,11 +341,11 @@ void BasicTimelineModel::setExpanded(int category, bool expanded)
int BasicTimelineModel::categoryDepth(int categoryIndex) const int BasicTimelineModel::categoryDepth(int categoryIndex) const
{ {
// special for paint events: show only when empty model or there's actual events
if (categoryIndex == QmlDebug::Painting && !d->seenPaintEvent)
return 0;
if (d->categorySpan.count() <= categoryIndex) if (d->categorySpan.count() <= categoryIndex)
return 1; return 1;
// special for paint events: show only when empty model or there's actual events
if (categoryIndex == QmlDebug::Painting && d->categorySpan[categoryIndex].empty && !isEmpty())
return 0;
if (d->categorySpan[categoryIndex].expanded) if (d->categorySpan[categoryIndex].expanded)
return d->categorySpan[categoryIndex].expandedRows; return d->categorySpan[categoryIndex].expandedRows;
else else
@@ -393,7 +394,7 @@ int BasicTimelineModel::getEventCategory(int index) const
{ {
int evTy = getEventType(index); int evTy = getEventType(index);
// special: paint events shown? // special: paint events shown?
if (d->categorySpan[0].empty && !isEmpty()) if (!d->seenPaintEvent)
return evTy - 1; return evTy - 1;
return evTy; return evTy;
} }