forked from qt-creator/qt-creator
Debugger: Support nested properties in QML inspector
There are various ways to generate nested arrays and objects in the QML engine debug service. We can easily show them. Task-number: QTBUG-68474 Change-Id: I3511a3f6f7631de4ab6a9d4b13ba9392ba4173dc Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
@@ -381,6 +381,51 @@ void QmlInspectorAgent::newObject(int engineId, int /*objectId*/, int /*parentId
|
|||||||
m_delayQueryTimer.start();
|
m_delayQueryTimer.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void sortChildrenIfNecessary(WatchItem *propertiesWatch)
|
||||||
|
{
|
||||||
|
if (boolSetting(SortStructMembers)) {
|
||||||
|
propertiesWatch->sortChildren([](const WatchItem *item1, const WatchItem *item2) {
|
||||||
|
return item1->name < item2->name;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool insertChildren(WatchItem *parent, const QVariant &value)
|
||||||
|
{
|
||||||
|
switch (value.type()) {
|
||||||
|
case QVariant::Map: {
|
||||||
|
const QVariantMap map = value.toMap();
|
||||||
|
for (auto it = map.begin(), end = map.end(); it != end; ++it) {
|
||||||
|
WatchItem *child = new WatchItem;
|
||||||
|
child->name = it.key();
|
||||||
|
child->value = it.value().toString();
|
||||||
|
child->type = QLatin1String(it.value().typeName());
|
||||||
|
child->valueEditable = false;
|
||||||
|
child->wantsChildren = insertChildren(child, it.value());
|
||||||
|
parent->appendChild(child);
|
||||||
|
}
|
||||||
|
sortChildrenIfNecessary(parent);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
case QVariant::List: {
|
||||||
|
const QVariantList list = value.toList();
|
||||||
|
for (int i = 0, end = list.size(); i != end; ++i) {
|
||||||
|
WatchItem *child = new WatchItem;
|
||||||
|
const QVariant &value = list.at(i);
|
||||||
|
child->arrayIndex = i;
|
||||||
|
child->value = value.toString();
|
||||||
|
child->type = QLatin1String(value.typeName());
|
||||||
|
child->valueEditable = false;
|
||||||
|
child->wantsChildren = insertChildren(child, value);
|
||||||
|
parent->appendChild(child);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void QmlInspectorAgent::onValueChanged(int debugId, const QByteArray &propertyName,
|
void QmlInspectorAgent::onValueChanged(int debugId, const QByteArray &propertyName,
|
||||||
const QVariant &value)
|
const QVariant &value)
|
||||||
{
|
{
|
||||||
@@ -392,6 +437,8 @@ void QmlInspectorAgent::onValueChanged(int debugId, const QByteArray &propertyNa
|
|||||||
<< value.toString();
|
<< value.toString();
|
||||||
if (WatchItem *item = watchHandler->findItem(iname)) {
|
if (WatchItem *item = watchHandler->findItem(iname)) {
|
||||||
item->value = value.toString();
|
item->value = value.toString();
|
||||||
|
item->removeChildren();
|
||||||
|
item->wantsChildren = insertChildren(item, value);
|
||||||
item->update();
|
item->update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -658,16 +705,11 @@ void QmlInspectorAgent::addWatchData(const ObjectReference &obj,
|
|||||||
propertyWatch->exp = propertyName;
|
propertyWatch->exp = propertyName;
|
||||||
propertyWatch->type = property.valueTypeName();
|
propertyWatch->type = property.valueTypeName();
|
||||||
propertyWatch->value = property.value().toString();
|
propertyWatch->value = property.value().toString();
|
||||||
propertyWatch->wantsChildren = false;
|
propertyWatch->wantsChildren = insertChildren(propertyWatch, property.value());
|
||||||
propertiesWatch->appendChild(propertyWatch);
|
propertiesWatch->appendChild(propertyWatch);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (boolSetting(SortStructMembers)) {
|
sortChildrenIfNecessary(propertiesWatch);
|
||||||
propertiesWatch->sortChildren([](const WatchItem *item1, const WatchItem *item2) {
|
|
||||||
return item1->name < item2->name;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
m_qmlEngine->watchHandler()->insertItem(propertiesWatch);
|
m_qmlEngine->watchHandler()->insertItem(propertiesWatch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user