Support for undo/redo on array resize

This commit is contained in:
parax0
2016-01-31 14:25:16 -07:00
parent cc054cf571
commit f6f36f4f2e
13 changed files with 306 additions and 30 deletions

View File

@@ -23,6 +23,19 @@ TIDString IProperty::IDString(bool FullPath) const
}
// ************ CPropertyStruct ************
void CPropertyStruct::Copy(const IProperty *pkProp)
{
const CPropertyStruct *pkSource = static_cast<const CPropertyStruct*>(pkProp);
for (auto it = mProperties.begin(); it != mProperties.end(); it++)
delete *it;
mProperties.resize(pkSource->mProperties.size());
for (u32 iSub = 0; iSub < mProperties.size(); iSub++)
mProperties[iSub] = pkSource->mProperties[iSub]->Clone(this);
}
IProperty* CPropertyStruct::PropertyByIndex(u32 index) const
{
return mProperties[index];

View File

@@ -41,8 +41,11 @@ public:
virtual EPropertyType Type() const = 0;
virtual TString ToString() const { return ""; }
virtual IPropertyValue* RawValue() { return nullptr; }
virtual void Copy(const IProperty *pkProp) = 0;
virtual IProperty* Clone(CPropertyStruct *pParent = 0) const = 0;
inline CPropertyStruct* Parent() const { return mpParent; }
inline void SetParent(CPropertyStruct *pParent) { mpParent = pParent; }
// These functions can't be in the header to avoid circular includes with IPropertyTemplate.h
IPropertyTemplate* Template() const;
@@ -71,6 +74,21 @@ public:
virtual TString ToString() const { return mValue.ToString(); }
virtual IPropertyValue* RawValue() { return &mValue; }
virtual void Copy(const IProperty *pkProp)
{
const TTypedProperty *pkCast = static_cast<const TTypedProperty*>(pkProp);
mValue.Set(pkCast->mValue.Get());
}
virtual TTypedProperty* Clone(CPropertyStruct *pParent) const
{
if (!pParent) pParent = mpParent;
TTypedProperty *pOut = new TTypedProperty(mpTemplate, pParent);
pOut->Copy(this);
return pOut;
}
inline PropType Get() const { return mValue.Get(); }
inline void Set(PropType v) { mValue.Set(v); }
};
@@ -107,6 +125,16 @@ public:
EPropertyType Type() const { return eStructProperty; }
virtual void Copy(const IProperty *pkProp);
virtual IProperty* Clone(CPropertyStruct *pParent) const
{
if (!pParent) pParent = mpParent;
CPropertyStruct *pOut = new CPropertyStruct(mpTemplate, pParent);
pOut->Copy(this);
return pOut;
}
// Inline
inline u32 Count() const { return mProperties.size(); }
inline void AddSubProperty(IProperty *pProp) { mProperties.push_back(pProp); }
@@ -134,6 +162,14 @@ public:
EPropertyType Type() const { return eArrayProperty; }
virtual IProperty* Clone(CPropertyStruct *pParent) const
{
if (!pParent) pParent = mpParent;
CArrayProperty *pOut = new CArrayProperty(mpTemplate, pParent);
pOut->Copy(this);
return pOut;
}
// Inline
inline void Reserve(u32 amount) { mProperties.reserve(amount); }