mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-07-12 15:14:35 +00:00
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:
parent
72eb21ede0
commit
fdadfa5eea
4 changed files with 179 additions and 30 deletions
|
|
@ -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 )')." )
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue