Browse Source

Merge pull request #652 from Ragora/bugfix-crash-variableinspector

BugFix: Correct a crash in the variable inspector
Brian Roberts 3 years ago
parent
commit
d71948c1ac

+ 45 - 37
Engine/source/gui/editor/inspector/variableInspector.cpp

@@ -32,6 +32,7 @@ GuiVariableInspector::GuiVariableInspector() : mAutoUpdate(true)
 
 
 GuiVariableInspector::~GuiVariableInspector()
 GuiVariableInspector::~GuiVariableInspector()
 {
 {
+
 }
 }
 
 
 IMPLEMENT_CONOBJECT(GuiVariableInspector);
 IMPLEMENT_CONOBJECT(GuiVariableInspector);
@@ -75,7 +76,7 @@ void GuiVariableInspector::update()
 
 
       for (U32 g = 0; g < mGroups.size(); g++)
       for (U32 g = 0; g < mGroups.size(); g++)
       {
       {
-         if (mGroups[g]->getCaption().equal(mFields[i].mGroup))
+         if (mGroups[g]->getCaption().equal(mFields[i]->mGroup))
          {
          {
             group = static_cast<GuiInspectorVariableGroup*>(mGroups[g]);
             group = static_cast<GuiInspectorVariableGroup*>(mGroups[g]);
             break;
             break;
@@ -89,14 +90,14 @@ void GuiVariableInspector::update()
          group->setHeaderHidden(false);
          group->setHeaderHidden(false);
          group->setCanCollapse(true);
          group->setCanCollapse(true);
          group->mParent = this;
          group->mParent = this;
-         group->setCaption(mFields[i].mGroup);
+         group->setCaption(mFields[i]->mGroup);
 
 
          group->registerObject();
          group->registerObject();
          mGroups.push_back(group);
          mGroups.push_back(group);
          addObject(group);
          addObject(group);
       }
       }
-      
-      group->addField(&mFields[i]);
+
+      group->addField(mFields[i]);
    }
    }
 
 
    //And now, cue our update for the groups themselves
    //And now, cue our update for the groups themselves
