]> git.cworth.org Git - apitrace/blobdiff - gui/argumentseditor.cpp
Share function signatures.
[apitrace] / gui / argumentseditor.cpp
index 8c0f14ea5937ecb7c75223cd021ed49b519c4d6f..8848122b60089479c3343eb69a6c7010ca060483 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:
@@ -143,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
@@ -166,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 =
@@ -239,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();
@@ -322,27 +340,45 @@ void ArgumentsEditor::accept()
 {
     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) {
@@ -353,10 +389,12 @@ QVariant ArgumentsEditor::valueForName(const QString &name,
         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;
             }
         }
     }
@@ -364,9 +402,13 @@ QVariant ArgumentsEditor::valueForName(const QString &name,
 }
 
 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());
 
@@ -374,24 +416,38 @@ QVariant ArgumentsEditor::arrayFromIndex(const QModelIndex &parentIndex,
     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"