static bool
isVariantEditable(const QVariant &var)
{
+ if (var.canConvert<ApiArray>()) {
+ ApiArray array = var.value<ApiArray>();
+ QList<QVariant> vals = array.values();
+ if (vals.isEmpty())
+ return false;
+ else
+ return isVariantEditable(vals.first());
+ }
switch (var.userType()) {
case QVariant::Bool:
case QVariant::Int:
ArgumentsEditor::~ArgumentsEditor()
{
+ delete m_model;
}
void ArgumentsEditor::setCall(ApiTraceCall *call)
{
- if (m_call != call) {
- m_call = call;
- setupCall();
- }
+ m_call = call;
+ setupCall();
}
ApiTraceCall * ArgumentsEditor::call() const
SLOT(currentSourceChanged(int)));
connect(m_ui.glslEdit, SIGNAL(textChanged()),
SLOT(sourceChanged()));
+ connect(m_ui.revertButton, SIGNAL(clicked()),
+ SLOT(revert()));
m_ui.argsTree->setModel(m_model);
QItemEditorFactory *factory =
item->setIcon(icon);
item->setToolTip(tr("Argument is read-only"));
topRow.append(item);
+ } else if (val.canConvert<ApiEnum>()) {
+ ApiEnum en = val.value<ApiEnum>();
+ QStandardItem *item = new QStandardItem();
+ item->setFlags(item->flags() ^ Qt::ItemIsEditable);
+ item->setText(en.toString());
+ QIcon icon(":/resources/emblem-locked.png");
+ item->setIcon(icon);
+ item->setToolTip(tr("Argument is read-only"));
+ topRow.append(item);
} else if (val.canConvert<ApiBitmask>()) {
ApiBitmask mask = val.value<ApiBitmask>();
QStandardItem *item = new QStandardItem();
{
QStringList argNames = m_call->argNames();
QList<QVariant> originalValues = m_call->arguments();
+ QList<QVariant> newValues;
+ bool changed = false;
for (int i = 0; i < argNames.count(); ++i) {
+ bool valChanged = false;
QString argName = argNames[i];
QVariant argValue = originalValues[i];
- QVariant editorValue = valueForName(argName, argValue);
+ QVariant editorValue = valueForName(argName, argValue, &valChanged);
+
+ newValues.append(editorValue);
+#if 0
qDebug()<<"Arg = "<<argName;
qDebug()<<"\toriginal = "<<argValue;
qDebug()<<"\teditor = "<<editorValue;
+ qDebug()<<"\tchanged = "<<valChanged;
+#endif
+ if (valChanged)
+ changed = true;
}
-
+ if (changed)
+ m_call->setEditedValues(newValues);
QDialog::accept();
}
QVariant ArgumentsEditor::valueForName(const QString &name,
- const QVariant &originalValue) const
+ const QVariant &originalValue,
+ bool *changed) const
{
QVariant val;
+ *changed = false;
+
//Handle string arrays specially
if (isVariantStringArray(originalValue)) {
ApiArray array = originalValue.value<ApiArray>();
- return arrayFromEditor(array);
+ return arrayFromEditor(array, changed);
+ }
+
+ if (!isVariantEditable(originalValue)) {
+ return originalValue;
}
for (int topRow = 0; topRow < m_model->rowCount(); ++topRow) {
if (argName == name) {
if (originalValue.userType() == QMetaType::type("ApiArray")) {
ApiArray array = originalValue.value<ApiArray>();
- val = arrayFromIndex(nameIdx, array);
+ val = arrayFromIndex(nameIdx, array, changed);
} else {
QModelIndex valIdx = m_model->index(topRow, 1, QModelIndex());
val = valIdx.data();
+ if (val != originalValue)
+ *changed = true;
}
}
}
}
QVariant ArgumentsEditor::arrayFromIndex(const QModelIndex &parentIndex,
- const ApiArray &origArray) const
+ const ApiArray &origArray,
+ bool *changed) const
{
QList<QVariant> origValues = origArray.values();
+
+ *changed = false;
+
if (origValues.isEmpty())
return QVariant::fromValue(ApiArray());
for (int i = 0; i < origValues.count(); ++i) {
QModelIndex valIdx = m_model->index(i, 1, parentIndex);
QVariant var = valIdx.data();
+ QVariant origValue = origValues[i];
+ if (var != origValue)
+ *changed = true;
//qDebug()<<"\t\tarray "<<i<<") "<<var;
lst.append(var);
}
return QVariant::fromValue(ApiArray(lst));
}
-QVariant ArgumentsEditor::arrayFromEditor(const ApiArray &origArray) const
+QVariant ArgumentsEditor::arrayFromEditor(const ApiArray &origArray,
+ bool *changed) const
{
QList<QVariant> vals;
QList<QVariant> origValues = origArray.values();
Q_ASSERT(isVariantStringArray(QVariant::fromValue(origArray)));
+ *changed = false;
//shaders
for (int i = 0; i < m_ui.selectStringCB->count(); ++i) {
QVariant val = m_ui.selectStringCB->itemData(i);
+ QVariant origValue = origValues[i];
+ if (origValue != val)
+ *changed = true;
vals.append(val);
}
return QVariant::fromValue(ApiArray(vals));
}
+void ArgumentsEditor::revert()
+{
+ m_call->revert();
+ setupCall();
+}
+
#include "argumentseditor.moc"