]> git.cworth.org Git - apitrace/blobdiff - gui/argumentseditor.cpp
common: Add more comments.
[apitrace] / gui / argumentseditor.cpp
index 04a195249682ac20d542b81b1b35e92f94c5d6ce..e6345ea5659eac2301561c0fe102dee907b1082b 100644 (file)
 static bool
 isVariantEditable(const QVariant &var)
 {
+    if (var.canConvert<ApiArray>()) {
+        ApiArray array = var.value<ApiArray>();
+        QVector<QVariant> vals = array.values();
+        if (vals.isEmpty())
+            return false;
+        else
+            return isVariantEditable(vals.first());
+    }
     switch (var.userType()) {
     case QVariant::Bool:
     case QVariant::Int:
     case QVariant::UInt:
     case QVariant::LongLong:
     case QVariant::ULongLong:
+    case QMetaType::Float:
     case QVariant::Double:
         return true;
     default:
@@ -34,7 +43,7 @@ isVariantStringArray(const QVariant &var)
         return false;
 
     ApiArray array = var.value<ApiArray>();
-    QList<QVariant> origValues = array.values();
+    QVector<QVariant> origValues = array.values();
     if (origValues.isEmpty() ||
         origValues.first().userType() != QVariant::String)
         return false;
@@ -42,78 +51,45 @@ isVariantStringArray(const QVariant &var)
     return true;
 }
 
-ArgumentsItemEditorFactory::ArgumentsItemEditorFactory()
-    : QItemEditorFactory()
-{
-}
 
-QWidget * ArgumentsItemEditorFactory::createEditor(QVariant::Type type,
-                                                   QWidget *parent) const
-{
-    switch (type) {
-    case QVariant::Bool: {
-        BooleanComboBox *cb = new BooleanComboBox(parent);
-        cb->setFrame(false);
-        return cb;
-    }
-    case QVariant::UInt: {
-        QSpinBox *sb = new QSpinBox(parent);
-        sb->setFrame(false);
-        sb->setMaximum(INT_MAX);
-        return sb; }
-    case QVariant::Int: {
-        QSpinBox *sb = new QSpinBox(parent);
-        sb->setFrame(false);
-        sb->setMinimum(INT_MIN);
-        sb->setMaximum(INT_MAX);
-        return sb;
-    }
-    case QVariant::ULongLong: {
-        QSpinBox *sb = new QSpinBox(parent);
-        sb->setFrame(false);
-        sb->setMaximum(INT_MAX);
-        return sb; }
-    case QVariant::LongLong: {
-        QSpinBox *sb = new QSpinBox(parent);
-        sb->setFrame(false);
-        sb->setMinimum(INT_MIN);
-        sb->setMaximum(INT_MAX);
-        return sb;
-    }
-    case QVariant::Pixmap:
-        return new QLabel(parent);
-    case QVariant::Double: {
-        QDoubleSpinBox *sb = new QDoubleSpinBox(parent);
-        sb->setFrame(false);
-        sb->setMinimum(-DBL_MAX);
-        sb->setMaximum(DBL_MAX);
-        sb->setDecimals(8);
-        return sb;
-    }
-    default:
-        break;
-    }
-    return 0;
-}
 
-QByteArray
-ArgumentsItemEditorFactory::valuePropertyName(QVariant::Type type) const
+void setArgumentsItemEditorFactory ()
 {
-    switch (type) {
-    case QVariant::Bool:
-        return "currentIndex";
-    case QVariant::UInt:
-    case QVariant::Int:
-    case QVariant::LongLong:
-    case QVariant::ULongLong:
-    case QVariant::Double:
-        return "value";
-#if 0
-    case QVariant::String:
-#endif
-    default:
-        return "text";
-    }
+    QItemEditorCreatorBase *booleanComboBoxEditorCreator =
+    new QStandardItemEditorCreator<BooleanComboBoxEditorCreator>();
+    QItemEditorCreatorBase *uIntEditorCreator =
+    new QStandardItemEditorCreator<UIntEditorCreator>();
+    QItemEditorCreatorBase *intEditorCreator =
+    new QStandardItemEditorCreator<IntEditorCreator>();
+    QItemEditorCreatorBase *uLongLongEditorCreator =
+    new QStandardItemEditorCreator<ULongLongEditorCreator>();
+    QItemEditorCreatorBase *longLongEditorCreator =
+    new QStandardItemEditorCreator<LongLongEditorCreator>();
+    QItemEditorCreatorBase *pixmapEditorCreator =
+    new QStandardItemEditorCreator<PixmapEditorCreator>();
+    QItemEditorCreatorBase *floatEditorCreator =
+    new QStandardItemEditorCreator<FloatEditorCreator>();
+    QItemEditorCreatorBase *doubleEditorCreator =
+    new QStandardItemEditorCreator<DoubleEditorCreator>();
+    QItemEditorCreatorBase *invalidEditorCreator =
+    new QStandardItemEditorCreator<InvalidEditorCreator>();
+
+    QItemEditorFactory *factory =
+        new QItemEditorFactory();
+
+    QVariant::Type typeFloat = static_cast<QVariant::Type> (qMetaTypeId<float>());
+
+    factory->registerEditor(QVariant::Bool, booleanComboBoxEditorCreator);
+    factory->registerEditor(QVariant::UInt, uIntEditorCreator);
+    factory->registerEditor(QVariant::Int, intEditorCreator);
+    factory->registerEditor(QVariant::ULongLong, uLongLongEditorCreator);
+    factory->registerEditor(QVariant::LongLong, longLongEditorCreator);
+    factory->registerEditor(QVariant::Pixmap, pixmapEditorCreator);
+    factory->registerEditor(typeFloat, floatEditorCreator);
+    factory->registerEditor(QVariant::Double, doubleEditorCreator);
+    factory->registerEditor(QVariant::Invalid, invalidEditorCreator);
+
+    QItemEditorFactory::setDefaultFactory(factory);
 }
 
 BooleanComboBox::BooleanComboBox(QWidget *parent)
@@ -143,6 +119,7 @@ ArgumentsEditor::ArgumentsEditor(QWidget *parent)
 
 ArgumentsEditor::~ArgumentsEditor()
 {
+    delete m_model;
 }
 
 void ArgumentsEditor::setCall(ApiTraceCall *call)
@@ -167,11 +144,10 @@ void ArgumentsEditor::init()
     connect(m_ui.revertButton, SIGNAL(clicked()),
             SLOT(revert()));
 
+    setArgumentsItemEditorFactory ();
+
     m_ui.argsTree->setModel(m_model);
-    QItemEditorFactory *factory =
-        new ArgumentsItemEditorFactory();
 
-    QItemEditorFactory::setDefaultFactory(factory);
 }
 
 void ArgumentsEditor::setupCall()
