1 #include "argumentseditor.h"
4 #include <QDoubleSpinBox>
5 #include <QItemEditorFactory>
11 #include "apitracecall.h"
15 isVariantEditable(const QVariant &var)
17 switch (var.userType()) {
21 case QVariant::LongLong:
22 case QVariant::ULongLong:
23 case QVariant::Double:
30 ArgumentsEditor::ArgumentsEditor(QWidget *parent)
32 m_model(new QStandardItemModel()),
38 ArgumentsEditor::~ArgumentsEditor()
42 void ArgumentsEditor::setCall(ApiTraceCall *call)
50 ApiTraceCall * ArgumentsEditor::call() const
55 void ArgumentsEditor::init()
59 m_ui.argsTree->setModel(m_model);
60 QItemEditorFactory *factory =
61 new ArgumentsItemEditorFactory();
63 QItemEditorFactory::setDefaultFactory(factory);
66 void ArgumentsEditor::setupCall()
71 headers.append(tr("Argument"));
72 headers.append(tr("Value"));
73 m_model->setColumnCount(2);
74 m_model->setHorizontalHeaderLabels(headers);
75 m_ui.argsTabWidget->removeTab(
76 m_ui.argsTabWidget->indexOf(m_ui.shaderTab));
81 m_ui.callLabel->setText(m_call->name);
82 QStandardItem *rootItem = m_model->invisibleRootItem();
83 for (int i = 0; i < m_call->argNames.count(); ++i) {
84 QString argName = m_call->argNames[i];
85 QVariant val = m_call->argValues[i];
86 QStandardItem *nameItem = new QStandardItem(argName);
87 nameItem->setFlags(nameItem->flags() ^ Qt::ItemIsEditable);
88 QList<QStandardItem*> topRow;
89 topRow.append(nameItem);
90 qDebug()<<"arg "<<argName<<", val = "<<val;
92 if (val.canConvert<ApiArray>()) {
93 ApiArray array = val.value<ApiArray>();
94 QList<QVariant> vals = array.values();
95 QVariant firstVal = vals.value(0);
98 x.convert(QVariant::String);
99 qDebug()<<"aaaaa = "<<x;
100 if (firstVal.userType() == QVariant::String) {
101 m_ui.argsTabWidget->addTab(
102 m_ui.shaderTab, argName);
103 setupShaderEditor(vals);
107 for (int i = 0; i < vals.count(); ++i) {
108 QList<QStandardItem*> row;
110 QStandardItem *idx = new QStandardItem();
111 idx->setFlags(idx->flags() ^ Qt::ItemIsEditable);
112 idx->setText(tr("%1)").arg(i));
114 QStandardItem *col = new QStandardItem();
115 col->setFlags(col->flags() | Qt::ItemIsEditable);
116 col->setData(vals[i], Qt::DisplayRole);
119 nameItem->appendRow(row);
122 qDebug()<<"\tarray first = "<<vals[0];
123 } else if (val.canConvert<ApiPointer>()) {
124 ApiPointer ptr = val.value<ApiPointer>();
125 QStandardItem *item = new QStandardItem();
126 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
127 item->setText(ptr.toString());
128 QIcon icon(":/resources/emblem-locked.png");
130 item->setToolTip(tr("Argument is read-only"));
132 } else if (val.canConvert<ApiBitmask>()) {
133 ApiBitmask mask = val.value<ApiBitmask>();
134 QStandardItem *item = new QStandardItem();
135 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
136 item->setText(mask.toString());
137 QIcon icon(":/resources/emblem-locked.png");
139 item->setToolTip(tr("Argument is read-only"));
141 } else if (val.canConvert<ApiStruct>()) {
142 ApiStruct str = val.value<ApiStruct>();
143 QStandardItem *item = new QStandardItem();
144 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
145 item->setText(str.toString());
146 QIcon icon(":/resources/emblem-locked.png");
148 item->setToolTip(tr("Argument is read-only"));
150 } else if (val.userType() == QVariant::ByteArray) {
151 QByteArray ba = val.value<QByteArray>();
152 QStandardItem *item = new QStandardItem();
153 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
155 tr("<binary data, size = %1 bytes>").arg(ba.size()));
156 QIcon icon(":/resources/emblem-locked.png");
158 item->setToolTip(tr("Argument is read-only"));
162 = new QStandardItem();
164 if (isVariantEditable(val)) {
165 item->setFlags(item->flags() | Qt::ItemIsEditable);
167 QIcon icon(":/resources/emblem-locked.png");
169 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
170 item->setToolTip(tr("Argument is read-only"));
172 item->setData(val, Qt::DisplayRole);
175 rootItem->appendRow(topRow);
179 void ArgumentsEditor::setupShaderEditor(const QList<QVariant> &sources)
183 ArgumentsItemEditorFactory::ArgumentsItemEditorFactory()
184 : QItemEditorFactory()
188 QWidget * ArgumentsItemEditorFactory::createEditor(QVariant::Type type,
189 QWidget *parent) const
192 case QVariant::Bool: {
193 BooleanComboBox *cb = new BooleanComboBox(parent);
197 case QVariant::UInt: {
198 QSpinBox *sb = new QSpinBox(parent);
200 sb->setMaximum(INT_MAX);
202 case QVariant::Int: {
203 QSpinBox *sb = new QSpinBox(parent);
205 sb->setMinimum(INT_MIN);
206 sb->setMaximum(INT_MAX);
209 case QVariant::ULongLong: {
210 QSpinBox *sb = new QSpinBox(parent);
212 sb->setMaximum(INT_MAX);
214 case QVariant::LongLong: {
215 QSpinBox *sb = new QSpinBox(parent);
217 sb->setMinimum(INT_MIN);
218 sb->setMaximum(INT_MAX);
221 case QVariant::Pixmap:
222 return new QLabel(parent);
223 case QVariant::Double: {
224 QDoubleSpinBox *sb = new QDoubleSpinBox(parent);
226 sb->setMinimum(-DBL_MAX);
227 sb->setMaximum(DBL_MAX);
238 ArgumentsItemEditorFactory::valuePropertyName(QVariant::Type type) const
242 return "currentIndex";
245 case QVariant::LongLong:
246 case QVariant::ULongLong:
247 case QVariant::Double:
250 case QVariant::String:
257 BooleanComboBox::BooleanComboBox(QWidget *parent)
260 addItem(tr("False"));
264 void BooleanComboBox::setValue(bool value)
266 setCurrentIndex(value ? 1 : 0);
269 bool BooleanComboBox::value() const
271 return (currentIndex() == 1);
274 #include "argumentseditor.moc"