1 #include "argumentseditor.h"
3 #include "apitracecall.h"
6 #include <QDoubleSpinBox>
7 #include <QItemEditorFactory>
15 isVariantEditable(const QVariant &var)
17 switch (var.userType()) {
21 case QVariant::LongLong:
22 case QVariant::ULongLong:
23 case QVariant::Double:
31 ArgumentsItemEditorFactory::ArgumentsItemEditorFactory()
32 : QItemEditorFactory()
36 QWidget * ArgumentsItemEditorFactory::createEditor(QVariant::Type type,
37 QWidget *parent) const
40 case QVariant::Bool: {
41 BooleanComboBox *cb = new BooleanComboBox(parent);
45 case QVariant::UInt: {
46 QSpinBox *sb = new QSpinBox(parent);
48 sb->setMaximum(INT_MAX);
51 QSpinBox *sb = new QSpinBox(parent);
53 sb->setMinimum(INT_MIN);
54 sb->setMaximum(INT_MAX);
57 case QVariant::ULongLong: {
58 QSpinBox *sb = new QSpinBox(parent);
60 sb->setMaximum(INT_MAX);
62 case QVariant::LongLong: {
63 QSpinBox *sb = new QSpinBox(parent);
65 sb->setMinimum(INT_MIN);
66 sb->setMaximum(INT_MAX);
69 case QVariant::Pixmap:
70 return new QLabel(parent);
71 case QVariant::Double: {
72 QDoubleSpinBox *sb = new QDoubleSpinBox(parent);
74 sb->setMinimum(-DBL_MAX);
75 sb->setMaximum(DBL_MAX);
86 ArgumentsItemEditorFactory::valuePropertyName(QVariant::Type type) const
90 return "currentIndex";
93 case QVariant::LongLong:
94 case QVariant::ULongLong:
95 case QVariant::Double:
98 case QVariant::String:
105 BooleanComboBox::BooleanComboBox(QWidget *parent)
108 addItem(tr("False"));
112 void BooleanComboBox::setValue(bool value)
114 setCurrentIndex(value ? 1 : 0);
117 bool BooleanComboBox::value() const
119 return (currentIndex() == 1);
122 ArgumentsEditor::ArgumentsEditor(QWidget *parent)
124 m_model(new QStandardItemModel()),
130 ArgumentsEditor::~ArgumentsEditor()
134 void ArgumentsEditor::setCall(ApiTraceCall *call)
136 if (m_call != call) {
142 ApiTraceCall * ArgumentsEditor::call() const
147 void ArgumentsEditor::init()
151 connect(m_ui.selectStringCB, SIGNAL(currentIndexChanged(int)),
152 SLOT(currentSourceChanged(int)));
153 connect(m_ui.glslEdit, SIGNAL(textChanged()),
154 SLOT(sourceChanged()));
156 m_ui.argsTree->setModel(m_model);
157 QItemEditorFactory *factory =
158 new ArgumentsItemEditorFactory();
160 QItemEditorFactory::setDefaultFactory(factory);
163 void ArgumentsEditor::setupCall()
168 headers.append(tr("Argument"));
169 headers.append(tr("Value"));
170 m_model->setColumnCount(2);
171 m_model->setHorizontalHeaderLabels(headers);
172 m_ui.argsTabWidget->removeTab(
173 m_ui.argsTabWidget->indexOf(m_ui.shaderTab));
178 m_ui.callLabel->setText(m_call->name);
179 QStandardItem *rootItem = m_model->invisibleRootItem();
180 for (int i = 0; i < m_call->argNames.count(); ++i) {
181 QString argName = m_call->argNames[i];
182 QVariant val = m_call->argValues[i];
183 QStandardItem *nameItem = new QStandardItem(argName);
184 nameItem->setFlags(nameItem->flags() ^ Qt::ItemIsEditable);
185 QList<QStandardItem*> topRow;
186 topRow.append(nameItem);
187 qDebug()<<"arg "<<argName<<", val = "<<val;
189 if (val.canConvert<ApiArray>()) {
190 ApiArray array = val.value<ApiArray>();
191 QList<QVariant> vals = array.values();
193 QVariant firstVal = vals.value(0);
194 if (firstVal.userType() == QVariant::String) {
195 m_ui.argsTabWidget->addTab(
196 m_ui.shaderTab, argName);
197 setupShaderEditor(vals);
200 } else if (isVariantEditable(firstVal)) {
201 for (int i = 0; i < vals.count(); ++i) {
202 QList<QStandardItem*> row;
204 QStandardItem *idx = new QStandardItem();
205 idx->setFlags(idx->flags() ^ Qt::ItemIsEditable);
206 idx->setText(tr("%1)").arg(i));
208 QStandardItem *col = new QStandardItem();
209 col->setFlags(col->flags() | Qt::ItemIsEditable);
210 col->setData(vals[i], Qt::DisplayRole);
213 nameItem->appendRow(row);
216 qDebug()<<"\tUnsupported array = "<<firstVal;
220 } else if (val.canConvert<ApiPointer>()) {
221 ApiPointer ptr = val.value<ApiPointer>();
222 QStandardItem *item = new QStandardItem();
223 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
224 item->setText(ptr.toString());
225 QIcon icon(":/resources/emblem-locked.png");
227 item->setToolTip(tr("Argument is read-only"));
229 } else if (val.canConvert<ApiBitmask>()) {
230 ApiBitmask mask = val.value<ApiBitmask>();
231 QStandardItem *item = new QStandardItem();
232 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
233 item->setText(mask.toString());
234 QIcon icon(":/resources/emblem-locked.png");
236 item->setToolTip(tr("Argument is read-only"));
238 } else if (val.canConvert<ApiStruct>()) {
239 ApiStruct str = val.value<ApiStruct>();
240 QStandardItem *item = new QStandardItem();
241 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
242 item->setText(str.toString());
243 QIcon icon(":/resources/emblem-locked.png");
245 item->setToolTip(tr("Argument is read-only"));
247 } else if (val.userType() == QVariant::ByteArray) {
248 QByteArray ba = val.value<QByteArray>();
249 QStandardItem *item = new QStandardItem();
250 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
252 tr("<binary data, size = %1 bytes>").arg(ba.size()));
253 QIcon icon(":/resources/emblem-locked.png");
255 item->setToolTip(tr("Argument is read-only"));
259 = new QStandardItem();
261 if (isVariantEditable(val)) {
262 item->setFlags(item->flags() | Qt::ItemIsEditable);
264 QIcon icon(":/resources/emblem-locked.png");
266 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
267 item->setToolTip(tr("Argument is read-only"));
269 item->setData(val, Qt::DisplayRole);
272 rootItem->appendRow(topRow);
276 void ArgumentsEditor::setupShaderEditor(const QList<QVariant> &sources)
278 m_ui.selectStringCB->clear();
279 m_ui.glslEdit->clear();
280 for (int i = 0; i < sources.count(); ++i) {
281 m_ui.selectStringCB->addItem(
282 tr("Shader string: %1").arg(i),
285 m_ui.selectStringCB->setCurrentIndex(0);
288 void ArgumentsEditor::currentSourceChanged(int idx)
290 QVariant source = m_ui.selectStringCB->itemData(idx);
291 QString str = source.toString();
292 m_ui.glslEdit->setPlainText(source.toString());
293 m_ui.lengthLabel->setText(
294 tr("%1").arg(str.length()));
297 void ArgumentsEditor::sourceChanged()
299 QString str = m_ui.glslEdit->toPlainText();
300 m_ui.lengthLabel->setText(
301 tr("%1").arg(str.length()));
304 #include "argumentseditor.moc"