]> git.cworth.org Git - apitrace/blobdiff - gui/argumentseditor.cpp
Switch more places from qlist to qvector.
[apitrace] / gui / argumentseditor.cpp
index de467848125347d443f8b9dffe0ca58c47d40ff5..0f8a977c6744c1984799c219e2145aeda1c8378a 100644 (file)
 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:
@@ -27,6 +35,20 @@ isVariantEditable(const QVariant &var)
     }
 }
 
+static bool
+isVariantStringArray(const QVariant &var)
+{
+    if (var.isNull() || var.userType() != QMetaType::type("ApiArray"))
+        return false;
+
+    ApiArray array = var.value<ApiArray>();
+    QList<QVariant> origValues = array.values();
+    if (origValues.isEmpty() ||
+        origValues.first().userType() != QVariant::String)
+        return false;
+
+    return true;
+}
 
 ArgumentsItemEditorFactory::ArgumentsItemEditorFactory()
     : QItemEditorFactory()
@@ -129,14 +151,13 @@ ArgumentsEditor::ArgumentsEditor(QWidget *parent)
 
 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
@@ -152,6 +173,8 @@ void ArgumentsEditor::init()
             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 =
@@ -175,16 +198,15 @@ void ArgumentsEditor::setupCall()
     if (!m_call)
         return;
 
-    m_ui.callLabel->setText(m_call->name);
+    m_ui.callLabel->setText(m_call->name());
     QStandardItem *rootItem = m_model->invisibleRootItem();
-    for (int i = 0; i < m_call->argNames.count(); ++i) {
-        QString argName = m_call->argNames[i];
-        QVariant val = m_call->argValues[i];
+    for (int i = 0; i < m_call->argNames().count(); ++i) {
+        QString argName = m_call->argNames()[i];
+        QVariant val = m_call->arguments()[i];
         QStandardItem *nameItem = new QStandardItem(argName);
         nameItem->setFlags(nameItem->flags() ^ Qt::ItemIsEditable);
         QList<QStandardItem*> topRow;
         topRow.append(nameItem);
-        qDebug()<<"arg "<<argName<<", val = "<<val;
 
         if (val.canConvert<ApiArray>()) {
             ApiArray array = val.value<ApiArray>();
@@ -226,6 +248,15 @@ void ArgumentsEditor::setupCall()
             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();
@@ -299,6 +330,124 @@ 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
+{
+    QList<QVariant> origValues = origArray.values();
+
+    *changed = false;
+
+    if (origValues.isEmpty())
+        return QVariant::fromValue(ApiArray());
+
+    QList<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
+{
+    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"