Adds handling for complex fields such as Point2, Point3 and Point4's to be able to apply value changes to only one axis across a multi-object set without affecting other axis'

This commit is contained in:
Areloch 2024-04-30 18:44:17 -05:00
parent 72eb21ede0
commit fdadfa5eea
4 changed files with 179 additions and 30 deletions

View file

@ -264,6 +264,129 @@ void GuiInspectorField::onRightMouseUp( const GuiEvent &event )
}
//-----------------------------------------------------------------------------
void GuiInspectorField::setWordData(const S32& wordIndex, const char* data, bool callbacks)
{
if (mSpecialEditField)
{
if (mTargetObject != nullptr && mVariableName != StringTable->EmptyString())
{
const char* fieldData = mTargetObject->getDataField(mVariableName, NULL);
StringBuilder newFieldData;
const U32 wordCount = StringUnit::getUnitCount(fieldData, " \t\n");
for (U32 i = 0; i < wordCount; i++)
{
if (i != 0)
newFieldData.append(" ");
if (i == wordIndex)
newFieldData.append(data);
else
{
newFieldData.append(StringUnit::getUnit(fieldData, i, " \t\n"));
}
}
mTargetObject->setDataField(mVariableName, NULL, newFieldData.end());
if (mCallbackName != StringTable->EmptyString())
Con::executef(mInspector, mCallbackName, mVariableName, newFieldData.end(), mTargetObject);
}
else if (mVariableName != StringTable->EmptyString())
{
const char* fieldData = Con::getVariable(mVariableName, "");
StringBuilder newFieldData;
const U32 wordCount = StringUnit::getUnitCount(fieldData, " \t\n");
for (U32 i = 0; i < wordCount; i++)
{
if (i != 0)
newFieldData.append(" ");
if (i == wordIndex)
newFieldData.append(data);
else
{
newFieldData.append(StringUnit::getUnit(fieldData, i, " \t\n"));
}
}
Con::setVariable(mVariableName, newFieldData.end());
if (mCallbackName != StringTable->EmptyString())
Con::executef(mInspector, mCallbackName, mVariableName, newFieldData.end());
}
}
if (mField == NULL)
return;
if (verifyData(data))
{
String strData = data;
const U32 numTargets = mInspector->getNumInspectObjects();
if (callbacks && numTargets > 1)
Con::executef(mInspector, "onBeginCompoundEdit");
for (U32 i = 0; i < numTargets; ++i)
{
//For now, for simplicity's sake, you can only edit the components in a simple edit
SimObject* target = NULL;
if (numTargets == 1)
{
target = mTargetObject;
if (!target)
target = mInspector->getInspectObject(i);
}
else
{
target = mInspector->getInspectObject(i);
}
const char* fieldData = target->getDataField(mField->pFieldname, mFieldArrayIndex);
StringBuilder newFieldData;
const U32 wordCount = StringUnit::getUnitCount(fieldData, " \t\n");
for (U32 i = 0; i < wordCount; i++)
{
if (i != 0)
newFieldData.append(" ");
if (i == wordIndex)
newFieldData.append(data);
else
{
newFieldData.append(StringUnit::getUnit(fieldData, i, " \t\n"));
}
}
target->inspectPreApply();
// Fire callback single-object undo.
if (callbacks && !mField->flag.test(AbstractClassRep::FieldFlags::FIELD_ComponentInspectors))
Con::executef(mInspector, "onInspectorFieldModified",
target->getIdString(),
mField->pFieldname,
mFieldArrayIndex ? mFieldArrayIndex : "(null)",
fieldData,
newFieldData.end());
target->setDataField(mField->pFieldname, mFieldArrayIndex, newFieldData.end());
// Give the target a chance to validate.
target->inspectPostApply();
}
if (callbacks && numTargets > 1)
Con::executef(mInspector, "onEndCompoundEdit");
}
// Force our edit to update
updateValue();
}
void GuiInspectorField::setData( const char* data, bool callbacks )
{
@ -762,6 +885,12 @@ DefineEngineMethod( GuiInspectorField, apply, void, ( const char * newValue, boo
object->setData( newValue, callbacks );
}
//-----------------------------------------------------------------------------
DefineEngineMethod(GuiInspectorField, applyWord, void, (S32 wordIndex, const char* newValue, bool callbacks), (true), "( string newValue, bool callbacks=true ) - Set the field's value. Suppress callbacks for undo if callbacks=false.")
{
object->setWordData(wordIndex, newValue, callbacks);
}
//-----------------------------------------------------------------------------
DefineEngineMethod( GuiInspectorField, applyWithoutUndo, void, (const char * data), , "() - Set field value without recording undo (same as 'apply( value, false )')." )

View file

@ -167,6 +167,8 @@ class GuiInspectorField : public GuiControl
/// to perform their own verification.
virtual bool verifyData( StringTableEntry data ) { return true; }
void setWordData(const S32& wordIndex, const char* data, bool callbacks);
/// Set value of the field we are inspecting
virtual void setData( const char* data, bool callbacks = true );