|
@@ -721,7 +721,9 @@ laProp *la_CreateProperty(laPropContainer *Container, int Type, const char *Iden
|
|
|
|
|
|
return p;
|
|
|
}
|
|
|
-
|
|
|
+void la_ClearDetachedProp(laPanel* p){
|
|
|
+ laProp *np; while(np=lstPopItem(&p->PropLinkContainer->Props)){ free(np->Identifier); memFree(np); }
|
|
|
+}
|
|
|
laProp *la_MakeDetachedProp(laPanel* p, const char *From, const char *Rename){
|
|
|
laIntProp *ip;
|
|
|
laFloatProp *fp;
|
|
@@ -3712,18 +3714,19 @@ void laPushDifferences(char* Description, u64bit hint){
|
|
|
}
|
|
|
|
|
|
void la_FreeInstance(void* inst, laPropContainer* pc, int no_free);
|
|
|
-void la_FreeDBInst(laDBInst* dbi, int no_freeinst);
|
|
|
-void la_FreeDBProp(laDBProp* dbp){
|
|
|
- printf("free dbp %s %x\n",dbp->p->Identifier,dbp);
|
|
|
+void la_FreeDBInst(laDBInst* dbi, int no_freeinst, int cleanup_only, int SkipInstances);
|
|
|
+void la_FreeDBProp(laDBProp* dbp, int cleanup_only, int SkipInstances){
|
|
|
+ //printf("free dbp %s %x\n",dbp->p->Identifier,dbp);
|
|
|
if(dbp->p->PropertyType==LA_PROP_SUB){
|
|
|
- if((((laSubProp*)dbp->p)->ListHandleOffset||dbp->p->UDFNoCreate||dbp->p->UDFIsSingle)&&(!dbp->p->UDFIsRefer)){
|
|
|
+ if((((laSubProp*)dbp->p)->ListHandleOffset||dbp->p->UDFNoCreate||dbp->p->UDFIsSingle)&&(!dbp->p->UDFIsRefer)&&(!SkipInstances)){
|
|
|
laDBSubProp* dsp=dbp; laDBInst* si;
|
|
|
//printf("fdbp %s %x %x %x\n",dbp->p->Identifier,dsp->Instances.pFirst,dsp->Instances.pLast,((laListItem*)dsp->Instances.pFirst)->pNext);
|
|
|
- while(si=lstPopItem(&dsp->Instances)){ la_FreeDBInst(si,dbp->p->UDFNoCreate||(!dbp->p->OffsetIsPointer)); }
|
|
|
+ while(si=lstPopItem(&dsp->Instances)){ la_FreeDBInst(si,dbp->p->UDFNoCreate||(!dbp->p->OffsetIsPointer),cleanup_only,SkipInstances); }
|
|
|
} // prevent freeing the data;
|
|
|
}elif(dbp->p->PropertyType==LA_PROP_STRING && ((laStringProp*)dbp->p)->IsSafeString){
|
|
|
strSafeSet(&dbp->Data,0);
|
|
|
}elif(dbp->p->PropertyType==LA_PROP_RAW){
|
|
|
+ printf("raw dbp %s\n",dbp->p->Identifier);
|
|
|
free(dbp->Data);
|
|
|
}else{
|
|
|
//printf("-data- %x\n",dbp->Data);
|
|
@@ -3731,23 +3734,24 @@ void la_FreeDBProp(laDBProp* dbp){
|
|
|
}
|
|
|
memFree(dbp);
|
|
|
}
|
|
|
-void la_FreeDBInst(laDBInst* dbi, int no_freeinst){
|
|
|
+void la_FreeDBInst(laDBInst* dbi, int no_freeinst, int cleanup_only, int SkipInstances){
|
|
|
laListHandle* l=hsh65536DoHashLongPtr(MAIN.DBInstLink,dbi->OriginalInstance); lstRemoveItem(l, &dbi->Item2);
|
|
|
- printf("free dbi %s %x\n", dbi->pc->Identifier,dbi);
|
|
|
- laDBProp* dbp; while(dbp=lstPopItem(&dbi->Props)){ la_FreeDBProp(dbp); }
|
|
|
- if(dbi->OriginalInstance) la_FreeInstance(dbi->OriginalInstance, dbi->pc, no_freeinst);
|
|
|
+ //printf("free dbi %s %x\n", dbi->pc->Identifier,dbi);
|
|
|
+ laDBProp* dbp; while(dbp=lstPopItem(&dbi->Props)){ la_FreeDBProp(dbp, cleanup_only,SkipInstances); }
|
|
|
+ if(dbi->OriginalInstance && (!cleanup_only)) la_FreeInstance(dbi->OriginalInstance, dbi->pc, no_freeinst);
|
|
|
memFree(dbi);
|
|
|
}
|
|
|
void la_FreeDiffCommand(laDiffCommand* dc, laDiff* d, int FromLeft){
|
|
|
- printf("freedc %s\n",dc->p->Identifier);
|
|
|
+ //printf("freedc %s\n",dc->p->Identifier);
|
|
|
if(dc->p->PropertyType==LA_PROP_SUB && (((laSubProp*)dc->p)->ListHandleOffset||dc->p->UDFNoCreate||dc->p->UDFIsSingle) && (!dc->p->UDFIsRefer)){
|
|
|
laDiffCommandInst* dci; laDiffCommandSub* dcs=dc;
|
|
|
- while(dci=lstPopItem(&dcs->AddedInst)){ if(!FromLeft) la_FreeDBInst(dci->DBInst,(dc->p->UDFNoCreate||(!dc->p->OffsetIsPointer))); memFree(dci); }
|
|
|
+ while(dci=lstPopItem(&dcs->AddedInst)){ if(!FromLeft) la_FreeDBInst(dci->DBInst,(dc->p->UDFNoCreate||(!dc->p->OffsetIsPointer)),0,0); memFree(dci); }
|
|
|
while(dci=lstPopItem(&dcs->MovedInst)){ memFree(dci); }
|
|
|
- while(dci=lstPopItem(&dcs->RemovedInst)){ if(FromLeft) la_FreeDBInst(dci->DBInst,(dc->p->UDFNoCreate||(!dc->p->OffsetIsPointer))); memFree(dci); }
|
|
|
+ while(dci=lstPopItem(&dcs->RemovedInst)){ if(FromLeft) la_FreeDBInst(dci->DBInst,(dc->p->UDFNoCreate||(!dc->p->OffsetIsPointer)),0,1); memFree(dci); }
|
|
|
}elif(dc->p->PropertyType==LA_PROP_STRING && ((laStringProp*)dc->p)->IsSafeString){
|
|
|
strSafeSet(&dc->Data,0);
|
|
|
}elif(dc->p->PropertyType==LA_PROP_RAW){
|
|
|
+ printf("raw %s\n",dc->p->Identifier);
|
|
|
free(dc->Data);
|
|
|
}
|
|
|
memFree(dc);
|
|
@@ -3784,11 +3788,11 @@ void la_FreeOlderDifferences(int KeepHowMany){
|
|
|
}
|
|
|
void la_FreeAllDifferences(){
|
|
|
la_FreeNewerDifferences();
|
|
|
- la_FreeOlderDifferences(1); //XXX 0 seems to have problems
|
|
|
+ la_FreeOlderDifferences(1);
|
|
|
}
|
|
|
void la_NoLongerRecordUndo(){
|
|
|
la_FreeAllDifferences();
|
|
|
- laDBProp*dbp; while(dbp=lstPopItem(&MAIN.RootDBInst.Props)){ la_FreeDBProp(dbp); }
|
|
|
+ laDBProp*dbp; while(dbp=lstPopItem(&MAIN.RootDBInst.Props)){ la_FreeDBProp(dbp,1,0); }
|
|
|
laDBRecordedProp* p; while(p=lstPopItem(&MAIN.DBRecordedProps)){ strSafeDestroy(&p->OriginalPath); memFree(p); }
|
|
|
hshFree(&MAIN.DBInstLink);
|
|
|
}
|
|
@@ -3990,6 +3994,8 @@ int la_GenerateListDifferences(laDBInst* dbi, laDBSubProp* dbp, laPropPack* pp,
|
|
|
if(!dbi->Item.pPrev){dbp->Instances.pFirst=dbi;}
|
|
|
if(!dbi->Item.pNext){dbp->Instances.pLast=dbi;}
|
|
|
}
|
|
|
+
|
|
|
+ if(!New.pFirst){ dbp->Instances.pFirst=dbp->Instances.pLast=0; }
|
|
|
|
|
|
for(laDiffTemp* lip=NewDeleted.pFirst;lip;lip=lip->Item.pNext){
|
|
|
laDBInst* dbi=lip->p; lstAppendItem(&dc->RemovedInst, la_NewDiffCommandInst(dbi, lip->tPrev, lip->tNext));printf("deleted %x %x\n", dbi, dbi->OriginalInstance);
|
|
@@ -4140,7 +4146,7 @@ void la_FreeInstance(void* inst, laPropContainer* pc, int no_free){
|
|
|
//if(p->PropertyType!=LA_PROP_SUB) return;
|
|
|
//if(!p->SubProp || ((laSubProp*)p)->TargetID) p->SubProp=la_ContainerLookup(((laSubProp*)p)->TargetID);
|
|
|
//laPropContainer* pc=p->SubProp; if(((laSubProp*)p)->GetType) pc=((laSubProp*)p)->GetType(inst);
|
|
|
- printf("freeinst %s %x\n",pc->Name,inst);
|
|
|
+ //printf("freeinst %s %x\n",pc->Name,inst);
|
|
|
if(pc->BeforeFree) pc->BeforeFree(inst);
|
|
|
laPropStep SubPS = {0}; laPropPack SubPP = {0}; laPropIterator pi={0}; SubPP.LastPs=&SubPS;
|
|
|
for(laProp* p=pc->Props.pFirst;p;p=p->Item.pNext){
|