1 #include "argumentseditor.h"
4 #include <QDoubleSpinBox>
5 #include <QItemEditorFactory>
11 #include "apitracecall.h"
13 ArgumentsEditor::ArgumentsEditor(QWidget *parent)
15 m_model(new QStandardItemModel()),
21 ArgumentsEditor::~ArgumentsEditor()
25 void ArgumentsEditor::setCall(ApiTraceCall *call)
33 ApiTraceCall * ArgumentsEditor::call() const
38 void ArgumentsEditor::init()
42 m_ui.argsTree->setModel(m_model);
43 QItemEditorFactory *factory =
44 new ArgumentsItemEditorFactory();
46 QItemEditorFactory::setDefaultFactory(factory);
49 void ArgumentsEditor::setupCall()
54 headers.append(tr("Argument"));
55 headers.append(tr("Value"));
56 m_model->setColumnCount(2);
57 m_model->setHorizontalHeaderLabels(headers);
58 m_ui.argsTabWidget->removeTab(
59 m_ui.argsTabWidget->indexOf(m_ui.shaderTab));
64 m_ui.callLabel->setText(m_call->name);
65 QStandardItem *rootItem = m_model->invisibleRootItem();
66 for (int i = 0; i < m_call->argNames.count(); ++i) {
67 QString argName = m_call->argNames[i];
68 QVariant val = m_call->argValues[i];
69 QStandardItem *nameItem = new QStandardItem(argName);
70 nameItem->setFlags(nameItem->flags() ^ Qt::ItemIsEditable);
71 QList<QStandardItem*> topRow;
72 topRow.append(nameItem);
73 qDebug()<<"arg "<<argName<<", val = "<<val;
75 if (val.canConvert<ApiArray>()) {
76 ApiArray array = val.value<ApiArray>();
77 QList<QVariant> vals = array.values();
78 QVariant firstVal = vals.value(0);
80 if (firstVal.userType() == QVariant::String) {
81 m_ui.argsTabWidget->addTab(
82 m_ui.shaderTab, argName);
83 setupShaderEditor(vals);
87 for (int i = 0; i < vals.count(); ++i) {
88 QList<QStandardItem*> row;
90 QStandardItem *idx = new QStandardItem();
91 idx->setFlags(idx->flags() ^ Qt::ItemIsEditable);
92 idx->setText(tr("%1)").arg(i));
94 QStandardItem *col = new QStandardItem();
95 col->setFlags(col->flags() | Qt::ItemIsEditable);
96 col->setData(vals[i], Qt::DisplayRole);
99 nameItem->appendRow(row);
102 qDebug()<<"\tarray first = "<<vals[0];
103 } else if (val.canConvert<ApiPointer>()) {
104 ApiPointer ptr = val.value<ApiPointer>();
105 QStandardItem *item = new QStandardItem();
106 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
107 item->setText(ptr.toString());
108 QIcon icon(":/resources/emblem-locked.png");
110 item->setToolTip(tr("Argument is read-only"));
112 } else if (val.canConvert<ApiBitmask>()) {
113 ApiBitmask mask = val.value<ApiBitmask>();
114 QStandardItem *item = new QStandardItem();
115 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
116 item->setText(mask.toString());
117 QIcon icon(":/resources/emblem-locked.png");
119 item->setToolTip(tr("Argument is read-only"));
121 } else if (val.canConvert<ApiStruct>()) {
122 ApiStruct str = val.value<ApiStruct>();
123 QStandardItem *item = new QStandardItem();
124 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
125 item->setText(str.toString());
126 QIcon icon(":/resources/emblem-locked.png");
128 item->setToolTip(tr("Argument is read-only"));
130 } else if (val.userType() == QVariant::ByteArray) {
131 QByteArray ba = val.value<QByteArray>();
132 QStandardItem *item = new QStandardItem();
133 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
135 tr("<binary data, size = %1 bytes>").arg(ba.size()));
136 QIcon icon(":/resources/emblem-locked.png");
138 item->setToolTip(tr("Argument is read-only"));
142 = new QStandardItem();
143 item->setFlags(item->flags() | Qt::ItemIsEditable);
144 item->setData(val, Qt::DisplayRole);
147 rootItem->appendRow(topRow);
151 void ArgumentsEditor::setupShaderEditor(const QList<QVariant> &sources)
155 ArgumentsItemEditorFactory::ArgumentsItemEditorFactory()
156 : QItemEditorFactory()
160 QWidget * ArgumentsItemEditorFactory::createEditor(QVariant::Type type,
161 QWidget *parent) const
164 case QVariant::Bool: {
165 BooleanComboBox *cb = new BooleanComboBox(parent);
169 case QVariant::UInt: {
170 QSpinBox *sb = new QSpinBox(parent);
172 sb->setMaximum(INT_MAX);
174 case QVariant::Int: {
175 QSpinBox *sb = new QSpinBox(parent);
177 sb->setMinimum(INT_MIN);
178 sb->setMaximum(INT_MAX);
181 case QVariant::ULongLong: {
182 QSpinBox *sb = new QSpinBox(parent);
184 sb->setMaximum(INT_MAX);
186 case QVariant::LongLong: {
187 QSpinBox *sb = new QSpinBox(parent);
189 sb->setMinimum(INT_MIN);
190 sb->setMaximum(INT_MAX);
193 case QVariant::Pixmap:
194 return new QLabel(parent);
195 case QVariant::Double: {
196 QDoubleSpinBox *sb = new QDoubleSpinBox(parent);
198 sb->setMinimum(-DBL_MAX);
199 sb->setMaximum(DBL_MAX);
210 ArgumentsItemEditorFactory::valuePropertyName(QVariant::Type type) const
214 return "currentIndex";
217 case QVariant::LongLong:
218 case QVariant::ULongLong:
219 case QVariant::Double:
222 case QVariant::String:
229 BooleanComboBox::BooleanComboBox(QWidget *parent)
232 addItem(tr("False"));
236 void BooleanComboBox::setValue(bool value)
238 setCurrentIndex(value ? 1 : 0);
241 bool BooleanComboBox::value() const
243 return (currentIndex() == 1);
246 #include "argumentseditor.moc"