Skip to content

Commit

Permalink
Also show alive instances in the meta object browser
Browse files Browse the repository at this point in the history
  • Loading branch information
vkrause committed Oct 7, 2016
1 parent 74c903e commit 2bc0ab6
Show file tree
Hide file tree
Showing 6 changed files with 69 additions and 23 deletions.
2 changes: 2 additions & 0 deletions common/tools/metaobjectbrowser/qmetaobjectmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ namespace QMetaObjectModel
ObjectColumn,
ObjectSelfCountColumn,
ObjectInclusiveCountColumn,
ObjectSelfAliveCountColumn,
ObjectInclusiveAliveCountColumn,
_Last
};
}
Expand Down
37 changes: 25 additions & 12 deletions core/metaobjecttreemodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,14 @@ QVariant MetaObjectTreeModel::data(const QModelIndex &index, int role) const
if (inheritsQObject(object))
return m_metaObjectInfoMap.value(object).inclusiveCount;
return QStringLiteral("-");
case QMetaObjectModel::ObjectSelfAliveCountColumn:
if (inheritsQObject(object))
return m_metaObjectInfoMap.value(object).selfAliveCount;
return QStringLiteral("-");
case QMetaObjectModel::ObjectInclusiveAliveCountColumn:
if (inheritsQObject(object))
return m_metaObjectInfoMap.value(object).inclusiveAliveCount;
return QStringLiteral("-");
default:
break;
}
Expand Down Expand Up @@ -218,12 +226,17 @@ void MetaObjectTreeModel::objectAdded(QObject *obj)
* If this yields some performance issues, we might need to remove the inclusive
* costs calculation altogether (a calculate-on-request pattern should be even slower)
*/
++m_metaObjectInfoMap[metaObject].selfCount;
m_metaObjectMap.insert(obj, metaObject);
auto &info = m_metaObjectInfoMap[metaObject];
++info.selfCount;
++info.selfAliveCount;