@@ -148,26 +149,26 @@ void GuiVariableInspector::setGroupsExpanded(bool isExpanded)
 void GuiVariableInspector::addField(const char* name, const char* label, const char* typeName, const char* description, 
 void GuiVariableInspector::addField(const char* name, const char* label, const char* typeName, const char* description, 
    const char* defaultValue, const char* dataValues, const char* callbackName, SimObject* ownerObj)
    const char* defaultValue, const char* dataValues, const char* callbackName, SimObject* ownerObj)
 {
 {
-   VariableField newField;
-   newField.mFieldName = StringTable->insert(name);
-   newField.mFieldLabel = StringTable->insert(label, true);
-   newField.mFieldTypeName = StringTable->insert(typeName);
-   newField.mFieldDescription = StringTable->insert(description);
-   newField.mDefaultValue = StringTable->insert(defaultValue);
-   newField.mDataValues = String(dataValues);
-   newField.mGroup = mCurrentGroup;
-   newField.mSetCallbackName = StringTable->insert(callbackName);
-   newField.mEnabled = true;
-
-   newField.mOwnerObject = ownerObj;
+   VariableField* newField = new VariableField;
+   newField->mFieldName = StringTable->insert(name);
+   newField->mFieldLabel = StringTable->insert(label, true);
+   newField->mFieldTypeName = StringTable->insert(typeName);
+   newField->mFieldDescription = StringTable->insert(description);
+   newField->mDefaultValue = StringTable->insert(defaultValue);
+   newField->mDataValues = String(dataValues);
+   newField->mGroup = mCurrentGroup;
+   newField->mSetCallbackName = StringTable->insert(callbackName);
+   newField->mEnabled = true;
+
+   newField->mOwnerObject = ownerObj;
 
 
    //establish the field on the ownerObject(if we have one)
    //establish the field on the ownerObject(if we have one)
    //This way, we can let the field hook into the object's field and modify it when changed
    //This way, we can let the field hook into the object's field and modify it when changed
-   if (newField.mOwnerObject != nullptr)
+   if (newField->mOwnerObject != nullptr)
    {
    {
-      if (!newField.mOwnerObject->isField(newField.mFieldName))
+      if (!newField->mOwnerObject->isField(newField->mFieldName))
       {
       {
-         newField.mOwnerObject->setDataField(newField.mFieldName, NULL, newField.mDefaultValue);
+         newField->mOwnerObject->setDataField(newField->mFieldName, NULL, newField->mDefaultValue);
       }
       }
    }
    }
 
 
@@ -175,40 +176,40 @@ void GuiVariableInspector::addField(const char* name, const char* label, const c
    //find the field type
    //find the field type
    S32 fieldTypeMask = -1;
    S32 fieldTypeMask = -1;
 
 
-   if (newField.mFieldTypeName == StringTable->insert("int"))
+   if (newField->mFieldTypeName == StringTable->insert("int"))
       fieldTypeMask = TypeS32;
       fieldTypeMask = TypeS32;
-   else if (newField.mFieldTypeName == StringTable->insert("float"))
+   else if (newField->mFieldTypeName == StringTable->insert("float"))
       fieldTypeMask = TypeF32;
       fieldTypeMask = TypeF32;
-   else if (newField.mFieldTypeName == StringTable->insert("vector"))
+   else if (newField->mFieldTypeName == StringTable->insert("vector"))
       fieldTypeMask = TypePoint3F;
       fieldTypeMask = TypePoint3F;
-   else if (newField.mFieldTypeName == StringTable->insert("vector2"))
+   else if (newField->mFieldTypeName == StringTable->insert("vector2"))
       fieldTypeMask = TypePoint2F;
       fieldTypeMask = TypePoint2F;
-   else if (newField.mFieldTypeName == StringTable->insert("material"))
+   else if (newField->mFieldTypeName == StringTable->insert("material"))
       fieldTypeMask = TypeMaterialAssetId;
       fieldTypeMask = TypeMaterialAssetId;
-   else if (newField.mFieldTypeName == StringTable->insert("image"))
+   else if (newField->mFieldTypeName == StringTable->insert("image"))
       fieldTypeMask = TypeImageAssetId;
       fieldTypeMask = TypeImageAssetId;
-   else if (newField.mFieldTypeName == StringTable->insert("shape"))
+   else if (newField->mFieldTypeName == StringTable->insert("shape"))
       fieldTypeMask = TypeShapeAssetId;
       fieldTypeMask = TypeShapeAssetId;
-   else if (newField.mFieldTypeName == StringTable->insert("bool"))
+   else if (newField->mFieldTypeName == StringTable->insert("bool"))
       fieldTypeMask = TypeBool;
       fieldTypeMask = TypeBool;
-   else if (newField.mFieldTypeName == StringTable->insert("object"))
+   else if (newField->mFieldTypeName == StringTable->insert("object"))
       fieldTypeMask = TypeSimObjectPtr;
       fieldTypeMask = TypeSimObjectPtr;
-   else if (newField.mFieldTypeName == StringTable->insert("string"))
+   else if (newField->mFieldTypeName == StringTable->insert("string"))
       fieldTypeMask = TypeString;
       fieldTypeMask = TypeString;
-   else if (newField.mFieldTypeName == StringTable->insert("colorI"))
+   else if (newField->mFieldTypeName == StringTable->insert("colorI"))
       fieldTypeMask = TypeColorI;
       fieldTypeMask = TypeColorI;
-   else if (newField.mFieldTypeName == StringTable->insert("colorF"))
+   else if (newField->mFieldTypeName == StringTable->insert("colorF"))
       fieldTypeMask = TypeColorF;
       fieldTypeMask = TypeColorF;
-   else if (newField.mFieldTypeName == StringTable->insert("ease"))
+   else if (newField->mFieldTypeName == StringTable->insert("ease"))
       fieldTypeMask = TypeEaseF;
       fieldTypeMask = TypeEaseF;
-   else if (newField.mFieldTypeName == StringTable->insert("command"))
+   else if (newField->mFieldTypeName == StringTable->insert("command"))
       fieldTypeMask = TypeCommand;
       fieldTypeMask = TypeCommand;
-   else if (newField.mFieldTypeName == StringTable->insert("filename"))
+   else if (newField->mFieldTypeName == StringTable->insert("filename"))
       fieldTypeMask = TypeStringFilename;
       fieldTypeMask = TypeStringFilename;
    else
    else
       fieldTypeMask = -1;
       fieldTypeMask = -1;
 
 
-   newField.mFieldType = fieldTypeMask;
+   newField->mFieldType = fieldTypeMask;
    //
    //
 
 
    mFields.push_back(newField);
    mFields.push_back(newField);
@@ -226,6 +227,13 @@ void GuiVariableInspector::addCallbackField(const char* name, const char* label,
 void GuiVariableInspector::clearFields()
 void GuiVariableInspector::clearFields()
 {
 {
    mGroups.clear();
    mGroups.clear();
+
+   // Before clearing the fields, dealloc the memory first
+   for (U32 iteration = 0; iteration < mFields.size(); ++iteration)
+   {
+       delete mFields[iteration];
+   }
+
    mFields.clear();
    mFields.clear();
    clear();
    clear();
    
    
@@ -237,9 +245,9 @@ void GuiVariableInspector::setFieldEnabled(const char* name, bool enabled)
    String fieldName = name;
    String fieldName = name;
    for (U32 i = 0; i < mFields.size(); i++)
    for (U32 i = 0; i < mFields.size(); i++)
    {
    {
-      if (fieldName.equal(mFields[i].mFieldName, String::NoCase))
+      if (fieldName.equal(mFields[i]->mFieldName, String::NoCase))
       {
       {
-         mFields[i].mEnabled = enabled;
+         mFields[i]->mEnabled = enabled;
          update();
          update();
          return;
          return;
       }
       }

+ 1 - 1
Engine/source/gui/editor/inspector/variableInspector.h

@@ -65,7 +65,7 @@ public:
 
 
 protected:
 protected:
    
    
-   Vector<VariableField> mFields;
+   Vector<VariableField*> mFields;
 
 
    String mCurrentGroup;
    String mCurrentGroup;