*/}}
Browse Source

Toolbox config resotre infrastructure

YimingWu 2 days ago
parent
commit
a5a9e143a0
6 changed files with 92 additions and 46 deletions
  1. 1 4
      la_data.c
  2. 8 0
      la_interface.h
  3. 11 2
      la_kernel.c
  4. 2 2
      resources/la_operators.c
  5. 10 4
      resources/la_properties.c
  6. 60 34
      resources/la_templates.c

+ 1 - 4
la_data.c

@@ -893,10 +893,7 @@ void la_ClearDetachedProp(laPanel* p){
     laProp *np; while(np=lstPopItem(&p->PropLinkContainer->Props)){ free(np->Identifier); memFree(np); }
     laProp *np; while(np=lstPopItem(&p->PropLinkContainer->Props)){ free(np->Identifier); memFree(np); }
 }
 }
 laProp *la_MakeDetachedProp(laPanel* p, const char *From, const char *Rename){
 laProp *la_MakeDetachedProp(laPanel* p, const char *From, const char *Rename){
-    laIntProp *ip;
-    laFloatProp *fp;
-    laEnumProp *ep;
-    laSubProp *sp;
+    laIntProp *ip; laFloatProp *fp; laEnumProp *ep; laSubProp *sp;
 
 
     laPropPack TempPP = {0};
     laPropPack TempPP = {0};
     int result = 0;
     int result = 0;

+ 8 - 0
la_interface.h

@@ -1146,6 +1146,8 @@ STRUCTURE(laConditionUiExtraData){
     char IsTrue;
     char IsTrue;
 };
 };
 
 
+#define LA_TEMPLATE_FLAGS_NO_DECORATION 1
+
 STRUCTURE(laUiTemplate){
 STRUCTURE(laUiTemplate){
     laListItem Item;
     laListItem Item;
     laSafeString *Title;
     laSafeString *Title;
@@ -1156,6 +1158,9 @@ STRUCTURE(laUiTemplate){
     laPanelDetachedPropFunc PropFunc;
     laPanelDetachedPropFunc PropFunc;
     int DefaultGLFormat;
     int DefaultGLFormat;
     int DefaultW_RH,DefaultH_RH;
     int DefaultW_RH,DefaultH_RH;
+    int Flags;
+    laStringGetF SaveOptions;
+    laStringSetF RestoreOptions;
     laKeyMapper KeyMap;
     laKeyMapper KeyMap;
 };
 };
 
 
@@ -1403,6 +1408,7 @@ STRUCTURE(laPanel){
 
 
     laSafeString *Title;
     laSafeString *Title;
     laUiTemplate *PanelTemplate;
     laUiTemplate *PanelTemplate;
+    laSafeString* ExtraInfo;
 
 
     laPropPack PP;
     laPropPack PP;
     laPropStep FakePS;
     laPropStep FakePS;
@@ -2422,6 +2428,7 @@ int la_InputMappingGetKeyFromName(char* name, int* special);
 laCustomSignal* laFindSignal(char* Name);
 laCustomSignal* laFindSignal(char* Name);
 laCustomSignal* laFindSignalByID(int ID);
 laCustomSignal* laFindSignalByID(int ID);
 void laInputMappingUpdateSignal(laInputMappingEntry* ime);
 void laInputMappingUpdateSignal(laInputMappingEntry* ime);
+laInputMapping* laFindToolbox(char* Name);
 laInputMapping* laNewInputMapping(char* Name);
 laInputMapping* laNewInputMapping(char* Name);
 laInputMappingEntry* laNewInputMappingEntry(laInputMapping* im, int DeviceType, int JoystickDevice, char* Key, int SpecialKeyBit, char* Signal);
 laInputMappingEntry* laNewInputMappingEntry(laInputMapping* im, int DeviceType, int JoystickDevice, char* Key, int SpecialKeyBit, char* Signal);
 laInputMappingEntry* laNewInputMappingEntryP(laInputMapping* im, int DeviceType, int JoystickDevice, char* Key, int SpecialKeyBit, int Signal);
 laInputMappingEntry* laNewInputMappingEntryP(laInputMapping* im, int DeviceType, int JoystickDevice, char* Key, int SpecialKeyBit, int Signal);
@@ -2610,6 +2617,7 @@ laUiTemplate *laFindUiTemplate(char *Identifier);
 void la_DestroyUiTemplate(laUiTemplate* uit);
 void la_DestroyUiTemplate(laUiTemplate* uit);
 void la_DestroyCanvasTemplate(laCanvasTemplate* uit);
 void la_DestroyCanvasTemplate(laCanvasTemplate* uit);
 laUiTemplate *laRegisterUiTemplate(char *Identifier, char* Title, laUiDefineFunc func,laPanelDetachedPropFunc PropFunc, laUiDefineFunc header, char* NewCategory, int DefaultGLFormat, int DefaultW_RH, int DefaultH_RH);
 laUiTemplate *laRegisterUiTemplate(char *Identifier, char* Title, laUiDefineFunc func,laPanelDetachedPropFunc PropFunc, laUiDefineFunc header, char* NewCategory, int DefaultGLFormat, int DefaultW_RH, int DefaultH_RH);
+void laUiTemplateSetExtras(laUiTemplate *uit, int flags, laStringGetF SaveOptions, laStringSetF RestoreOptions);
 laCanvasTemplate *laRegisterCanvasTemplate(char *Identifier, char *ForContainer, laModalFunc ExtraModal, laCanvasDrawFunc Func, laUiDrawFunc SecondDraw, laUiInitFunc CustomInit, laUiDestroyFunc CustomDestroy);
 laCanvasTemplate *laRegisterCanvasTemplate(char *Identifier, char *ForContainer, laModalFunc ExtraModal, laCanvasDrawFunc Func, laUiDrawFunc SecondDraw, laUiInitFunc CustomInit, laUiDestroyFunc CustomDestroy);
 
 
 laTheme *laDuplicateTheme(laTheme* from);
 laTheme *laDuplicateTheme(laTheme* from);

+ 11 - 2
la_kernel.c

@@ -1776,6 +1776,12 @@ void laInputMappingUpdateSignal(laInputMappingEntry* ime){
     char* signal = SSTR(ime->Signal);
     char* signal = SSTR(ime->Signal);
     laCustomSignal *cs=laFindSignal(signal); if(cs){ ime->SignalValue=cs->Signal; }else{ ime->SignalValue=0;}
     laCustomSignal *cs=laFindSignal(signal); if(cs){ ime->SignalValue=cs->Signal; }else{ ime->SignalValue=0;}
 }
 }
+laInputMapping* laFindToolbox(char* Name){
+    for(laInputMapping* im=MAIN.InputMapping->Toolboxes.pFirst;im;im=im->Item.pNext){
+        if(strSame(Name,SSTR(im->Name))) return im;
+    }
+    return 0;
+}
 laInputMapping* laNewInputMapping(char* Name){
 laInputMapping* laNewInputMapping(char* Name){
     laInputMapping* im=memAcquireHyper(sizeof(laInputMapping)); lstAppendItem(&MAIN.InputMapping->InputMappings,im);
     laInputMapping* im=memAcquireHyper(sizeof(laInputMapping)); lstAppendItem(&MAIN.InputMapping->InputMappings,im);
     memAssignRef(MAIN.InputMapping,&MAIN.InputMapping->CurrentInputMapping,im);
     memAssignRef(MAIN.InputMapping,&MAIN.InputMapping->CurrentInputMapping,im);
@@ -3579,7 +3585,7 @@ laPanel* laTearOffPanel(laBlock* b, laPanel* p_if_set){
     lstRemoveItem(&b->Panels, p);
     lstRemoveItem(&b->Panels, p);
     if(!b->CurrentPanel && b->parent){ b=b->parent; laCombineChildBlocks(b); }
     if(!b->CurrentPanel && b->parent){ b=b->parent; laCombineChildBlocks(b); }
 
 
-    if(!p->TitleBar.UiItems.pFirst){
+    if((!p->TitleBar.UiItems.pFirst) && p->PanelTemplate &&(!(p->PanelTemplate->Flags&LA_TEMPLATE_FLAGS_NO_DECORATION))){
         laui_DefaultPanelTitleBar(&p->TitleBar, &p->PP, &p->PropLinkPP, p->PanelTemplate?p->PanelTemplate->Header:0);
         laui_DefaultPanelTitleBar(&p->TitleBar, &p->PP, &p->PropLinkPP, p->PanelTemplate?p->PanelTemplate->Header:0);
     }
     }
 
 
@@ -3750,7 +3756,7 @@ laPanel *laCreateTopPanel(laWindow *w, char *template_id, int X, int Y, int W, i
 
 
     laPlacePanelForCreation(p);
     laPlacePanelForCreation(p);
 
 
-    if(uit){
+    if(uit && (!(uit->Flags&LA_TEMPLATE_FLAGS_NO_DECORATION))){
         laui_DefaultPanelTitleBar(&p->TitleBar, &p->PP, &p->PropLinkPP, p->PanelTemplate->Header);
         laui_DefaultPanelTitleBar(&p->TitleBar, &p->PP, &p->PropLinkPP, p->PanelTemplate->Header);
     }
     }
 
 
@@ -5585,6 +5591,9 @@ laUiTemplate *laRegisterUiTemplate(char *Identifier, char* Title, laUiDefineFunc
     la_UDFAppendSharedTypePointer(Identifier, uit);
     la_UDFAppendSharedTypePointer(Identifier, uit);
     return uit;
     return uit;
 }
 }
+void laUiTemplateSetExtras(laUiTemplate *uit, int flags, laStringGetF SaveOptions, laStringSetF RestoreOptions){
+    uit->Flags=flags; uit->SaveOptions=SaveOptions; uit->RestoreOptions=RestoreOptions;
+}
 laCanvasTemplate *laRegisterCanvasTemplate(char *Identifier, char *ForContainer, laModalFunc ExtraModal, laCanvasDrawFunc Func, laUiDrawFunc SecondDraw, laUiInitFunc CustomInit, laUiDestroyFunc CustomDestroy){
 laCanvasTemplate *laRegisterCanvasTemplate(char *Identifier, char *ForContainer, laModalFunc ExtraModal, laCanvasDrawFunc Func, laUiDrawFunc SecondDraw, laUiInitFunc CustomInit, laUiDestroyFunc CustomDestroy){
     laCanvasTemplate *t = memAcquire(sizeof(laCanvasTemplate));
     laCanvasTemplate *t = memAcquire(sizeof(laCanvasTemplate));
     strSafeSet(&t->Identifier, Identifier);
     strSafeSet(&t->Identifier, Identifier);

+ 2 - 2
resources/la_operators.c

@@ -2367,7 +2367,7 @@ int OPMOD_MenuPanel(laOperator *a, laEvent *e){
     laListHandle Locals = {0};
     laListHandle Locals = {0};
     laGeneralUiExtraData *uid = a->CustomData;
     laGeneralUiExtraData *uid = a->CustomData;
 
 
-    if(MAIN.DockingPanel){return LA_FINISHED; }
+    if( MAIN.DockingPanel==p ){return LA_FINISHED; }//unlikely
 
 
     int IsClose=laIsCloseToPanel(p,x,y);
     int IsClose=laIsCloseToPanel(p,x,y);
     int IsIn=laIsInPanel(p, x, y);
     int IsIn=laIsInPanel(p, x, y);
@@ -2452,7 +2452,7 @@ int OPMOD_ModalPanel(laOperator *a, laEvent *e){
     laListHandle Locals = {0};
     laListHandle Locals = {0};
     laGeneralUiExtraData *uid = a->CustomData;
     laGeneralUiExtraData *uid = a->CustomData;
 
 
-    if(MAIN.DockingPanel){return LA_FINISHED; }
+    if( MAIN.DockingPanel==p ){return LA_FINISHED; }//unlikely
 
 
     if (e->type == LA_KEY_DOWN && e->key==LA_KEY_ESCAPE){
     if (e->type == LA_KEY_DOWN && e->key==LA_KEY_ESCAPE){
         laConfirmInt(a, 0, LA_CONFIRM_CANCEL);
         laConfirmInt(a, 0, LA_CONFIRM_CANCEL);

+ 10 - 4
resources/la_properties.c

@@ -479,6 +479,12 @@ void laset_ManagerFilterInstances(void* unused, int val){
     laRedrawAllWindows();
     laRedrawAllWindows();
 }
 }
 
 
+void laget_PanelExtraInfo(laPanel* panel, char* content, char** here){
+    if(panel->PanelTemplate && panel->PanelTemplate->SaveOptions){
+        panel->PanelTemplate->SaveOptions(panel,content,here);
+    }
+}
+
 void lapost_PropPack(laPropPack *pp);
 void lapost_PropPack(laPropPack *pp);
 void laget_ConditionNodePropPath(laUiConditionNode *ucn, char *result, char** here){
 void laget_ConditionNodePropPath(laUiConditionNode *ucn, char *result, char** here){
     if (!ucn->PP.Go) return;
     if (!ucn->PP.Go) return;
@@ -736,7 +742,9 @@ void lapost_Panel(laPanel *p){
     if(uit&&uit->PropFunc){ uit->PropFunc(p); }
     if(uit&&uit->PropFunc){ uit->PropFunc(p); }
     if(uit){
     if(uit){
         uit->Define(&p->UI, &p->PP, &p->PropLinkPP, 0, 0);
         uit->Define(&p->UI, &p->PP, &p->PropLinkPP, 0, 0);
-        if(p->Mode) laui_DefaultPanelTitleBar(&p->TitleBar, &p->PP, &p->PropLinkPP, uit->Header);
+        if(p->Mode && (!(uit->Flags&LA_TEMPLATE_FLAGS_NO_DECORATION)))
+            laui_DefaultPanelTitleBar(&p->TitleBar, &p->PP, &p->PropLinkPP, uit->Header);
+        if(uit->RestoreOptions){ uit->RestoreOptions(p,SSTR(p->ExtraInfo)); strSafeDestroy(&p->ExtraInfo); }
     }
     }
     if(p->IsMenuPanel){ laui_DefaultMenuBarActual(&p->TitleBar, &p->PP, &p->PropLinkPP, 0, 0); }
     if(p->IsMenuPanel){ laui_DefaultMenuBarActual(&p->TitleBar, &p->PP, &p->PropLinkPP, 0, 0); }
     //if(p->Title) p->TitleWidth = tnsStringGetWidth(transLate(p->Title->Ptr), 0, 0);
     //if(p->Title) p->TitleWidth = tnsStringGetWidth(transLate(p->Title->Ptr), 0, 0);
@@ -1141,7 +1149,6 @@ int laaction_VerifyRootObject(void* Parent, laPropContainer* ParentType, void* C
     return 0;
     return 0;
 }
 }
 
 
-
 void* lagetraw_ProofingData(laProofingLUT* pl, int* r_size, int* ret_is_copy){
 void* lagetraw_ProofingData(laProofingLUT* pl, int* r_size, int* ret_is_copy){
     int single_size=LA_LUT_PIXCOUNT*3;
     int single_size=LA_LUT_PIXCOUNT*3;
     *r_size=3*sizeof(char)*single_size; // 3x rgb x pixcount
     *r_size=3*sizeof(char)*single_size; // 3x rgb x pixcount
@@ -2100,8 +2107,7 @@ void la_RegisterInternalProps(){
             laAddSubGroup(p, "parent_block","Parent Block", "The Block That Directly Links This Panel In", "ui_block",0,0,0,offsetof(laPanel, Block), 0,0,0,0,0,0,0,LA_UDF_REFER|LA_UDF_IGNORE);
             laAddSubGroup(p, "parent_block","Parent Block", "The Block That Directly Links This Panel In", "ui_block",0,0,0,offsetof(laPanel, Block), 0,0,0,0,0,0,0,LA_UDF_REFER|LA_UDF_IGNORE);
             laAddSubGroup(p, "template","Template", "Panel template", "panel_template",0,0,0,offsetof(laPanel, PanelTemplate), 0,0,0,0,0,0,0,LA_UDF_REFER);
             laAddSubGroup(p, "template","Template", "Panel template", "panel_template",0,0,0,offsetof(laPanel, PanelTemplate), 0,0,0,0,0,0,0,LA_UDF_REFER);
             laAddSubGroup(p, "block", "Block", "Block reference of this panel", "ui_block",0,0,0,offsetof(laPanel, Block), 0,0,0,0,0,0,0,LA_UDF_REFER);
             laAddSubGroup(p, "block", "Block", "Block reference of this panel", "ui_block",0,0,0,offsetof(laPanel, Block), 0,0,0,0,0,0,0,LA_UDF_REFER);
-            //laAddStringProperty(p, "_toolbox_name", "Toolbox Name", "Toolbox name",0,0,0,0,1,offsetof(laPanel,_ToolboxName),0,laget_PanelToolboxName,0,0,LA_READ_ONLY);
-            //laAddIntProperty(p, "_toolbox_layout", "Toolbox Layout", "Toolbox layout", 0,0,0,0,0,0,0,0,offsetof(laPanel,_ToolboxLayout),0,0,0,0,laget_PanelToolboxLayout, 0,0,0,0,0,LA_READ_ONLY);
+            laAddStringProperty(p, "extra_info", "Extra Info", "Extra property info for this particular panel",0,0,0,0,1,offsetof(laPanel,ExtraInfo),0,laget_PanelExtraInfo,0,0,LA_READ_ONLY);
         }
         }
 
 
         // UI ITEM ==========================================================================================
         // UI ITEM ==========================================================================================

+ 60 - 34
resources/la_templates.c

@@ -1998,45 +1998,70 @@ void lauidetached_Toolbox(laPanel* p){
     la_MakeDetachedProp(p, "la.input_mapping.current_toolbox", "toolbox");
     la_MakeDetachedProp(p, "la.input_mapping.current_toolbox", "toolbox");
     la_MakeDetachedProp(p, "la.input_mapping.toolbox_layout","layout");
     la_MakeDetachedProp(p, "la.input_mapping.toolbox_layout","layout");
 }
 }
+void laget_ToolboxPanelExtraInfo(laPanel* panel, char* content, char** here){
+    content[0]=0; if(!panel->PropLinkContainer) return;
+    char prop[256]; laIntProp *ip; laFloatProp *fp; laEnumProp *ep; laSubProp *sp;
+    for(laProp* p=panel->PropLinkContainer->Props.pFirst;p;p=p->Item.pNext){ prop[0]=0;
+        switch(p->PropertyType){
+            case LA_PROP_ENUM: ep=p;
+                snprintf(prop,256,"%s=%d;",p->Identifier,ep->Detached[0]); break;
+            case LA_PROP_SUB: sp=p; laInputMapping* toolbox=sp->Detached;
+                snprintf(prop,256,"%s=%s;",p->Identifier,SSTR(toolbox->Name)); break;
+        }
+        strcat(content,prop);
+    }
+}
+void laset_ToolboxPanelExtraInfo(laPanel* panel, char* content){
+    laStringSplitor* ss; strMakeInstructions(&ss,content); if(!ss) return;
+    laInputMapping* im=0; int layout=0; laEnumProp *ep; laSubProp *sp; char* value;
+    if(value=strGetArgumentString(ss,"toolbox")){ im=laFindToolbox(value); }
+    if(value=strGetArgumentString(ss,"layout")){ sscanf(value,"%d",&layout); }
+    for(laProp* p=panel->PropLinkContainer->Props.pFirst;p;p=p->Item.pNext){
+        switch(p->PropertyType){
+            case LA_PROP_ENUM: if(!strSame("layout",p->Identifier)) break;
+                ep=p; ep->Detached[0]=layout; break;
+            case LA_PROP_SUB: if(!strSame("toolbox",p->Identifier)) break;
+                sp=p; memAssignRef(sp,&sp->Detached,im); break;
+        }
+    }
+
+}
 void laui_Toolbox(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *UNUSED, int context){
 void laui_Toolbox(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *UNUSED, int context){
     laColumn* c=laFirstColumn(uil); laSplitColumn(uil,c,0.2);
     laColumn* c=laFirstColumn(uil); laSplitColumn(uil,c,0.2);
-    laColumn* cl=laLeftColumn(c,1), *cr=laRightColumn(c,0);
-    laUiItem* cui=laShowInvisibleItem(uil,c,Extra,"layout");
-
-    laUiItem* b0=laOnConditionThat(uil,c,laEqual(laPropExpression(&cui->PP,""),laIntExpression(0)));{
-        laUiItem* ui=laShowItemFull(uil,c,Extra,"toolbox.entries",0,0,laui_ToolboxEntryButton,0);
-        ui->Flags|=LA_UI_FLAGS_NO_DECAL;
-        laUiItem* b=laBeginRow(uil,c,0,0);{
-            laUiList* muil=laMakeMenuPageEx(uil,c,"☰",LA_UI_FLAGS_NO_DECAL); laColumn* mc=laFirstColumn(muil);
-            laUiItem* b1=laBeginRow(muil,mc,0,0);{
-                laShowItemFull(muil,mc, 0, "LA_panel_activator", 0, "panel_id=LAUI_toolbox_editor;icon=🖍;", 0, 0)->Flags|=LA_UI_FLAGS_ICON;
-                laShowItemFull(muil,mc,Extra,"layout",0,0,0,0)->Flags|=LA_UI_FLAGS_EXPAND|LA_UI_FLAGS_NO_CONFIRM;
-            }laEndRow(muil,b1);
-            laShowLabel(muil,mc,"Select a toolbox:",0,0)->Flags|=LA_TEXT_MONO;
-            laShowItemFull(muil,mc,Extra,"toolbox",LA_WIDGET_COLLECTION,0,laui_IdentifierOnly,0);
-        }laEndRow(uil,b);
-    }laElse(uil,b0);{
-        laUiItem* b=laBeginRow(uil,cl,0,0);{
-            laUiList* muil=laMakeMenuPageEx(uil,cl,"☰",LA_UI_FLAGS_NO_DECAL); laColumn* mc=laFirstColumn(muil);
-            laUiItem* b1=laBeginRow(muil,mc,0,0);{
-                laShowItemFull(muil,mc, 0, "LA_panel_activator", 0, "panel_id=LAUI_toolbox_editor;icon=🖍;", 0, 0)->Flags|=LA_UI_FLAGS_ICON;
-                laShowItemFull(muil,mc,Extra,"layout",0,0,0,0)->Flags|=LA_UI_FLAGS_EXPAND|LA_UI_FLAGS_NO_CONFIRM;
-            }laEndRow(muil,b1);
-            laShowLabel(muil,mc,"Select a toolbox:",0,0)->Flags|=LA_TEXT_MONO;
-            laShowItemFull(muil,mc,Extra,"toolbox",LA_WIDGET_COLLECTION,0,laui_IdentifierOnly,0);
-        }laEndRow(uil,b);
-    }laEndCondition(uil,b0);
+    laColumn* cl=laLeftColumn(c,0), *cr=laRightColumn(c,1);
+    laUiItem* cui=laShowInvisibleItem(uil,c,Extra,"layout");laUiItem* b0;
 
 
 #define ADD_WIDTH_OF(n) \
 #define ADD_WIDTH_OF(n) \
-    b0=laOnConditionThat(uil,cr,laEqual(laPropExpression(&cui->PP,""),laIntExpression(n)));{ \
-        laUiItem* ui=laShowItemFull(uil,cr,Extra,"toolbox.entries",0,0,laui_ToolboxEntryButton,0); \
-        ui->Flags|=LA_UI_FLAGS_NO_DECAL;  ui->Expand=n; \
+    b0=laOnConditionThat(uil,cl,laEqual(laPropExpression(&cui->PP,""),laIntExpression(n)));{ \
+        laUiItem* ui=laShowItemFull(uil,cl,Extra,"toolbox.entries",0,0,laui_ToolboxEntryButton,0); \
+        ui->Flags|=LA_UI_FLAGS_NO_DECAL|LA_UI_FLAGS_NO_GAP;  ui->Expand=n; \
     }laEndCondition(uil,b0)
     }laEndCondition(uil,b0)
     
     
     ADD_WIDTH_OF(3);
     ADD_WIDTH_OF(3);
     ADD_WIDTH_OF(5);
     ADD_WIDTH_OF(5);
     ADD_WIDTH_OF(8);
     ADD_WIDTH_OF(8);
     ADD_WIDTH_OF(13);
     ADD_WIDTH_OF(13);
+
+    laUiItem* b=laBeginRow(uil,cr,0,0);{
+        laUiList* muil=laMakeMenuPageEx(uil,cr,"☰",LA_UI_FLAGS_NO_DECAL|LA_UI_FLAGS_NO_GAP); laColumn* mc=laFirstColumn(muil);
+        laUiItem* b0=laBeginRow(muil,mc,0,0);{
+            laShowSeparator(muil,mc)->Expand=1;
+            laShowItem(muil, mc, This, "hide")->Flags|=LA_UI_FLAGS_ICON;
+            laShowItem(muil, mc, This, "dock")->Flags|=LA_UI_FLAGS_ICON;
+            laShowItemFull(muil, mc, This, "close",0,"text=Close Toolbox",0,0);
+        }laEndRow(muil,b0);
+        laShowLabel(muil,mc,"Select a toolbox:",0,0)->Flags|=LA_TEXT_MONO;
+        laShowItemFull(muil,mc,Extra,"toolbox",LA_WIDGET_COLLECTION,0,laui_IdentifierOnly,0);
+        laUiItem* b1=laBeginRow(muil,mc,0,0);{
+            laShowItemFull(muil,mc, 0, "LA_panel_activator", 0, "panel_id=LAUI_toolbox_editor;icon=🖍;", 0, 0)->Flags|=LA_UI_FLAGS_ICON;
+            laShowItemFull(muil,mc,Extra,"layout",0,0,0,0)->Flags|=LA_UI_FLAGS_EXPAND|LA_UI_FLAGS_NO_CONFIRM;
+        }laEndRow(muil,b1);
+    }laEndRow(uil,b);
+
+    b0=laOnConditionThat(uil,c,laEqual(laPropExpression(&cui->PP,""),laIntExpression(0)));{
+        laUiItem* ui=laShowItemFull(uil,c,Extra,"toolbox.entries",0,0,laui_ToolboxEntryButton,0);
+        ui->Flags|=LA_UI_FLAGS_NO_DECAL|LA_UI_FLAGS_NO_GAP;
+    }laEndCondition(uil,b0);
 }
 }
 void laui_ToolboxEditor(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *UNUSED, int context){
 void laui_ToolboxEditor(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *UNUSED, int context){
     laColumn* c=laFirstColumn(uil);
     laColumn* c=laFirstColumn(uil);
@@ -2585,20 +2610,21 @@ void tnsui_RootObjectMenuUi(laUiList *uil, laPropPack *This, laPropPack *Operato
 
 
 
 
 
 
-void la_RegisterBuiltinTemplates(){
+void la_RegisterBuiltinTemplates(){ laUiTemplate* uit;
     int obj=MAIN.InitArgs.HasWorldObjects;
     int obj=MAIN.InitArgs.HasWorldObjects;
     int tex=MAIN.InitArgs.HasTextureInspector;
     int tex=MAIN.InitArgs.HasTextureInspector;
     int his=MAIN.InitArgs.HasHistories;
     int his=MAIN.InitArgs.HasHistories;
     int ter=MAIN.InitArgs.HasTerminal;
     int ter=MAIN.InitArgs.HasTerminal;
     int act=MAIN.InitArgs.HasAction&&obj;
     int act=MAIN.InitArgs.HasAction&&obj;
-            laRegisterUiTemplate("LAUI_toolbox","Toolbox",laui_Toolbox,lauidetached_Toolbox,0,"Toolboxes",0,0,0);
-    if(obj) laRegisterUiTemplate("LAUI_scene", "Scene", tnsui_ScenePanel, tnsui_DetachedScenePanel, 0, 0, 0,25,25);
+            uit=laRegisterUiTemplate("LAUI_toolbox","Toolbox",laui_Toolbox,lauidetached_Toolbox,0,"Toolboxes",0,0,0);
+                laUiTemplateSetExtras(uit,LA_TEMPLATE_FLAGS_NO_DECORATION,laget_ToolboxPanelExtraInfo,laset_ToolboxPanelExtraInfo);
+    if(obj) laRegisterUiTemplate("LAUI_scene", "Scene", tnsui_ScenePanel, tnsui_DetachedScenePanel, 0, "Scene", 0,25,25);
     if(obj) laRegisterUiTemplate("LAUI_world_hierachy","World",tnsui_WorldHierachy,0,0,0,0,0,0);
     if(obj) laRegisterUiTemplate("LAUI_world_hierachy","World",tnsui_WorldHierachy,0,0,0,0,0,0);
     if(obj) laRegisterUiTemplate("LAUI_object_properties", "Properties", tnsui_ObjectProperties, tnsuidetached_ObjectProperties, 0, 0, 0,15,25);
     if(obj) laRegisterUiTemplate("LAUI_object_properties", "Properties", tnsui_ObjectProperties, tnsuidetached_ObjectProperties, 0, 0, 0,15,25);
+    if(obj) laRegisterUiTemplate("LAUI_drivers","Drivers",laui_Drivers,lauidetached_Drivers,0,"Controls",0,0,0);
+    if(obj) laRegisterUiTemplate("LAUI_materials","Materials",laui_Materials,lauidetached_Materials,0,0,0,0,0);
     if(act) laRegisterUiTemplate("LAUI_animation_actions", "Actions", laui_AnimationActions, 0, 0, 0, 0,15,25);
     if(act) laRegisterUiTemplate("LAUI_animation_actions", "Actions", laui_AnimationActions, 0, 0, 0, 0,15,25);
     if(act) laRegisterUiTemplate("LAUI_animation_action_channels", "Action Channels", laui_AnimationActionChannels, 0, 0, 0, 0,20,15); 
     if(act) laRegisterUiTemplate("LAUI_animation_action_channels", "Action Channels", laui_AnimationActionChannels, 0, 0, 0, 0,20,15); 
-    if(obj) laRegisterUiTemplate("LAUI_drivers","Drivers",laui_Drivers,lauidetached_Drivers,0,0,0,0,0);
-    if(obj) laRegisterUiTemplate("LAUI_materials","Materials",laui_Materials,lauidetached_Materials,0,0,0,0,0);
             
             
             laRegisterUiTemplate("LAUI_user_preferences", "User Preferences", laui_UserPreference, 0, 0, "System",0,25,25);
             laRegisterUiTemplate("LAUI_user_preferences", "User Preferences", laui_UserPreference, 0, 0, "System",0,25,25);
             laRegisterUiTemplate("LAUI_toolbox_editor","Toolbox Editor",laui_ToolboxEditor,0,0,0,0,0,0);
             laRegisterUiTemplate("LAUI_toolbox_editor","Toolbox Editor",laui_ToolboxEditor,0,0,0,0,0,0);