forked from qt-creator/qt-creator
Debugger: Add a QStandardItem dumper
Change-Id: I503b17e1f36158a774dcf096b19ba628f0cc0205 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -215,8 +215,7 @@ class Children:
|
||||
return True
|
||||
|
||||
class PairedChildrenData:
|
||||
def __init__(self, d, pairType, keyType, valueType):
|
||||
self.pairType = pairType
|
||||
def __init__(self, d, keyType, valueType):
|
||||
self.keyType = keyType
|
||||
self.valueType = valueType
|
||||
|
||||
@@ -233,7 +232,7 @@ class PairedChildren(Children):
|
||||
keyType = pairType[0].unqualified()
|
||||
if valueType is None:
|
||||
valueType = pairType[1]
|
||||
d.pairData = PairedChildrenData(d, pairType, keyType, valueType)
|
||||
d.pairData = PairedChildrenData(d, keyType, valueType)
|
||||
d.pairData.kname = 'key' if useKeyAndValue else 'first'
|
||||
d.pairData.vname = 'value' if useKeyAndValue else 'second'
|
||||
|
||||
@@ -810,17 +809,21 @@ class DumperBase:
|
||||
self.putNumChild(0)
|
||||
|
||||
def putPairItem(self, index, pair):
|
||||
(first, second) = pair if isinstance(pair, tuple) else pair.members(False)
|
||||
with SubItem(self, index):
|
||||
with Children(self):
|
||||
key = self.putSubItem(self.pairData.kname, first)
|
||||
value = self.putSubItem(self.pairData.vname, second)
|
||||
if index is not None:
|
||||
self.putField('keyprefix', '[%s] ' % index)
|
||||
self.putField('key', key.value)
|
||||
if key.encoding is not None:
|
||||
self.putField('keyencoded', key.encoding)
|
||||
self.putValue(value.value, value.encoding)
|
||||
self.putPairContents(index, pair,
|
||||
self.pairData.kname, self.pairData.vname)
|
||||
|
||||
def putPairContents(self, index, pair, kname, vname):
|
||||
with Children(self):
|
||||
first, second = pair if isinstance(pair, tuple) else pair.members(False)
|
||||
key = self.putSubItem(kname, first)
|
||||
value = self.putSubItem(vname, second)
|
||||
if index is not None:
|
||||
self.putField('keyprefix', '[%s] ' % index)
|
||||
self.putField('key', key.value)
|
||||
if key.encoding is not None:
|
||||
self.putField('keyencoded', key.encoding)
|
||||
self.putValue(value.value, value.encoding)
|
||||
|
||||
def putCallItem(self, name, rettype, value, func, *args):
|
||||
with SubItem(self, name):
|
||||
|
||||
@@ -190,6 +190,21 @@ def qdump_X_QModelIndex(d, value):
|
||||
d.putCallItem('parent', '@QModelIndex', value, 'parent')
|
||||
#gdb.execute('call free($mi)')
|
||||
|
||||
def qdump__QStandardItemData(d, value):
|
||||
role, pad, val = value.split('{@Qt::ItemDataRole}@{QVariant}')
|
||||
d.putPairContents(role.value(), (role, val), 'role', 'value')
|
||||
|
||||
def qdump__QStandardItem(d, value):
|
||||
vtable, dptr = value.split('pp')
|
||||
vtable1, model, parent, values, children, rows, cols, item = d.split('pppPPIIp', dptr)
|
||||
d.putValue(' ')
|
||||
d.putNumChild(1)
|
||||
if d.isExpanded():
|
||||
with Children(d):
|
||||
d.putSubItem('[model]', d.createValue(model, '@QStandardItemModel'))
|
||||
d.putSubItem('[values]', d.createVectorItem(values, 'QStandardItemData'))
|
||||
d.putSubItem('[children]', d.createVectorItem(children, '@QStandardItem*'))
|
||||
|
||||
|
||||
def qdump__QDate(d, value):
|
||||
jd = value.pointer()
|
||||
@@ -1232,14 +1247,6 @@ def qdump__QGraphicsPolygonItem(d, value):
|
||||
d.putItemCount(size)
|
||||
d.putPlotData(data, size, d.createType('QPointF'))
|
||||
|
||||
def qdump__QStandardItem(d, value):
|
||||
d.putBetterType(d.currentType)
|
||||
try:
|
||||
d.putItem(value['d_ptr'])
|
||||
except:
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
def qedit__QString(d, value, data):
|
||||
d.call('void', value, 'resize', str(len(data)))
|
||||
(base, size, alloc) = d.stringData(value)
|
||||
|
||||
@@ -6335,6 +6335,20 @@ void tst_Dumpers::dumper_data()
|
||||
+ Check("v15", "\"utf16\"", "@QJSValue (QString)")
|
||||
+ Check("v15.1", "[1]", "116", "@QChar");
|
||||
|
||||
|
||||
QTest::newRow("QStandardItem")
|
||||
<< Data("#include <QStandardItemModel>",
|
||||
"QStandardItemModel m;\n"
|
||||
"QStandardItem *root = m.invisibleRootItem();\n"
|
||||
"for (int i = 0; i < 4; ++i) {\n"
|
||||
" QStandardItem *item = new QStandardItem(QString(\"item %1\").arg(i));\n"
|
||||
" item->setData(123);\n"
|
||||
" root->appendRow(item);\n"
|
||||
"}\n")
|
||||
+ GuiProfile()
|
||||
+ Check("root.[children].0.[values].0.value", "\"item 0\"", "@QVariant (@QString)");
|
||||
|
||||
|
||||
QTest::newRow("Internal1")
|
||||
<< Data("struct QtcDumperTest_FieldAccessByIndex { int d[3] = { 10, 11, 12 }; };\n",
|
||||
"QtcDumperTest_FieldAccessByIndex d; unused(&d);\n")
|
||||
|
||||
Reference in New Issue
Block a user