|
@@ -548,6 +548,26 @@ void* laget_InstanceActiveUDF(void* instance){
|
|
if(level==2) return m->FromFile;
|
|
if(level==2) return m->FromFile;
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
+void* laget_DummyManagedUDFSingle(void* unused){
|
|
|
|
+ return MAIN.DummyManageUDFSingle;
|
|
|
|
+}
|
|
|
|
+void* laget_DummyManagedUDFSingleForce(void* unused){
|
|
|
|
+ return MAIN.DummyManageUDFSingleForce;
|
|
|
|
+}
|
|
|
|
+void laset_InstanceUDFFromSingle(void* instance, laUDF* udf){
|
|
|
|
+ if(!MAIN._CONTAINER_SETTING || !MAIN._CONTAINER_SETTING->UDFPropagate || !instance){ return; }
|
|
|
|
+ if(udf == MAIN.DummyManageUDF){
|
|
|
|
+ laInvoke(0, "LA_managed_save_new_file", 0,0,0,0);
|
|
|
|
+ }
|
|
|
|
+ MAIN._CONTAINER_SETTING->UDFPropagate(instance,udf,0);
|
|
|
|
+}
|
|
|
|
+void laset_InstanceUDFFromSingleForce(void* instance, laUDF* udf){
|
|
|
|
+ if(!MAIN._CONTAINER_SETTING || !MAIN._CONTAINER_SETTING->UDFPropagate || !instance){ return; }
|
|
|
|
+ if(udf == MAIN.DummyManageUDF){
|
|
|
|
+ laInvoke(0, "LA_managed_save_new_file", 0,0,0,0);
|
|
|
|
+ }
|
|
|
|
+ MAIN._CONTAINER_SETTING->UDFPropagate(instance,udf,0);
|
|
|
|
+}
|
|
void laset_InstanceUDF(void* instance, void* set){
|
|
void laset_InstanceUDF(void* instance, void* set){
|
|
int level; laMemNodeHyper* m=memGetHead(instance,&level);
|
|
int level; laMemNodeHyper* m=memGetHead(instance,&level);
|
|
if(level==2) memAssignRef(instance, &m->FromFile, set);
|
|
if(level==2) memAssignRef(instance, &m->FromFile, set);
|
|
@@ -570,6 +590,24 @@ void laset_InstanceUID(void* instance, char* buf){
|
|
if(!buf[0]) memCreateNUID(m);
|
|
if(!buf[0]) memCreateNUID(m);
|
|
sprintf(m->NUID.String,"%.30s",buf);
|
|
sprintf(m->NUID.String,"%.30s",buf);
|
|
}
|
|
}
|
|
|
|
+void* laget_SaverDummy(void* instance, laPropIterator* pi){
|
|
|
|
+ laSubProp* p=MAIN._PROP_SETTING; laListHandle* l = (((char*)instance)+p->ListHandleOffset);
|
|
|
|
+ if(!l->pFirst){
|
|
|
|
+ laSaverDummy* sd=memAcquireHyper(sizeof(laSaverDummy)); lstAppendItem(l,sd);
|
|
|
|
+ }
|
|
|
|
+ while(l->pFirst!=l->pLast){ memLeave(lstPopItem(l)); }
|
|
|
|
+ return l->pFirst;
|
|
|
|
+}
|
|
|
|
+laSaverDummy* laGetSaverDummy(void* instance, laSubProp* p){
|
|
|
|
+ laListHandle* l = (((char*)instance)+p->ListHandleOffset);
|
|
|
|
+ if(!l->pFirst){ laSaverDummy* sd=memAcquireHyper(sizeof(laSaverDummy)); lstAppendItem(l,sd); }
|
|
|
|
+ while(l->pFirst!=l->pLast){ memLeave(lstPopItem(l)); }
|
|
|
|
+ return l->pFirst;
|
|
|
|
+}
|
|
|
|
+void laPurgeSaverDummy(void* instance, laSubProp* p){
|
|
|
|
+ laListHandle* l = (((char*)instance)+p->ListHandleOffset);
|
|
|
|
+ while(l->pFirst){ memLeave(lstPopItem(l)); }
|
|
|
|
+}
|
|
void la_FreeProperty(laProp* p){
|
|
void la_FreeProperty(laProp* p){
|
|
laIntProp *ip;laFloatProp *fp;laEnumProp *ep;laSubProp *sp;
|
|
laIntProp *ip;laFloatProp *fp;laEnumProp *ep;laSubProp *sp;
|
|
if(p->DetachedPP.Go){
|
|
if(p->DetachedPP.Go){
|
|
@@ -634,7 +672,23 @@ void laPropContainerExtraFunctions(laPropContainer* pc, laContainerBeforeFreeF B
|
|
pc->BeforeFree=BeforeFree; pc->Reset=Reset; pc->UndoTouched=Touched; pc->UDFPropagate=UDFPropagate; pc->MenuUiDefine=MenuUi;
|
|
pc->BeforeFree=BeforeFree; pc->Reset=Reset; pc->UndoTouched=Touched; pc->UDFPropagate=UDFPropagate; pc->MenuUiDefine=MenuUi;
|
|
if(!pc->OtherAlloc && UDFPropagate){
|
|
if(!pc->OtherAlloc && UDFPropagate){
|
|
laAddOperatorProperty(pc,"__udf_propagate","Propagate","Propagate UDF to all child nodes", "LA_udf_propagate", 0,0);
|
|
laAddOperatorProperty(pc,"__udf_propagate","Propagate","Propagate UDF to all child nodes", "LA_udf_propagate", 0,0);
|
|
|
|
+ laAddSubGroup(pc,"__single_udf_propagate","Save to","Assign file to all child nodes (From a ingle-instanced parent)","managed_udf",
|
|
|
|
+ 0,LA_WIDGET_COLLECTION_SELECTOR,laui_ManagedUDFItem,-1,laget_InstanceUDF,laget_DummyManagedUDFSingle,laget_ListNext,laset_InstanceUDFFromSingle,0,0,0,LA_UDF_REFER|LA_UDF_IGNORE);
|
|
|
|
+ //laAddSubGroup(pc,"__single_udf_propagate_force","Force","Assign file to all child nodes (From a ingle-instanced parent)","managed_udf",
|
|
|
|
+ // 0,LA_WIDGET_COLLECTION_SELECTOR,laui_ManagedUDFItem,-1,laget_InstanceUDF,laget_DummyManagedUDFSingleForce,laget_ListNext,laset_InstanceUDFFromSingleForce,0,0,0,LA_UDF_REFER|LA_UDF_IGNORE);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+laProp* laPropContainerManageable(laPropContainer* pc, int offset_of_dummy_list){
|
|
|
|
+ if(!pc || pc->OtherAlloc || !offset_of_dummy_list) return;
|
|
|
|
+
|
|
|
|
+ if(!MAIN.SaverDummyContainer){
|
|
|
|
+ MAIN.SaverDummyContainer = laAddPropertyContainer("la_saver_dummy","Saver Dummy","Saver dummy",0,0,sizeof(laSaverDummy),0,0,2);
|
|
|
|
+ laAddSubGroup(MAIN.SaverDummyContainer, "__file", "File", "The file this block came from/saves to", "managed_udf",
|
|
|
|
+ 0,LA_WIDGET_COLLECTION_SELECTOR,laui_ManagedUDFItem,-1,laget_InstanceUDF,laget_InstanceActiveUDF,laget_ListNext,laset_InstanceUDF,0,0,0,LA_UDF_REFER|LA_UDF_IGNORE);
|
|
}
|
|
}
|
|
|
|
+ pc->SaverDummy=laAddSubGroup(pc,"__single_saver_dummy","Saver","Saver dummy","la_saver_dummy",0,0,0,-1,0,0,0,0,0,0,offset_of_dummy_list,0);
|
|
|
|
+ return pc->SaverDummy;
|
|
}
|
|
}
|
|
|
|
|
|
int la_GetPropertySize(int Type){
|
|
int la_GetPropertySize(int Type){
|
|
@@ -1836,6 +1890,8 @@ void *laGetActiveInstance(laProp *sub, void *FromInstance, laPropIterator *Iter)
|
|
void laSetActiveInstance(laProp *sub, void *FromInstance, void *Instance){
|
|
void laSetActiveInstance(laProp *sub, void *FromInstance, void *Instance){
|
|
laSubProp *sp = sub;
|
|
laSubProp *sp = sub;
|
|
if (sub->PropertyType == LA_PROP_SUB){
|
|
if (sub->PropertyType == LA_PROP_SUB){
|
|
|
|
+ MAIN._CONTAINER_SETTING=sub->Container;
|
|
|
|
+ MAIN._PROP_SETTING=sub;
|
|
if (sp->Base.DetachedPP.LastPs){
|
|
if (sp->Base.DetachedPP.LastPs){
|
|
memAssignRef(sp, &sp->Detached, Instance);
|
|
memAssignRef(sp, &sp->Detached, Instance);
|
|
laNotifySubPropUsers(sp, FromInstance);
|
|
laNotifySubPropUsers(sp, FromInstance);
|
|
@@ -1949,6 +2005,10 @@ void laMarkPropChanged(laPropPack* pp){
|
|
}
|
|
}
|
|
laMarkPropChanged(pp->RawThis);
|
|
laMarkPropChanged(pp->RawThis);
|
|
}
|
|
}
|
|
|
|
+void laMarkMemChanged(void* memuser){
|
|
|
|
+ int level; laMemNodeHyper* m=memGetHead(memuser,&level); if(level!=2) return;
|
|
|
|
+ m->Modified=1;
|
|
|
|
+}
|
|
|
|
|
|
laPropContainer *la_SetGeneralRoot(laPropContainer **GeneralRoot, const char *Identifier, const char *Name, const char *Description){
|
|
laPropContainer *la_SetGeneralRoot(laPropContainer **GeneralRoot, const char *Identifier, const char *Name, const char *Description){
|
|
laPropContainer* ret =memAcquire(sizeof(laPropContainer));
|
|
laPropContainer* ret =memAcquire(sizeof(laPropContainer));
|
|
@@ -3050,6 +3110,8 @@ int la_ExtractProp(laUDF *udf, laManagedUDF* mUDF, laPropPack *pp, void *ParentI
|
|
|
|
|
|
Instance = laGetInstance(p, pp->LastPs->UseInstance, &PI);
|
|
Instance = laGetInstance(p, pp->LastPs->UseInstance, &PI);
|
|
|
|
|
|
|
|
+ la_ResetInstance(Instance, p->SubProp);
|
|
|
|
+
|
|
if (ItemType == LA_UDF_HYPER_ITEM){
|
|
if (ItemType == LA_UDF_HYPER_ITEM){
|
|
if (p->SubProp->Hyper == 2){
|
|
if (p->SubProp->Hyper == 2){
|
|
if (!Parent && !IsExceptionNode) la_ReadHyperData(udf, Instance);
|
|
if (!Parent && !IsExceptionNode) la_ReadHyperData(udf, Instance);
|
|
@@ -3108,7 +3170,7 @@ int la_ExtractProp(laUDF *udf, laManagedUDF* mUDF, laPropPack *pp, void *ParentI
|
|
if (udf){
|
|
if (udf){
|
|
RealSize = RealSize ? RealSize : p->SubProp->NodeSize;
|
|
RealSize = RealSize ? RealSize : p->SubProp->NodeSize;
|
|
if (!Parent && !IsExceptionNode){
|
|
if (!Parent && !IsExceptionNode){
|
|
- if (p->UDFIsSingle && pp->EndInstance){ Instance = pp->EndInstance; }
|
|
|
|
|
|
+ if (p->UDFIsSingle && pp->EndInstance){ Instance = pp->EndInstance; la_ResetInstance(Instance, pc); replaced=1; }
|
|
else{
|
|
else{
|
|
// if overwrite, find the instance here for hyper2, if not hyper 2 then notice can't overwrite.
|
|
// if overwrite, find the instance here for hyper2, if not hyper 2 then notice can't overwrite.
|
|
if (pc->Hyper == 2){
|
|
if (pc->Hyper == 2){
|
|
@@ -3172,7 +3234,9 @@ int la_ExtractProp(laUDF *udf, laManagedUDF* mUDF, laPropPack *pp, void *ParentI
|
|
if (pp->LastPs->UseInstance){
|
|
if (pp->LastPs->UseInstance){
|
|
if (!p->UDFIsSingle){
|
|
if (!p->UDFIsSingle){
|
|
if (((laSubProp *)p)->ListHandleOffset){
|
|
if (((laSubProp *)p)->ListHandleOffset){
|
|
- lstAppendItem((BYTE *)pp->LastPs->UseInstance + ((laSubProp *)p)->ListHandleOffset, Instance);
|
|
|
|
|
|
+ laListHandle* inst_lst=(BYTE *)pp->LastPs->UseInstance + ((laSubProp *)p)->ListHandleOffset;
|
|
|
|
+ if(p->Container->SaverDummy && p==p->Container->SaverDummy){ laPurgeSaverDummy(pp->LastPs->UseInstance,p); }
|
|
|
|
+ lstAppendItem(inst_lst, Instance);
|
|
}else{ lstAppendItem(&pc->FailedNodes, Instance); EStatus = 1; }
|
|
}else{ lstAppendItem(&pc->FailedNodes, Instance); EStatus = 1; }
|
|
}else{ if (!p->UDFNoCreate){ laSetActiveInstance(p, pp->LastPs->UseInstance, Instance); } }
|
|
}else{ if (!p->UDFNoCreate){ laSetActiveInstance(p, pp->LastPs->UseInstance, Instance); } }
|
|
if (ReadInstance == ActiveInstance) laSetActiveInstance(p, pp->LastPs->UseInstance, Instance);
|
|
if (ReadInstance == ActiveInstance) laSetActiveInstance(p, pp->LastPs->UseInstance, Instance);
|
|
@@ -3370,6 +3434,10 @@ laManagedUDF* la_EnsureManagedUDF(char* FileName, int PutAtTop){
|
|
}
|
|
}
|
|
void la_MakeDummyManagedUDF(){
|
|
void la_MakeDummyManagedUDF(){
|
|
MAIN.DummyManageUDF=la_EnsureManagedUDF("< Save as a new file >", 1);
|
|
MAIN.DummyManageUDF=la_EnsureManagedUDF("< Save as a new file >", 1);
|
|
|
|
+ if(!MAIN.DummyManageUDFSingle){
|
|
|
|
+ MAIN.DummyManageUDFSingle=memAcquire(sizeof(laManagedUDF)); strSafeSet(&MAIN.DummyManageUDFSingle->BaseName, "< Choose file >");
|
|
|
|
+ MAIN.DummyManageUDFSingleForce=memAcquire(sizeof(laManagedUDF)); strSafeSet(&MAIN.DummyManageUDFSingleForce->BaseName, "Force");
|
|
|
|
+ }
|
|
}
|
|
}
|
|
void laSaveProp(char* path){
|
|
void laSaveProp(char* path){
|
|
if(!path || !path[0]) return; laManagedSaveProp* msp=0;
|
|
if(!path || !path[0]) return; laManagedSaveProp* msp=0;
|
|
@@ -4154,7 +4222,10 @@ void la_FreeInstance(void* inst, laPropContainer* pc, int no_free){
|
|
}
|
|
}
|
|
if(!no_free && !pc->OtherAlloc) memFree(inst);
|
|
if(!no_free && !pc->OtherAlloc) memFree(inst);
|
|
}
|
|
}
|
|
-void la_ResetInstance(void* inst, laPropContainer* pc){ if(pc->Reset) pc->Reset(inst); else memset(inst,0,pc->NodeSize); }
|
|
|
|
|
|
+void la_ResetInstance(void* inst, laPropContainer* pc){
|
|
|
|
+ if(pc->SaverDummy)
|
|
|
|
+ if(pc->Reset) pc->Reset(inst); else memset(inst,0,pc->NodeSize);
|
|
|
|
+}
|
|
|
|
|
|
laListHandle* la_GetOriginalListHandle(laDiffCommandSub* dcs){
|
|
laListHandle* la_GetOriginalListHandle(laDiffCommandSub* dcs){
|
|
laProp*p =dcs->Base.p;
|
|
laProp*p =dcs->Base.p;
|