*/}}
Browse Source

Rack page deletion

YimingWu 1 year ago
parent
commit
b82e6812fc
5 changed files with 101 additions and 31 deletions
  1. 4 0
      la_interface.h
  2. 36 9
      resources/la_nodes_basic.c
  3. 5 0
      resources/la_properties.c
  4. 23 21
      resources/la_templates.c
  5. 33 1
      resources/la_tns_drivers.c

+ 4 - 0
la_interface.h

@@ -728,6 +728,7 @@ extern laPropContainer* LA_PC_SOCKET_OUT;
 extern laPropContainer* LA_PC_MAPPER;
 extern laPropContainer* LA_PROP_SOCKET_SOURCE;
 extern laPropContainer* LA_PROP_SOCKET_OUT;
+extern laPropContainer* LA_PC_RACK_PAGE;
 extern laProp* LA_PROP_CONTROLLER;
 
 #define LA_UI_NORMAL  0
@@ -1457,6 +1458,7 @@ extern laNodeCategory* LA_NODE_CATEGORY_COLOR;
 #define LA_PAGE_TRIGGER_ALWAYS 0
 #define LA_PAGE_TRIGGER_NONE   1
 
+NEED_STRUCTURE(tnsObject)
 STRUCTURE(laRackPage){
     laListItem Item;
     laSafeString* Name;
@@ -1464,6 +1466,7 @@ STRUCTURE(laRackPage){
     laListHandle Eval;
     laListHandle AlwaysBranchers;
     laSafeString* Script;
+    tnsObject* ParentObject;
     int RackType;
     int TriggerMode;
     int UseScript;
@@ -2063,6 +2066,7 @@ void laDestroyInSocket(laNodeInSocket* s);
 void laDestroyOutSocket(laNodeOutSocket* s);
 laNodeCategory* laAddNodeCategory(char* Name,laUiDefineFunc* Ui,int ForRackTypes);
 void laNodeCategoryAddNodeTypes(laNodeCategory* nc, ...);
+void laDestroyRack(laNodeRack* rr);
 laRackPage* laDuplicateRackPage(laRackPage* new_optional, laRackPage* from);
 
 

+ 36 - 9
resources/la_nodes_basic.c

@@ -994,6 +994,32 @@ int OPINV_RebuildInputMapping(laOperator* a, laEvent *e){
     laGraphRequestRebuild();
     return LA_FINISHED;
 }
+int OPCHK_RemoveInputMappingPage(laPropPack *This, laStringSplitor *ss){
+    if ((!This) || (la_EnsureSubTarget(This->LastPs->p,0) != LA_PC_RACK_PAGE)) return 0;
+    laRackPage* dp=This->EndInstance; if(dp->ParentObject) return 0;
+    return 1;
+}
+int OPINV_RemoveInputMappingPage(laOperator* a, laEvent *e){
+    laRackPage* dp=a->This?a->This->EndInstance:0; if((!dp) || dp->ParentObject) return LA_CANCELED;
+    if(strSame(strGetArgumentString(a->ExtraInstructionsP,"confirm"),"true")){
+        strSafeDestroy(&dp->Name);
+        while(dp->Racks.pFirst){ laDestroyRack(dp->Racks.pFirst); }
+        while(lstPopPointer(&dp->Eval)); while(lstPopPointer(&dp->AlwaysBranchers));
+        if(MAIN.InputMapping->CurrentPage==dp){
+            laRackPage* adp=dp->Item.pNext?dp->Item.pNext:dp->Item.pPrev;
+            memAssignRef(MAIN.InputMapping,&MAIN.InputMapping->CurrentPage,adp);
+        }laNotifyInstanceUsers(dp);
+        lstRemoveItem(&MAIN.InputMapping->Pages, dp); memLeave(dp);
+        laNotifyInstanceUsers(MAIN.InputMapping); laRecordAndPush(a->This,"","Remove input mapping page", 0);
+        return LA_FINISHED;
+    }
+    laEnableOperatorPanel(a,a->This,e->x,e->y,200,200,0,0,0,0,0,0,0,0,e);
+    return LA_RUNNING;
+}
+void laui_RemoveInputMappingPage(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *UNUSED, int context){
+    laColumn* c=laFirstColumn(uil);
+    laShowItemFull(uil,c,This,"remove_input_mapping_page",0,"confirm=true;text=Confirm",0,0);
+}
 
 laBaseNode* la_CreateNode(laNodeRack* ir, laBaseNodeType* NodeType){
     laBaseNode* bn=memAcquire(NodeType->NodeSize);
@@ -1001,11 +1027,7 @@ laBaseNode* la_CreateNode(laNodeRack* ir, laBaseNodeType* NodeType){
     laNotifyInstanceUsers(ir); laRecordInstanceDifferences(ir,"la_node_rack"); laPushDifferences("Add Node", 0);
     return bn;
 }
-void la_DestroyInputMapperNode(laBaseNode* bn){
-    lstRemoveItem(bn->InRack, bn); bn->Type->Destroy(bn);
-    laNotifyUsers("la.input_racks"); laRecordAndPush(0,"la.input_mapping","Delete node", 0);
-    memLeave(bn);
-}
+
 
 int OPINV_AddNode(laOperator* a, laEvent *e){
     laNodeRack* ir=a->This?a->This->EndInstance:0; if(!ir) return LA_CANCELED;
@@ -1091,9 +1113,7 @@ int OPINV_InsertRack(laOperator* a, laEvent *e){
 int OPINV_DeleteRack(laOperator* a, laEvent *e){
     laNodeRack* rr=a->This?a->This->EndInstance:0; if(!rr) return LA_CANCELED;
     if(strSame(strGetArgumentString(a->ExtraInstructionsP,"confirm"),"true")){
-        laBaseNode* n; while(n=lstPopItem(&rr->Nodes)){ n->Type->Destroy(n); memLeave(n); }
-        laRackPage* page=rr->ParentPage;
-        strSafeDestroy(&rr->Name); lstRemoveItem(&rr->ParentPage->Racks, rr); memLeave(rr);
+        laRackPage* page=rr->ParentPage; laDestroyRack(rr);
         laNotifyInstanceUsers(page); laRecordInstanceDifferences(page,"la_rack_page"); laPushDifferences("Delete Rack", 0);
         return LA_FINISHED;
     }
@@ -1189,7 +1209,9 @@ void la_RegisterInputMapperOperators(){
     laCreateOperatorType("LA_insert_rack", "Insert Rack", "Insert a new rack",0,0,0,OPINV_InsertRack,0,0,0);
     at=laCreateOperatorType("LA_delete_rack", "Delete Rack", "Delete a rack",0,0,0,OPINV_DeleteRack,OPMOD_FinishOnData,U'❌',0);
     at->UiDefine=laui_DeleteRack;
-
+    laCreateOperatorType("LA_remove_input_mapping_page", "Remove Page", "Remove a input mapper page",OPCHK_RemoveInputMappingPage,0,0,OPINV_RemoveInputMappingPage,OPMOD_FinishOnData,L'🗴',0)
+        ->UiDefine=laui_RemoveInputMappingPage;
+    
     pc=laAddPropertyContainer("la_node_rack", "Input Rack", "Input rack for putting input mapping nodes",0,0,sizeof(laNodeRack),0,0,1);
     laAddStringProperty(pc,"name","Name","Name of this rack",0,0,0,0,1,offsetof(laNodeRack,Name),0,0,0,0,LA_AS_IDENTIFIER);
     p=laAddSubGroup(pc,"nodes","Nodes","Nodes under this rack","la_base_node",laget_BaseNodeType,0,0,-1,0,0,0,0,0,0,offsetof(laNodeRack,Nodes),0);
@@ -1576,6 +1598,11 @@ void laNodeCategoryAddNodeTypes(laNodeCategory* nc, ...){
     va_end(list);
 }
 
+void laDestroyRack(laNodeRack* rr){
+    laBaseNode* n; while(n=lstPopItem(&rr->Nodes)){ n->Type->Destroy(n); memLeave(n); }
+    laRackPage* page=rr->ParentPage;
+    strSafeDestroy(&rr->Name); lstRemoveItem(&rr->ParentPage->Racks, rr); memLeave(rr);
+}
 laRackPage* laDuplicateRackPage(laRackPage* new_optional, laRackPage* from){
     laRackPage* nr=new_optional?new_optional:memAcquire(sizeof(laRackPage));
     strSafeSet(&nr->Name,from->Name?from->Name->Ptr:0);

+ 5 - 0
resources/la_properties.c

@@ -858,6 +858,7 @@ laPropContainer* LA_PC_SOCKET_OUT;
 laPropContainer* LA_PROP_SOCKET_SOURCE;
 laPropContainer* LA_PROP_SOCKET_OUT;
 laPropContainer* LA_PC_MAPPER;
+laPropContainer* LA_PC_RACK_PAGE;
 laPropContainer* TNS_PC_OBJECT_GENERIC;
 laPropContainer* TNS_PC_OBJECT_INSTANCER;
 laPropContainer* TNS_PC_OBJECT_CAMERA;
@@ -1065,11 +1066,13 @@ void la_RegisterInternalProps(){
         }
 
         p = laAddPropertyContainer("la_rack_page", "Rack Page", "A page of nodes", 0,laui_IdentifierOnly, sizeof(laRackPage), 0,0,1);{
+            LA_PC_RACK_PAGE = p;
             laPropContainerExtraFunctions(p,0,lareset_RackPage,0,0,0);
             laAddStringProperty(p, "name", "Name", "Name of the page", 0,0,0,0,1, offsetof(laRackPage, Name), 0,0,0,0,LA_AS_IDENTIFIER);
             laAddIntProperty(p,"type", "Type", "Type of the rack", 0,0,0,0,0,0,0,0,offsetof(laRackPage,RackType),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
             laAddIntProperty(p,"has_rack", "Has Rack", "Has rack", 0,0,0,0,0,0,0,0,offsetof(laRackPage,Racks.pFirst),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY|LA_UDF_IGNORE);
             laAddSubGroup(p, "racks", "Racks", "Racks for nodes","la_node_rack",0,0,0,-1,0,0,0,0,0,0,offsetof(laRackPage,Racks),0);
+            laAddSubGroup(p, "parent_object", "Parent Object", "Parent object of this page","tns_object",0,0,0,offsetof(laRackPage,ParentObject),0,0,0,0,0,0,0,LA_READ_ONLY|LA_UDF_REFER);
             ep=laAddEnumProperty(p, "trigger", "Trigger", "Trigger evaluation on event",0,0,0,0,0,offsetof(laRackPage,TriggerMode),0,0,0,0,0,0,0,0,0,0);
             laAddEnumItemAs(ep, "ALWAYS", "Always", "Always evalueave this page",LA_PAGE_TRIGGER_ALWAYS,0);
             laAddEnumItemAs(ep, "NONE", "None", "This page is only evaluated when called from other pages",LA_PAGE_TRIGGER_NONE,0);
@@ -1078,6 +1081,8 @@ void la_RegisterInternalProps(){
             laAddEnumItemAs(ep, "SCRIPT", "Script", "Use scripts to express logic",1,0);
             laAddStringProperty(p, "script", "Script", "Script content",LA_WIDGET_STRING_MULTI,0,0,0,1,offsetof(laRackPage, Script), 0,0,0,0,0);
             laAddOperatorProperty(p,"add_rack","Add Rack", "Add a rack into the page", "LA_add_rack", '+', 0);
+            laAddOperatorProperty(p,"remove_driver_page","Remove Page", "Remove this page", "LA_remove_driver_page", L'🗴', 0);
+            laAddOperatorProperty(p,"remove_input_mapping_page","Remove Page", "Remove this page", "LA_remove_input_mapping_page", L'🗴', 0);
         }
 
         //p = laAddPropertyContainer("udf_fail_node", "UDF Failed Node", "Single Wild Data Block Reference", laui_UDFFailNodeItem, sizeof(laUDFFailNode), 0,0,0,0,0); {

+ 23 - 21
resources/la_templates.c

@@ -1458,23 +1458,24 @@ void lauidetached_GameController(laPanel* p){
     la_MakeDetachedProp(p, "la.controllers", "controllers");
 }
 void laui_InputMapper(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *UNUSED, int context){
-    laColumn* c=laFirstColumn(uil),*cl, *cr;
-    laSplitColumn(uil,c,0.6); cl=laLeftColumn(c,0); cr=laRightColumn(c,0);
-    
-    laUiItem* b=laBeginRow(uil,cl,0,0);
-    laUiItem* b2=laOnConditionThat(uil,cl,laPropExpression(0,"la.input_mapping.pages"));{
-        laUiItem* b3=laOnConditionThat(uil,cl,laPropExpression(0,"la.input_mapping.current_page"));{
-            laShowItem(uil,cr,0,"la.input_mapping.current_page.name")->Expand=1;
-            laShowItem(uil,c,Extra,"LA_input_mapping_rebuild")->Flags|=LA_UI_FLAGS_ICON;
-        }laEndCondition(uil,b3);
-    }laEndCondition(uil,b2);
-    laShowItem(uil,cl,0,"LA_add_input_mapping_page")->Flags|=LA_UI_FLAGS_ICON;
+    laColumn* c=laFirstColumn(uil);
+    laUiItem* b=laBeginRow(uil,c,0,0);
+    laShowItemFull(uil,c,0,"la.input_mapping.pages",LA_WIDGET_COLLECTION_SELECTOR,0,0,0)
+        ->Flags|=LA_UI_COLLECTION_SIMPLE_SELECTOR;
+    laUiItem* b3=laOnConditionThat(uil,c,laPropExpression(0,"la.input_mapping.current_page"));{
+        laShowItem(uil,c,0,"la.input_mapping.current_page.name");
+        laShowItem(uil,c,0,"LA_add_input_mapping_page")->Flags|=LA_UI_FLAGS_ICON;
+        laShowItem(uil,c,Extra,"LA_input_mapping_rebuild")->Flags|=LA_UI_FLAGS_ICON;
+        laShowSeparator(uil,c);
+        laUiItem* cp=laShowInvisibleItem(uil,c,0,"la.input_mapping.current_page");
+        laShowItem(uil,c,&cp->PP,"remove_input_mapping_page")->Flags|=LA_UI_FLAGS_ICON;;
+    }laElse(uil,b3);{
+        laShowItem(uil,c,0,"LA_add_input_mapping_page");
+    }laEndCondition(uil,b3);
     laEndRow(uil,b);
-    b2=laOnConditionThat(uil,cr,laPropExpression(0,"la.input_mapping.pages"));{
-        laShowItemFull(uil,cr,0,"la.input_mapping.pages",LA_WIDGET_COLLECTION_SELECTOR,0,0,0);
-    }laEndCondition(uil,b2);
-    
-    laShowItemFull(uil,c,0,"la.input_mapping.current_page",LA_WIDGET_COLLECTION_SINGLE,0,laui_RackPage,0)->Flags|=LA_UI_FLAGS_NO_DECAL;
+    b3=laOnConditionThat(uil,c,laPropExpression(0,"la.input_mapping.current_page"));{
+        laShowItemFull(uil,c,0,"la.input_mapping.current_page",LA_WIDGET_COLLECTION_SINGLE,0,laui_RackPage,0)->Flags|=LA_UI_FLAGS_NO_DECAL;
+    }laEndCondition(uil,b3);
 }
 void lauidetached_Drivers(laPanel* p){
     la_MakeDetachedProp(p, "la.detached_view_switch", "detached");
@@ -1491,13 +1492,14 @@ void laui_Drivers(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *
     laUiItem* b2=laOnConditionThat(uil,cl,laPropExpression(&rb->PP,""));{\
         laUiItem* b=laBeginRow(uil,cr,0,0);\
         laUiItem* b3=laOnConditionThat(uil,cl,laPropExpression(&rb->PP,"drivers.current_page"));{\
-            laShowItemFull(uil,cr,&rb->PP,"drivers.current_page",LA_WIDGET_COLLECTION_SELECTOR,0,laui_IdentifierOnly,0)\
-                ->Flags|=LA_UI_COLLECTION_SIMPLE_SELECTOR;\
-            laShowItem(uil,cr,&rb->PP,"drivers.current_page.name");\
+            laUiItem* cp=laShowItemFull(uil,cr,&rb->PP,"drivers.current_page",LA_WIDGET_COLLECTION_SELECTOR,0,laui_IdentifierOnly,0);\
+                cp->Flags|=LA_UI_COLLECTION_SIMPLE_SELECTOR;\
+            laShowItem(uil,cr,&cp->PP,"name");\
             laShowItem(uil,cr,&rb->PP,"add_driver_page")->Flags|=LA_UI_FLAGS_ICON;\
+            laShowItem(uil,cr,&cp->PP,"remove_driver_page")->Flags|=LA_UI_FLAGS_ICON;\
             laShowSeparator(uil,cr);\
-            laShowItem(uil,cr,&rb->PP,"drivers.current_page.trigger");\
-            laShowItemFull(uil,cr,&rb->PP,"drivers.current_page.use_script",0,"icon=📃",0,0)\
+            laShowItem(uil,cr,&cp->PP,"trigger");\
+            laShowItemFull(uil,cr,&cp->PP,"use_script",0,"icon=📃",0,0)\
                 ->Flags|=LA_UI_FLAGS_HIGHLIGHT|LA_UI_FLAGS_CYCLE|LA_UI_FLAGS_ICON;\
         }laElse(uil,b3);{\
             laShowItem(uil,cr,&rb->PP,"add_driver_page")->Flags|=LA_UI_FLAGS_ICON;\

+ 33 - 1
resources/la_tns_drivers.c

@@ -149,10 +149,40 @@ int OPINV_AddDriverPage(laOperator* a, laEvent *e){
     laRackPage* dp=memAcquire(sizeof(laRackPage));
     strSafeSet(&dp->Name,"New Page");
     lstAppendItem(&ob->Drivers->Pages, dp);
-    memAssignRef(ob->Drivers,&ob->Drivers->CurrentPage,dp); dp->RackType=LA_RACK_TYPE_DRIVER;
+    memAssignRef(dp,&dp->ParentObject,ob); memAssignRef(ob->Drivers,&ob->Drivers->CurrentPage,dp);
+    dp->RackType=LA_RACK_TYPE_DRIVER;
     laNotifyInstanceUsers(ob->Drivers); laRecordAndPush(a->This,"","Add driver page", 0);
     return LA_FINISHED;
 }
+int OPCHK_RemoveDriverPage(laPropPack *This, laStringSplitor *ss){
+    if ((!This) || (la_EnsureSubTarget(This->LastPs->p,0) != LA_PC_RACK_PAGE)) return 0;
+    laRackPage* dp=This->EndInstance; if(!dp->ParentObject) return 0;
+    return 1;
+}
+int OPINV_RemoveDriverPage(laOperator* a, laEvent *e){
+    laRackPage* dp=a->This?a->This->EndInstance:0; if(!dp || !dp->ParentObject) return LA_CANCELED;
+    tnsObject* ob=dp->ParentObject;
+
+    if(strSame(strGetArgumentString(a->ExtraInstructionsP,"confirm"),"true")){
+        strSafeDestroy(&dp->Name);
+        while(dp->Racks.pFirst){ laDestroyRack(dp->Racks.pFirst); }
+        while(lstPopPointer(&dp->Eval)); while(lstPopPointer(&dp->AlwaysBranchers));
+        if(dp->ParentObject->Drivers->CurrentPage==dp){
+            laRackPage* adp=dp->Item.pNext?dp->Item.pNext:dp->Item.pPrev;
+            memAssignRef(dp->ParentObject->Drivers,&dp->ParentObject->Drivers->CurrentPage,adp);
+        }laNotifyInstanceUsers(dp);
+        lstRemoveItem(&dp->ParentObject->Drivers->Pages, dp); memLeave(dp);
+        laNotifyInstanceUsers(ob->Drivers); laRecordAndPush(a->This,"","Remove driver page", 0);
+        return LA_FINISHED;
+    }
+    laEnableOperatorPanel(a,a->This,e->x,e->y,200,200,0,0,0,0,0,0,0,0,e);
+    return LA_RUNNING;
+}
+void laui_RemoveDriverPage(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *UNUSED, int context){
+    laColumn* c=laFirstColumn(uil);
+    laShowItemFull(uil,c,This,"remove_driver_page",0,"confirm=true;text=Confirm",0,0);
+}
+
 int OPINV_RebuildDrivers(laOperator* a, laEvent *e){
     laGraphRequestRebuild();
     return LA_FINISHED;
@@ -168,6 +198,8 @@ void tns_RegisterNodes(){
     laEnumProp *ep;
 
     laCreateOperatorType("LA_add_driver_page", "New Page", "Add a driver page",OPCHK_AddDriverPage,0,0,OPINV_AddDriverPage,0,'+',0);
+    laCreateOperatorType("LA_remove_driver_page", "Remove Page", "Remove a driver page",OPCHK_RemoveDriverPage,0,0,OPINV_RemoveDriverPage,OPMOD_FinishOnData,L'🗴',0)
+        ->UiDefine=laui_RemoveDriverPage;
     laCreateOperatorType("LA_driver_rebuild", "Rebuild Drivers", "Rebuild drivers for evaluation",0,0,0,OPINV_RebuildDrivers,0,U'⭮',0);
 
     pc=laAddPropertyContainer("tns_transform_node", "Transform", "Transform objects",0,tnsui_TransformNode,sizeof(tnsTransformNode),lapost_Node,0,1);