@@ -201,7 +177,7 @@ void ArgumentsEditor::setupCall()
 
         if (val.canConvert<ApiArray>()) {
             ApiArray array = val.value<ApiArray>();
-            QList<QVariant> vals = array.values();
+            QVector<QVariant> vals = array.values();
 
             QVariant firstVal = vals.value(0);
             if (firstVal.userType() == QVariant::String) {
@@ -220,7 +196,7 @@ void ArgumentsEditor::setupCall()
 
                     QStandardItem *col = new QStandardItem();
                     col->setFlags(col->flags() | Qt::ItemIsEditable);
-                    col->setData(vals[i], Qt::DisplayRole);
+                    col->setData(vals[i], Qt::EditRole);
                     row.append(idx);
                     row.append(col);
                     nameItem->appendRow(row);
@@ -288,14 +264,14 @@ void ArgumentsEditor::setupCall()
                 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
                 item->setToolTip(tr("Argument is read-only"));
             }
-            item->setData(val, Qt::DisplayRole);
+            item->setData(val, Qt::EditRole);
             topRow.append(item);
         }
         rootItem->appendRow(topRow);
     }
 }
 
-void ArgumentsEditor::setupShaderEditor(const QList<QVariant> &sources)
+void ArgumentsEditor::setupShaderEditor(const QVector<QVariant> &sources)
 {
     m_ui.selectStringCB->clear();
     m_ui.glslEdit->clear();
@@ -330,14 +306,15 @@ void ArgumentsEditor::sourceChanged()
 void ArgumentsEditor::accept()
 {
     QStringList argNames = m_call->argNames();
-    QList<QVariant> originalValues = m_call->arguments();
-    QList<QVariant> newValues;
+    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;
@@ -367,6 +344,10 @@ QVariant ArgumentsEditor::valueForName(const QString &name,
         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();
@@ -391,14 +372,14 @@ QVariant ArgumentsEditor::arrayFromIndex(const QModelIndex &parentIndex,
                                          const ApiArray &origArray,
                                          bool *changed) const
 {
-    QList<QVariant> origValues = origArray.values();
+    QVector<QVariant> origValues = origArray.values();
 
     *changed = false;
 
     if (origValues.isEmpty())
         return QVariant::fromValue(ApiArray());
 
-    QList<QVariant> lst;
+    QVector<QVariant> lst;
     for (int i = 0; i < origValues.count(); ++i) {
         QModelIndex valIdx = m_model->index(i, 1, parentIndex);
         QVariant var = valIdx.data();
@@ -414,8 +395,8 @@ QVariant ArgumentsEditor::arrayFromIndex(const QModelIndex &parentIndex,
 QVariant ArgumentsEditor::arrayFromEditor(const ApiArray &origArray,
                                           bool *changed) const
 {
-    QList<QVariant> vals;
-    QList<QVariant> origValues = origArray.values();
+    QVector<QVariant> vals;
+    QVector<QVariant> origValues = origArray.values();
 
     Q_ASSERT(isVariantStringArray(QVariant::fromValue(origArray)));
     *changed = false;