*/}}
Преглед изворни кода

Undo for UDFSingle

not sure if it is "really" solid but takes care of previous issue.

still need to verify whether "instance reset" all works.
YimingWu пре 3 дана
родитељ
комит
52894a272b
4 измењених фајлова са 25 додато и 9 уклоњено
  1. 20 4
      la_data.c
  2. 2 2
      la_tns_kernel.c
  3. 1 1
      resources/la_nodes_basic.c
  4. 2 2
      resources/la_operators.c

+ 20 - 4
la_data.c

@@ -2039,6 +2039,9 @@ void laSetActiveInstance(laProp *sub, void *FromInstance, void *Instance){
             laNotifySubPropUsers(sp, FromInstance);
             sp->Set(FromInstance, Instance);
         }
+        if(sub->OffsetIsPointer && sub->Offset==0){
+            printf("where did that come from\n");
+        }
         if (sub->OffsetIsPointer && sub->Offset>=0){
             void **a = (void **)((BYTE *)FromInstance + sub->Offset);
             laNotifySubPropUsers(sp, FromInstance);
@@ -4137,7 +4140,7 @@ void la_FreeDBInst(laDBInst* dbi, int no_freeinst, int cleanup_only, int SkipIns
 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)&&(!SkipInstances)){
+        if((((laSubProp*)dbp->p)->ListHandleOffset||dbp->p->UDFNoCreate)&&(!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),cleanup_only,SkipInstances); }
@@ -4162,7 +4165,7 @@ void la_FreeDBInst(laDBInst* dbi, int no_freeinst, int cleanup_only, int SkipIns
 }
 void la_FreeDiffCommand(laDiffCommand* dc, laDiff* d, int FromLeft){
     //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)){
+    if(dc->p->PropertyType==LA_PROP_SUB && (((laSubProp*)dc->p)->ListHandleOffset||dc->p->UDFNoCreate) && (!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)),0,0); memFree(dci); }
         while(dci=lstPopItem(&dcs->MovedInst)){ memFree(dci); }
@@ -4252,7 +4255,7 @@ laDiffCommand* la_GiveDiffCommand(laDiff* diff, laDBInst* Instance, laProp* p, v
         if(dc->Instance == Instance && dc->p == p) return dc;
     }
     int size=sizeof(laDiffCommand);
-    if(p->PropertyType==LA_PROP_SUB && (!(p->UDFIsRefer||p->UDFIsSingle||p->UDFNoCreate))){size=sizeof(laDiffCommandSub);}
+    if(p->PropertyType==LA_PROP_SUB && (!(p->UDFIsRefer||p->UDFNoCreate))){size=sizeof(laDiffCommandSub);}
     elif(p->PropertyType==LA_PROP_RAW){size=sizeof(laDiffCommandRaw);}
     laDiffCommand* dc = memAcquire(size);
     dc->Instance=Instance; dc->p=p; dc->Data = Data;