// increase inclusive counts
const QMetaObject *current = metaObject;
while (current) {
++m_metaObjectInfoMap[current].inclusiveCount;
auto &info = m_metaObjectInfoMap[current];
++info.inclusiveCount;
++info.inclusiveAliveCount;
scheduleDataChange(current);
current = current->superClass();
}
Expand Down Expand Up @@ -276,37 +289,37 @@ void MetaObjectTreeModel::removeMetaObject(const QMetaObject *metaObject)
void MetaObjectTreeModel::objectRemoved(QObject *obj)
{
Q_ASSERT(thread() == QThread::currentThread());
Q_UNUSED(obj);
return;
// TODO

// decrease counter
const QMetaObject *metaObject = obj->metaObject();
const QMetaObject *metaObject = m_metaObjectMap.take(obj);
if (!metaObject)
return;

const QModelIndex metaModelIndex = indexForMetaObject(metaObject);
if (!metaModelIndex.isValid()) {
// something went wrong, ignore
return;
}

assert(m_metaObjectInfoMap.contains(metaObject));
if (m_metaObjectInfoMap[metaObject].selfCount == 0) {
if (m_metaObjectInfoMap[metaObject].selfAliveCount == 0) {
// something went wrong, but let's just ignore this event in case of assert
return;
}

--m_metaObjectInfoMap[metaObject].selfCount;
assert(m_metaObjectInfoMap[metaObject].selfCount >= 0);
--m_metaObjectInfoMap[metaObject].selfAliveCount;
assert(m_metaObjectInfoMap[metaObject].selfAliveCount >= 0);

// decrease inclusive counts
const QMetaObject *current = metaObject;
while (current) {
--m_metaObjectInfoMap[current].inclusiveCount;
assert(m_metaObjectInfoMap[current].inclusiveCount >= 0);
--m_metaObjectInfoMap[current].inclusiveAliveCount;
assert(m_metaObjectInfoMap[current].inclusiveAliveCount >= 0);
scheduleDataChange(current);
current = current->superClass();
}

emit dataChanged(metaModelIndex, metaModelIndex);
scheduleDataChange(metaObject);
}

bool MetaObjectTreeModel::isKnownMetaObject(const QMetaObject *metaObject) const
Expand Down
15 changes: 12 additions & 3 deletions core/metaobjecttreemodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,17 +89,26 @@ private slots:
{
MetaObjectInfo()
: selfCount(0)
, inclusiveCount(0) {}
, selfAliveCount(0)
, inclusiveCount(0)
, inclusiveAliveCount(0) {}

/// Number of objects of a particular meta object type
/// Number of objects of a particular meta object type ever created
int selfCount;
/// Number of instances of a meta object currently alive
int selfAliveCount;
/**
* Number of objects of the exact meta object type
* + number of objects of type that inherit from this meta type
*/
int inclusiveCount;
/// Inclusive instance count currently alive
int inclusiveAliveCount;
};
QHash<const QMetaObject *, MetaObjectInfo> m_metaObjectInfoMap;
QHash<const QMetaObject*, MetaObjectInfo> m_metaObjectInfoMap;
/// meta objects at creation time, so we can correctly decrement instance counts
/// after destruction
QHash<QObject*, const QMetaObject*> m_metaObjectMap;

QSet<const QMetaObject *> m_pendingDataChanged;
QTimer *m_pendingDataChangedTimer;
Expand Down
2 changes: 2 additions & 0 deletions ui/tools/metaobjectbrowser/metaobjectbrowserwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@ MetaObjectBrowserWidget::MetaObjectBrowserWidget(QWidget *parent)
m_treeView->setDeferredResizeMode(0, QHeaderView::Stretch);
m_treeView->setDeferredResizeMode(1, QHeaderView::ResizeToContents);
m_treeView->setDeferredResizeMode(2, QHeaderView::ResizeToContents);
m_treeView->setDeferredResizeMode(3, QHeaderView::ResizeToContents);
m_treeView->setDeferredResizeMode(4, QHeaderView::ResizeToContents);
m_treeView->setUniformRowHeights(true);
m_treeView->setModel(proxy);
m_treeView->setSelectionModel(ObjectBroker::selectionModel(proxy));
Expand Down
34 changes: 26 additions & 8 deletions ui/tools/metaobjectbrowser/metaobjecttreeclientproxymodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,16 +107,16 @@ QVariant MetaObjectTreeClientProxyModel::data(const QModelIndex &index, int role
if ((role != Qt::BackgroundRole && role != Qt::ToolTipRole) || !m_qobjIndex.isValid())
return QIdentityProxyModel::data(index, role);

if (!index.parent().isValid()
&& (index.row() != m_qobjIndex.row()
|| (index.row() == m_qobjIndex.row() && index.column() == 2)))
if (!needsBackground(index))
return QIdentityProxyModel::data(index, role); // top-level but not QObject, or QObject incl count

const auto count = index.data(Qt::DisplayRole).toInt();
if (count <= 0)
return QIdentityProxyModel::data(index, role);

const auto totalCount = m_qobjIndex.sibling(m_qobjIndex.row(), 2).data().toInt();
const auto totalColumn = (index.column() == QMetaObjectModel::ObjectSelfCountColumn || index.column() == QMetaObjectModel::ObjectInclusiveCountColumn)?
QMetaObjectModel::ObjectInclusiveCountColumn : QMetaObjectModel::ObjectInclusiveAliveCountColumn;
const auto totalCount = m_qobjIndex.sibling(m_qobjIndex.row(), totalColumn).data().toInt();
const auto ratio = (double)count / (double)totalCount;

// at this point, role can only be background or tooltip
Expand All @@ -135,9 +135,13 @@ QVariant MetaObjectTreeClientProxyModel::headerData(int section, Qt::Orientation
case QMetaObjectModel::ObjectColumn:
return tr("Meta Object Class");
case QMetaObjectModel::ObjectSelfCountColumn:
return tr("Self");
return tr("Self Total");
case QMetaObjectModel::ObjectInclusiveCountColumn:
return tr("Incl.");
return tr("Incl. Total");
case QMetaObjectModel::ObjectSelfAliveCountColumn:
return tr("Self Alive");
case QMetaObjectModel::ObjectInclusiveAliveCountColumn:
return tr("Incl. Alive");
default:
return QVariant();
}
Expand All @@ -148,8 +152,11 @@ QVariant MetaObjectTreeClientProxyModel::headerData(int section, Qt::Orientation
case QMetaObjectModel::ObjectSelfCountColumn:
return tr("This column shows the number of objects created of a particular type.");
case QMetaObjectModel::ObjectInclusiveCountColumn:
return tr(
"This column shows the number of objects created that inherit from a particular type.");
return tr("This column shows the number of objects created that inherit from a particular type.");
case QMetaObjectModel::ObjectSelfAliveCountColumn:
return tr("This column shows the number of objects created and not yet destroyed of a particular type.");
case QMetaObjectModel::ObjectInclusiveAliveCountColumn:
return tr("This column shows the number of objects created and not yet destroyed that inherit from a particular type.");
default:
return QVariant();
}
Expand All @@ -173,3 +180,14 @@ void MetaObjectTreeClientProxyModel::findQObjectIndex()
disconnect(sourceModel(), SIGNAL(dataChanged(QModelIndex,QModelIndex)), this,
SLOT(findQObjectIndex()));
}

bool MetaObjectTreeClientProxyModel::needsBackground(const QModelIndex &index) const
{
if (index.parent().isValid())
return true;
if (index.row() != m_qobjIndex.row())
return true;
if (index.column() == QMetaObjectModel::ObjectInclusiveCountColumn || index.column() == QMetaObjectModel::ObjectInclusiveAliveCountColumn)
return false;
return true;
}
2 changes: 2 additions & 0 deletions ui/tools/metaobjectbrowser/metaobjecttreeclientproxymodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ private slots:
void findQObjectIndex();

private:
bool needsBackground(const QModelIndex &index) const;

QPersistentModelIndex m_qobjIndex;
};
}
Expand Down

0 comments on commit 2bc0ab6

Please sign in to comment.