+void ArgumentsEditor::setupShaderEditor(const QVector<QVariant> &sources)
+{
+ m_ui.selectStringCB->clear();
+ m_ui.glslEdit->clear();
+ for (int i = 0; i < sources.count(); ++i) {
+ m_ui.selectStringCB->addItem(
+ tr("Shader string: %1").arg(i),
+ sources[i]);
+ }
+ m_ui.selectStringCB->setCurrentIndex(0);
+}
+
+void ArgumentsEditor::currentSourceChanged(int idx)
+{
+ QVariant source = m_ui.selectStringCB->itemData(idx);
+ QString str = source.toString();
+ m_ui.glslEdit->setPlainText(source.toString());
+ m_ui.lengthLabel->setText(
+ tr("%1").arg(str.length()));
+}
+
+void ArgumentsEditor::sourceChanged()
+{
+ QString str = m_ui.glslEdit->toPlainText();
+ m_ui.lengthLabel->setText(
+ tr("%1").arg(str.length()));
+
+ m_ui.selectStringCB->setItemData(
+ m_ui.selectStringCB->currentIndex(),
+ str);
+}
+
+void ArgumentsEditor::accept()
+{
+ QStringList argNames = m_call->argNames();
+ QVector<QVariant> originalValues = m_call->arguments();
+ QVector<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, &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,
+ bool *changed) const
+{
+ QVariant val;
+
+ *changed = false;
+
+ //Handle string arrays specially
+ if (isVariantStringArray(originalValue)) {
+ ApiArray array = originalValue.value<ApiArray>();
+ return arrayFromEditor(array, changed);
+ }
+
+ if (!isVariantEditable(originalValue)) {
+ return originalValue;
+ }
+
+ for (int topRow = 0; topRow < m_model->rowCount(); ++topRow) {
+ QModelIndex nameIdx = m_model->index(topRow, 0, QModelIndex());
+ QString argName = nameIdx.data().toString();
+ /* we display shaders in a separate widget so
+ * the ordering might be different */
+ if (argName == name) {
+ if (originalValue.userType() == QMetaType::type("ApiArray")) {
+ ApiArray array = originalValue.value<ApiArray>();
+ val = arrayFromIndex(nameIdx, array, changed);
+ } else {
+ QModelIndex valIdx = m_model->index(topRow, 1, QModelIndex());
+ val = valIdx.data();
+ if (val != originalValue)
+ *changed = true;
+ }
+ }
+ }
+ return val;
+}
+
+QVariant ArgumentsEditor::arrayFromIndex(const QModelIndex &parentIndex,
+ const ApiArray &origArray,
+ bool *changed) const
+{
+ QVector<QVariant> origValues = origArray.values();
+
+ *changed = false;
+
+ if (origValues.isEmpty())
+ return QVariant::fromValue(ApiArray());
+
+ QVector<QVariant> lst;
+ 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,
+ bool *changed) const
+{
+ QVector<QVariant> vals;
+ QVector<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()