@@ -4347,7 +4350,6 @@ int la_GenerateListDifferences(laDBInst* dbi, laDBSubProp* dbp, laPropPack* pp,
     inst = laGetInstance(p, pp->LastPs->UseInstance, &pi);
     pp->EndInstance = inst;
     while (inst){
-        if(p->UDFIsSingle){ memTake(inst); /* For single must take or it will be freed. */ }
         lstAppendPointer(&New, inst);
         inst = laGetNextInstance(p, inst, &pi);
         pp->EndInstance = inst;
@@ -4606,6 +4608,13 @@ laListHandle* la_GetOriginalListHandle(laDiffCommandSub* dcs){
 
 void la_UndoListDifferences(laDBSubProp* dsp, laDiffCommandSub* dcs){
     laListHandle* ol=la_GetOriginalListHandle(dcs);
+    if(dsp->p->UDFIsSingle){ laSubProp* sp=dsp->p;
+        if(ol){ logPrintNew("DSP \"%s\" is single but has list handle. Wrong!\n",sp->Base.Identifier); }
+        laDiffCommandInst* dci_added=dcs->AddedInst.pFirst;
+        laDiffCommandInst* dci_removed=dcs->RemovedInst.pFirst;
+        laSetActiveInstance(sp,dcs->Base.Instance->OriginalInstance,dci_removed?dci_removed->DBInst->OriginalInstance:0);
+        return;
+    }
     for(laDiffCommandInst* dci=dcs->AddedInst.pFirst;dci;dci=dci->Item.pNext){
         if(dcs->Base.p->UDFNoCreate){ la_ResetInstance(dci->DBInst->OriginalInstance,dci->DBInst->pc,((laSubProp*)dcs->Base.p)->ListHandleOffset?1:0); continue; }
         dci->OriginalPrev = dci->DBInst->Item.pPrev; dci->OriginalNext = dci->DBInst->Item.pNext;
@@ -4638,6 +4647,13 @@ void la_UndoListDifferences(laDBSubProp* dsp, laDiffCommandSub* dcs){
 }
 void la_RedoListDifferences(laDBSubProp* dsp, laDiffCommandSub* dcs){
     laListHandle* ol=la_GetOriginalListHandle(dcs);
+    if(dsp->p->UDFIsSingle){ laSubProp* sp=dsp->p;
+        if(ol){ logPrintNew("DSP \"%s\" is single but has list handle. Wrong!\n",sp->Base.Identifier); }
+        laDiffCommandInst* dci_added=dcs->AddedInst.pFirst;
+        laDiffCommandInst* dci_removed=dcs->RemovedInst.pFirst;
+        laSetActiveInstance(sp,dcs->Base.Instance->OriginalInstance,dci_added?dci_added->DBInst->OriginalInstance:0);
+        return;
+    }
     for(laDiffCommandInst* dci=dcs->RemovedInst.pFirst;dci;dci=dci->Item.pNext){
         if(dcs->Base.p->UDFNoCreate){ la_ResetInstance(dci->DBInst->OriginalInstance,dci->DBInst->pc,((laSubProp*)dcs->Base.p)->ListHandleOffset?1:0); continue; }
         //dci->OriginalPrev = dci->DBInst->Item.pPrev;

+ 2 - 2
la_tns_kernel.c

@@ -1870,7 +1870,7 @@ void tnsUseTexture(tnsTexture *t){
 #endif
 }
 void tnsUseTexture2(tnsTexture* t, int mixmode, int premultiplied){
-    if(!t){ T->StateTextureMode=TEX_MODE_IS_MIXING(T)?2:0; return; }
+    if(!t){ T->StateTextureMode=TEX_MODE_IS_MIXING(T)?2:0; T->StateTexColor2=0; return; }
     if(t->GLTexType == GL_TEXTURE_2D){ T->StateTexColor2=t; T->StateTextureMode=5+mixmode; }
     T->StatePremultiplied=premultiplied;
 }
@@ -3172,7 +3172,7 @@ int tns_ClipCharacterT2D(real* v, real* t){
 }
 void tnsDrawStringM(char *content, uint32_t* contentU, real Color[4], int L, int R, int T, uint64_t Flags){
     if(Flags&LA_TEXT_SHADOW){
-        int offset = FM->UsingFont->height*MAIN.UiScale/16.0f;
+        int offset = FM->UsingFont->height*MAIN.UiScale/12.0f;
         tnsDrawStringM(content, contentU, laAccentColor(LA_BT_SHADOW|LA_BT_TEXT), L+offset, R+offset, T+offset, Flags&(~LA_TEXT_SHADOW));
     }
     if(!FM->UsingFont){return;} if(Flags&(LA_TEXT_LCD_16|LA_TEXT_LCD_7)){

+ 1 - 1
resources/la_nodes_basic.c

@@ -438,7 +438,7 @@ void IDN_ValuesInit(laValuesNode* n, int NoCreate){
 }
 void IDN_ValuesDestroy(laValuesNode* n){
     strSafeDestroy(&n->Base.Name);
-    for(int i=0;i<8;i++){ laDestroyOutSocket(n->Out[i].Out); }
+    for(int i=0;i<8;i++){ laDestroyOutSocket(n->Out[i].Out); n->Out[i].Out=0; }
 }
 int IDN_ValuesVisit(laValuesNode* n, laNodeVisitInfo* vi){
     LA_GUARD_THIS_NODE(n,vi);

+ 2 - 2
resources/la_operators.c

@@ -993,12 +993,12 @@ int OPCHK_Redo(laPropPack *This, laStringSplitor *ss){
 }
 int OPINV_Undo(laOperator *a, laEvent *e){
     laUndo();
-    laPrintDBInstInfo();
+    //laPrintDBInstInfo();
     return LA_FINISHED;
 }
 int OPINV_Redo(laOperator *a, laEvent *e){
     laRedo();
-    laPrintDBInstInfo();
+    //laPrintDBInstInfo();
     return LA_FINISHED;
 }