*/}}
Przeglądaj źródła

toolbox and some return fixes

YimingWu 3 miesięcy temu
rodzic
commit
2e57d37d78
13 zmienionych plików z 143 dodań i 78 usunięć
  1. 1 0
      CMakeLists.txt
  2. 2 0
      la_5.h
  3. 1 0
      la_animation.c
  4. 1 0
      la_audio.c
  5. 17 4
      la_data.c
  6. 2 2
      la_data.h
  7. 2 2
      la_interface.h
  8. 2 8
      la_kernel.c
  9. 2 0
      la_util.h
  10. 77 8
      resources/la_operators.c
  11. 1 0
      resources/la_properties.c
  12. 13 29
      resources/la_templates.c
  13. 22 25
      resources/la_widgets.c

+ 1 - 0
CMakeLists.txt

@@ -83,6 +83,7 @@ file(GLOB HEADER_FILES
 	./*.h ./*.hpp ./resources/*.h ./resources/*.hpp BuildResources/*.h)
 
 add_definitions(-DLAGUI_FONT_CUSTOM_PATH=\"${LAGUI_FONT_CUSTOM_PATH}\")
+#add_definitions(-Werror=return-type)
 add_definitions(-w)
 
 if(${LAGUI_ANDROID})

+ 2 - 0
la_5.h

@@ -49,6 +49,8 @@
 #ifdef __linux__
 #include <unistd.h>
 #include <dirent.h>
+#include <mntent.h>
+#include <sys/statvfs.h>
 #endif
 
 #include <locale.h>

+ 1 - 0
la_animation.c

@@ -430,6 +430,7 @@ void la_AnimationMarkRetargetedReset(laActionRetarget* ar){
 }
 laRetargetedAction* la_AnimationGetRetargetedAction(laActionRetarget* ar, laAction* aa){
     int i=0; for(laAction* a=ar->Actions->pFirst;a&&i<ar->ActionCount;a=a->Item.pNext){ if(a==aa) return &ar->Retargeted[i]; i++; }
+    return 0;
 }
 int laAnimationSyncRetarget(laActionRetarget* ar, real PlayHead){
     int need_sync = (ar->PlaySync != PlayHead);

+ 1 - 0
la_audio.c

@@ -1092,6 +1092,7 @@ laAudioChannel* laNewAudioChannel(char* Name){
     laAudioChannel* ac=memAcquireHyper(sizeof(laAudioChannel)); lstAppendItem(&MAIN.Audio->Channels,ac);
     strSafeSet(&ac->Name,Name); 
     ac->Volume = 10.0f;
+    return ac;
 }
 void laRemoveAudioChannel(laAudioChannel* ac){
     lstRemoveItem(&MAIN.Audio->Channels,ac); strSafeDestroy(&ac->Name);

+ 17 - 4
la_data.c

@@ -257,6 +257,7 @@ void *la_FindMatchingInstance(void *From, laProp *Sub, laProp *p, laPropStep *Va
         }
         return Inst;
     }
+    return 0;
 }
 int la_GetPropFromPath(laPropPack *Self, laPropPack *Base, const char *Path, void **SpecifiedInstance){
     laProp *p = 0;
@@ -1836,6 +1837,7 @@ int laGetEnumArray(laPropPack *pp, laEnumItem **result){
             }
         }
     }
+    return 0;
 }
 laEnumItem *laGetEnumFromIdentifier(laEnumProp *p, char *Identifier){
     laEnumItem *ei;
@@ -2136,6 +2138,7 @@ int laActuateProp(laPropPack *This, laPropPack *RunPP, laOperator *OptionalFrom,
         }
         return laInvokeP(OptionalFrom, ((laOperatorProp *)RunPP->LastPs->p)->OperatorType, e, This, 0, 0); //ARGS
     }
+    return LA_CANCELED;
 }
 
 void laMarkPropChanged(laPropPack* pp){
@@ -2231,10 +2234,12 @@ void la_GetWorkingDirectoryInternal(){
 #ifdef LA_LINUX
     readlink("/proc/self/exe", mbuf, 2048);
     strDiscardLastSegmentSeperateBy(mbuf, '/');
+    chdir(mbuf);
 #endif
 #ifdef _WIN32
     GetModuleFileName(NULL, mbuf, 2048);
     strDiscardLastSegmentSeperateBy(mbuf, '\\');
+    _chdir(mbuf);
 #endif
     int len=strlen(mbuf);if(mbuf[len]!=LA_PATH_SEP){ mbuf[len]=LA_PATH_SEP; mbuf[len+1]=0; }
     strSafeSet(&MAIN.WorkingDirectory, mbuf);
@@ -2340,7 +2345,7 @@ laUDF *laPrepareUDF(char *FileName){
     return udf;
 }
 
-int laWriteProp(laUDF *udf, char *Path){
+void laWriteProp(laUDF *udf, char *Path){
     laUDFPropSegment *ps = CreateNew(laUDFPropSegment);
     strSafeSet(&ps->Path, Path);
     la_GetPropFromPath(&ps->PP, 0, Path, 0);
@@ -2348,7 +2353,7 @@ int laWriteProp(laUDF *udf, char *Path){
     lstAppendItem(&udf->PropsToOperate, ps);
     udf->NumSegmets++;
 }
-int laWritePropP(laUDF *udf, laPropPack *pp){
+void laWritePropP(laUDF *udf, laPropPack *pp){
     char buf[LA_RAW_CSTR_MAX_LEN] = {0};
     laUDFPropSegment *ps = CreateNew(laUDFPropSegment);
 
@@ -2360,13 +2365,13 @@ int laWritePropP(laUDF *udf, laPropPack *pp){
 
     lstAppendItem(&udf->PropsToOperate, ps);
 }
-int la_IncludeHyper2Instance(laUDF *udf, laPropContainer* pc, void* Instance){
+void la_IncludeHyper2Instance(laUDF *udf, laPropContainer* pc, void* Instance){
     laUDFH2Instance *h2 = memAcquire(sizeof(laUDFH2Instance));
     h2->pc=pc; h2->Instance = Instance;
     lstAppendItem(&udf->H2Instances, h2);
     udf->HasInstances=1;
 }
-int la_ClearHyper2Instances(laUDF* udf){
+void la_ClearHyper2Instances(laUDF* udf){
     laUDFH2Instance *h2;
     while(h2=lstPopItem(&udf->H2Instances)){ memFree(h2); }
     udf->HasInstances=0;
@@ -3990,6 +3995,14 @@ void laRefreshUDFResourcesIn(char* rootpath){
 void laRefreshUDFRegistries(){
     laClearUDFRegistries();
     char LookupM[PATH_MAX];
+    /* Always scan root directory. */
+#ifdef LAGUI_ANDROID
+    const char* rootdir="";
+#else
+    const char* rootdir=".";
+#endif
+    realpath(rootdir, LookupM);
+    laRefreshUDFResourcesIn(LookupM);
     for(laResourceFolder* rf = MAIN.ResourceFolders.pFirst;rf;rf=rf->Item.pNext){
 #ifdef LAGUI_ANDROID
         sprintf(LookupM,"%s",SSTR(rf->Path));

+ 2 - 2
la_data.h

@@ -981,8 +981,8 @@ void laGetUDFRelativeDirectory(laUDF *From, laUDF *To, char *Result);
 void laGetFullPath(char *FullFrom, char *Relative, char *Result);
 
 laUDF *laPrepareUDF(char *FileName);
-int laWriteProp(laUDF *udf, char *Path);
-int laWritePropP(laUDF *udf, laPropPack *pp);
+void laWriteProp(laUDF *udf, char *Path);
+void laWritePropP(laUDF *udf, laPropPack *pp);
 int laPackUDF(laUDF *udf, int UseInstanceList, int DoBackup);
 
 laManagedSaveProp* laSaveProp(char* path);

+ 2 - 2
la_interface.h

@@ -212,7 +212,7 @@ NEED_STRUCTURE(laColumn);
 typedef void (*laUiDrawFunc)(void *, int);               //Instance,Theme
 typedef void (*laPanelDrawFunc)(void *, void *, void *); //SYSWINDOW,Instance,Theme
 //typedef void(*laUiDefineFunc)(laUiList*,laPropPack*,laPropPack*,laColumn*);//uil,collection inst+"This" inst,actuator inst,Extra column list.
-typedef void (*laOperatorArgumentParserFunc)(laStringSplitor *, uint32_t *, char *); //icon id,display string buf
+typedef void (*laOperatorArgumentParserFunc)(laPropPack*, laStringSplitor *, uint32_t *, char *); //this,ss,icon id,display string buf
 typedef int (*laUiGetHeightFunc)(laUiItem *);
 typedef int (*laUiGetMinWidthFunc)(laUiItem *);
 typedef int (*laUiConditionFunc)(laPropPack *); //maybe inst+actuator,replaceInst
@@ -2279,7 +2279,7 @@ STRUCTURE(laFileItem){
 
 STRUCTURE(laDiskItem){
     laListItem Hyper;
-    char ID;
+    char Path[1024];
     real Total_GB;
     real Free_GB;
 };

+ 2 - 8
la_kernel.c

@@ -1398,12 +1398,6 @@ int laGetReadyWith(laInitArguments* ia){
 
     MAIN.ManagerFilterInstances = 1;
 
-#ifdef LAGUI_ANDROID
-    laAddResourceFolder("");
-#else
-    laAddResourceFolder(".");
-#endif
-
     laSetMenuBarTemplates(laui_DefaultMenuButtons, laui_DefaultMenuExtras, "🧩LaGUI 2022");
 
     laAddExtraExtension(LA_FILETYPE_UDF,"udf",0ll);
@@ -4969,7 +4963,7 @@ laUiItem *laMakeFoldableGroup(laUiList *uil, laColumn *c, const char *Name, laWi
     SubUi->State = LA_UI_ACTIVE;
 
     laUiItem *b1 = laOnConditionToggle(sub, s, 0, 0, 0, 0, 0);
-    strSafePrint(&b1->ExtraInstructions, "text=%s", Name);
+    strSafePrint(&b1->ExtraInstructions, "text=%s", Name);
     if(!DefaultFolded) b1->State=LA_UI_ACTIVE;
     if(ButtonFlags)b1->Flags|=ButtonFlags; else b1->Flags|=LA_UI_FLAGS_NO_DECAL;
     laShowSeparator(sub, s);
@@ -6205,7 +6199,7 @@ int la_UpdateUiListRecursive(laUiList *uil, int U, int L, int R, int B, int Fast
                         ui->TB + (ui->State == LA_UI_ACTIVE ? 0 : LA_RH)+(NoDecal?0:LA_M), ui->TL+(NoDecal?0:LA_M), ui->TR-(NoDecal?0:LA_M)-scrollw, B, Fast, ParentPanel);
                     ui->TB = (ui->Page->HeightCoeff > 0 ? ui->TU + ui->Page->HeightCoeff * LA_RH :
                             (ui->Page->HeightCoeff < 0 ? B + (ui->Page->HeightCoeff+1) * LA_RH - (LA_M*2)+(ui->Page->HeightCoeff==-2?-LA_M:0) : SubB)) + (NoDecal?0:LA_M);
-                    ui->Page->LimH = ui->TB-ui->Page->U - (NoDecal?0:LA_M);
+                    ui->Page->LimH = ui->TB-ui->Page->TU - (NoDecal?0:LA_M);
                     int subh = ui->TB-ui->TU-LA_RH-LA_M*2;
                     if((ui->Page->TR>ui->TR-(NoDecal?0:LA_M) && (!ui->Page->ScrollerShownH)) ||
                         (ui->Page->TR<=ui->TR-(NoDecal?0:LA_M) && ui->Page->ScrollerShownH)){

+ 2 - 0
la_util.h

@@ -720,6 +720,8 @@ void strPrintIntAfter(char * dest, int LenthLim, int data);
 int strSame(char * src, char *dest);
 void strEscapePath(char* OutCanBeSame, char* path);
 
+#define strPrefix(a, b) (strncmp((a), (b), strlen(b)) == 0)
+
 void strSafeDestroy(laSafeString** ss);
 void strSafeSet(laSafeString** ss, char * Content);
 void strSafeAppend(laSafeString **ss, char *Content);

+ 77 - 8
resources/la_operators.c

@@ -21,7 +21,7 @@
 extern LA MAIN;
 extern struct _tnsMain *T;
 
-void la_DefaultOperatorParser(laStringSplitor *ss, uint32_t *IconID, char *DisplayString){
+void la_DefaultOperatorParser(laPropPack* parent, laStringSplitor *ss, uint32_t *IconID, char *DisplayString){
     char *StrArg;
     laStringPart *sp;
     if (ss && ss->parts.pFirst){
@@ -33,9 +33,9 @@ void la_DefaultOperatorParser(laStringSplitor *ss, uint32_t *IconID, char *Displ
         }
     }
 }
-void la_PanelActiviatorParser(laStringSplitor *ss, uint32_t *IconID, char *DisplayString){
+void la_PanelActiviatorParser(laPropPack* parent, laStringSplitor *ss, uint32_t *IconID, char *DisplayString){
     char *StrArg;
-    la_DefaultOperatorParser(ss,IconID,DisplayString);
+    la_DefaultOperatorParser(parent,ss,IconID,DisplayString);
     if (ss && ss->parts.pFirst){
         if (StrArg = strGetArgumentString(ss, "text")){
             strCopyFull(DisplayString, StrArg);
@@ -48,6 +48,19 @@ void la_PanelActiviatorParser(laStringSplitor *ss, uint32_t *IconID, char *Displ
         strCopyFull(DisplayString, transLate("Activate A Panel"));
     }
 }
+void la_RunToolboxEntryParser(laPropPack* parent, laStringSplitor *ss, uint32_t *IconID, char *DisplayString){
+    char *StrArg;
+    la_DefaultOperatorParser(parent, ss,IconID,DisplayString);
+    if(parent && parent->EndInstance){
+        laInputMappingEntry* ime=parent->EndInstance;
+        char* display=SSTR(ime->Key), *opname=SSTR(ime->OperatorName);
+        if(ime->UseOperator){
+            sprintf(DisplayString,"%s",display[0]?display:opname); 
+        }else{
+            sprintf(DisplayString,"%s",display[0]?display:SSTR(ime->Signal)); 
+        }
+    }
+}
 
 laProp *la_PropLookup(laListHandle *lst, char *ID);
 void la_EnsurePanelSnapping(laPanel *p, int CW, int CH);
@@ -357,12 +370,11 @@ findnext:
         Name[0] = *pd;
         if (GetDiskFreeSpaceEx(Name, &FreeAvailable, &TotalSpace, &FreeSpace_UNUSED)){
             dl = memAcquire(sizeof(laDiskItem));
-            dl->ID = *pd;
+            dl->Path[0] = *pd;
             dl->Total_GB = (real)TotalSpace / 1073741824.0f;   //B->GB
             dl->Free_GB = (real)FreeAvailable / 1073741824.0f; //B->GB
 
-            if (Name[0] == fb->Path[0])
-                fb->RootDisk = dl;
+            if (Name[0] == fb->Path[0]) fb->RootDisk = dl;
 
             lstAppendItem(&fb->Disks, dl);
         }
@@ -370,6 +382,39 @@ findnext:
     }
 #endif
 
+#ifdef LA_LINUX
+    /* Loop over mount points, not caring about gvfs network drives. */
+    struct mntent *mnt;
+    FILE *fp;
+    fp = setmntent(MOUNTED, "r");
+    if (!fp) {
+        logPrintNew("Could not get a list of mounted file-systems\n");
+    }
+    else {
+        while ((mnt = getmntent(fp))) {
+            if (strPrefix(mnt->mnt_dir, "/boot")) continue;
+            if (!strPrefix(mnt->mnt_fsname, "/dev")) continue;
+            if (strPrefix(mnt->mnt_fsname, "/dev/loop")) continue;
+
+            dl = memAcquire(sizeof(laDiskItem));
+
+            strcpy(dl->Path, mnt->mnt_dir);
+
+            struct statvfs stats={0};
+            statvfs(mnt->mnt_dir, &stats);
+            dl->Total_GB = (real)stats.f_frsize*stats.f_blocks / 1073741824.0f;
+            dl->Free_GB = (real)stats.f_bsize*stats.f_bavail / 1073741824.0f;
+
+            if (strPrefix(fb->Path, dl->Path)) fb->RootDisk = dl;
+            
+            lstAppendItem(&fb->Disks, dl);
+        }
+        if (endmntent(fp) == 0) {
+            logPrintNew("Could not close the list of mounted file-systems\n");
+        }
+    }
+#endif
+
     fb->Active = 0;
 }
 laFileBrowser *la_FileBrowserInit(laOperator *a){
@@ -491,15 +536,25 @@ void *laget_FileBrowserFirstFile(laFileBrowser *fb, void* unused){
 void *laget_FileBrowserActiveFile(laFileBrowser *fb){
     return fb->Active;
 }
-void laget_FileBrowserDiskID(laDiskItem *di, char *result){
+void laget_FileBrowserDiskID(laDiskItem *di, char *result, char** move){
+#ifdef _WIN32
     result[0] = di->ID;
     result[1] = U':';
     result[2] = LA_PATH_SEP;
     result[3] = U'\0';
+#endif
+#ifdef LA_LINUX
+    *move = di->Path;
+#endif
+}
+void laget_FileBrowserDiskCapacity(laDiskItem *di, char *result, char** move){
+    sprintf(result, "%.1lf/%.1lfGB",di->Free_GB,di->Total_GB);
 }
 void *laset_FileBrowserActiveDisk(laFileBrowser *fb, laDiskItem *di, int UNUSED_State){
     fb->RootDisk = di;
-    laget_FileBrowserDiskID(di, fb->Path);
+    char path[1024]; char* _path=path;
+    laget_FileBrowserDiskID(di, path, &_path);
+    strcpy(fb->Path,_path);
     la_FileBrowserRebuildList(fb);
     fb->FileName[0] = 0;
 }
@@ -899,10 +954,12 @@ int OPINV_RemoveResourceFolder(laOperator *a, laEvent *e){
 int OPCHK_Undo(laPropPack *This, laStringSplitor *ss){
     laDiff* diff=MAIN.HeadDifference; if(!diff) return 0;
     diff=diff->Item.pPrev; if(!diff) return 0;
+    return 1;
 }
 int OPCHK_Redo(laPropPack *This, laStringSplitor *ss){
     laDiff* diff=MAIN.HeadDifference; if(!diff) return 0;
     if(diff==MAIN.Differences.pLast) return 0;
+    return 1;
 }
 int OPINV_Undo(laOperator *a, laEvent *e){
     laUndo();
@@ -955,6 +1012,15 @@ int OPMOD_RemoveToolbox(laOperator *a, laEvent *e){
     }
     return LA_RUNNING;
 }
+int OPINV_RunToolboxEntry(laOperator *a, laEvent* e){
+    laInputMappingEntry* ime = a->This?a->This->EndInstance:0; if(!ime) return LA_CANCELED;
+    if(ime->UseOperator && ime->OperatorType){
+        laInvokeP(a, ime->OperatorType, e, 0, SSTR(ime->OperatorArguments), 0);
+    }else{
+        la_SendSignalEvent(e->window->win, ime->SignalValue);
+    }
+    return LA_FINISHED;
+}
 
 int OPINV_NewInputMapping(laOperator *a, laEvent *e){
     laNewInputMapping("New Mapping"); laNotifyUsers("la.input_mapping"); return LA_FINISHED;
@@ -2625,6 +2691,7 @@ void la_RegisterBuiltinOperators(){
         laAddStringProperty(p, "id", "ID", "Disk identifier", 0, 0, 0, 0, 0, 0, 0, laget_FileBrowserDiskID, 0, 0, 0);
         laAddFloatProperty(p, "total_gb", "Total", "Disk total compacity in gigabytes", 0, 0, "GB", 0, 0, 0, 0, 0, offsetof(laDiskItem, Total_GB), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
         laAddFloatProperty(p, "free_gb", "Free", "Disk Free Space Size In Gigabytes", 0, 0, "GB", 0, 0, 0, 0, 0, offsetof(laDiskItem, Free_GB), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
+        laAddStringProperty(p,"capacity","Capacity","Capacity of this disk",LA_WIDGET_STRING_PLAIN,0,0,0,0,0,0,laget_FileBrowserDiskCapacity,0,0,LA_READ_ONLY);
     }
     p = laAddPropertyContainer("file_item", "File Item", "A file item in a list", U'🖹', 0, 0, 0, 0, 0);{
         laAddStringProperty(p, "name", "Name", "The name of the file (with extension)", 0, 0, 0, 0, 0, offsetof(laFileItem, Name), 0, 0, 0, 0, LA_UDF_LOCAL);
@@ -2705,6 +2772,8 @@ void la_RegisterBuiltinOperators(){
     
     laCreateOperatorType("LA_send_signal", "Send Signal", "Send signal to the UI", 0, 0, 0, OPINV_SendSignal, 0, 0, LA_ACTUATOR_SYSTEM);
     
+    laCreateOperatorType("LA_run_toolbox_entry", "Run Entry", "Run toolbox entry", 0, 0, 0, OPINV_RunToolboxEntry, 0, 0, LA_ACTUATOR_SYSTEM)
+        ->ParseArgs = la_RunToolboxEntryParser;
     laCreateOperatorType("LA_new_toolbox", "New Toolbox", "New custom toolbox", 0, 0, 0, OPINV_NewToolbox, 0, '+', LA_ACTUATOR_SYSTEM);
     laCreateOperatorType("LA_remove_toolbox", "Remove Toolbox", "Remove custom toolbox", 0, 0, 0, OPINV_RemoveToolbox, OPINV_RemoveToolbox, U'🞫', LA_ACTUATOR_SYSTEM);
     laCreateOperatorType("LA_new_input_mapping", "New Mapping", "New input mapping", 0, 0, 0, OPINV_NewInputMapping, 0, '+', LA_ACTUATOR_SYSTEM);

+ 1 - 0
resources/la_properties.c

@@ -1900,6 +1900,7 @@ void la_RegisterInternalProps(){
             laAddEnumItemAs(ep, "NONE", "None", "Run operator directly", 0, 0);
             laAddEnumItemAs(ep, "WIDGET", "Widget", "Run operator with extra reference of current UI", LA_KM_SEL_UI_EXTRA, 0);
             laAddEnumItemAs(ep, "PANEL", "Panel", "Run operator with extra reference of current panel", LA_KM_SEL_PANEL, 0);
+            laAddOperatorProperty(p,"run_entry","Run Entry","Run this entry","LA_run_toolbox_entry",0,0);
         }
         p = laAddPropertyContainer("la_custom_signal", "Custom Signal", "Custom signal", 0,0,sizeof(laCustomSignal), 0,0,1);{
             laAddStringProperty(p, "name", "Name", "The name of this mapping", 0,0,0,"Mapping", 1, offsetof(laCustomSignal, Name), 0,0,0,0,LA_AS_IDENTIFIER);

+ 13 - 29
resources/la_templates.c

@@ -941,17 +941,10 @@ void laui_FileBrowserDiskItem(laUiList *uil, laPropPack *This, laPropPack *OP_UN
     laUiItem *ui;
 
     c = Extra;
-    laSplitColumn(0, c, 0.2);
-    cl = laLeftColumn(c, LA_2RH);
-    cr = laRightColumn(c, 0);
-    laSplitColumn(0, cr, 0.5);
-    crl = laLeftColumn(cr, 0);
-    crr = laRightColumn(cr, 0);
-    //laShowColumnAdjuster(uil, c);
 
-    laShowItemFull(uil, cl, This, "id", LA_WIDGET_STRING_PLAIN, 0, 0, 0);
-    laShowItem(uil, crl, This, "total_gb")->Flags |= LA_UI_FLAGS_NO_DECAL;
-    laShowItem(uil, crr, This, "free_gb")->Flags |= LA_UI_FLAGS_NO_DECAL;
+    laShowItemFull(uil, c, This, "id", LA_WIDGET_STRING_PLAIN, 0, 0, 0);
+    laShowItem(uil, c, This, "capacity")->Flags |= LA_UI_FLAGS_NO_DECAL|LA_TEXT_MONO|LA_TEXT_ALIGN_RIGHT;
+    laShowSeparator(uil,c);
 }
 void laui_FileBrowserFileList(laUiList *uil, laPropPack *THIS_UNUSED, laPropPack *Operator, laColumn *UNUSED, int context){
     laColumn *col = laFirstColumn(uil), *c, *cl, *cr, *crl, *crr, *cll, *clr, *clrl, *clrr, *clrrl, *clrrr, *ulc;
@@ -1006,11 +999,8 @@ void laui_FileBrowserFileList(laUiList *uil, laPropPack *THIS_UNUSED, laPropPack
     u = laMakeFoldableGroup(ul, ulc, "Bookmarks", 0, 0, 0)->Page; c = laFirstColumn(u);
     laShowItemFull(u,c,Operator,"bookmarks",0,0,laui_IdentifierOnly,0)->Flags|=LA_UI_FLAGS_NO_DECAL;
 
-    u = laMakeGroup(ul, ulc, "Logic Drives", 0)->Page;
-    c = laFirstColumn(u); laSplitColumn(u, c, 0.2); cll = laLeftColumn(c, LA_2RH); clr = laRightColumn(c, 0);
-    laSplitColumn(u, clr, 0.5); clrl = laLeftColumn(clr, 0); clrr = laRightColumn(clr, 0);
-    laShowColumnAdjuster(u, c);
-    laShowItem(u, c, Operator, "disk_list");
+    u = laMakeFoldableGroup(ul, ulc, "Logic Drives",0 ,0, 0)->Page; c = laFirstColumn(u);
+    laShowItem(u, c, Operator, "disk_list")->Flags|=LA_UI_FLAGS_NO_DECAL;
 
     b = laMakeGroup(uil, cr, "File List", 0);b->State=LA_UI_ACTIVE; u=b->Page;
     u->HeightCoeff = -1;
@@ -1448,7 +1438,7 @@ void laui_UserPreference(laUiList *uil, laPropPack *Base, laPropPack *OperatorIn
             laShowLabel(muil, mc, "Resource Folders", 0, 0)->Expand=1;
             laShowItem(muil, mc, 0, "LA_add_resource_folder");
             laEndRow(muil,b);
-            laShowItem(muil, mc, &UP->PP, "resource_folders");
+            laShowItem(muil, mc, &UP->PP, "resource_folders")->Flags|=LA_UI_FLAGS_NO_DECAL;
         }
 
         muil = laAddTabPage(bracket, "Theme");{
@@ -1800,15 +1790,7 @@ void laui_InputMappingBundle(laUiList *uil, laPropPack *This, laPropPack *Extra,
 void laui_ToolboxEntryButton(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *UNUSED, int context){
     laColumn* c=laFirstColumn(uil);
     laInputMappingEntry* ime=This?This->EndInstance:0; if(!ime){ laShowLabel(uil,c,"?",0,0); return; }
-    if(ime->UseOperator){
-        char buf[256]; if(SSTR(ime->Key)[0]){ sprintf(buf,"text=%s;",SSTR(ime->Key),SSTR(ime->OperatorArguments)); }
-        else{ sprintf(buf,"%s",SSTR(ime->OperatorArguments)); }
-        laShowItemFull(uil,c,0,SSTR(ime->Operator),0,buf,0,0)->Flags|=LA_TEXT_ALIGN_CENTER;
-    }else{
-        char* display=SSTR(ime->Key);
-        char buf[256]; sprintf(buf,"signal=%s;text=%s;",SSTR(ime->Signal),display[0]?display:SSTR(ime->Signal));
-        laShowItemFull(uil,c,0,"LA_send_signal",0,buf,0,0)->Flags|=LA_TEXT_ALIGN_CENTER;
-    }
+    laShowItem(uil,c,This,"run_entry");
 }
 void laui_ToolboxEntry(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *ExtraColumns, int context){
     laColumn* c=ExtraColumns;
@@ -1904,19 +1886,21 @@ void laui_Toolbox(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *
         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,Extra,"toolbox",LA_WIDGET_COLLECTION_SELECTOR,0,laui_IdentifierOnly,0)->Flags|=LA_UI_COLLECTION_SIMPLE_SELECTOR;
                 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;
+                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,Extra,"toolbox",LA_WIDGET_COLLECTION_SELECTOR,0,laui_IdentifierOnly,0)->Flags|=LA_UI_COLLECTION_SIMPLE_SELECTOR;
                 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;
+                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);
 

+ 22 - 25
resources/la_widgets.c

@@ -258,7 +258,7 @@ int la_EnumGetMinWidth(laUiItem *ui){
             if (ui->ExtraInstructions){
                 if (ui->Type->OperatorType->ParseArgs){
                     char buf[256]; buf[0]=0;
-                    ui->Type->OperatorType->ParseArgs(ui->Instructions, &ico, buf);
+                    ui->Type->OperatorType->ParseArgs(0,ui->Instructions, &ico, buf);
                     tW = tnsStringGetWidth(transLate(buf), 0, ui->Flags&LA_TEXT_MONO) + SharedWidth;
                 }
             }else{
@@ -310,16 +310,14 @@ int la_ButtonGetMinWidth(laUiItem *ui){
         IconID = ui->AT->IconID;
     }
 
-    if (ui->ExtraInstructions){
-        if (ui->AT && ui->AT->ParseArgs){
-            ui->AT->ParseArgs(ui->Instructions, &IconID, buf);
+    if (ui->ExtraInstructions &&ui->AT && ui->AT->ParseArgs){
+        ui->AT->ParseArgs(0,ui->Instructions, &IconID, buf);
+        if (buf[0]) label = transLate(buf);
+    }elif (ui->PP.LastPs && ui->PP.LastPs->p->PropertyType == LA_PROP_OPERATOR){
+        laOperatorProp *ap = ui->PP.LastPs->p;
+        if (ap->OperatorType && ap->OperatorType->ParseArgs){
+            ap->OperatorType->ParseArgs(ui->PP.RawThis, ui->Instructions, &IconID, buf);
             if (buf[0]) label = transLate(buf);
-        }else if (ui->PP.LastPs->p->PropertyType == LA_PROP_OPERATOR){
-            laOperatorProp *ap = ui->PP.LastPs->p;
-            if (ap->OperatorType && ap->OperatorType->ParseArgs){
-                ap->OperatorType->ParseArgs(ui->Instructions, &IconID, buf);
-                if (buf[0]) label = transLate(buf);
-            }
         }
     }
 
@@ -919,7 +917,7 @@ void la_EnumSelectorDraw(laUiItem *ui, int h){
     int UseIco=0,ico=0; char buft[48]={0}; int HasText=0;
     if (ui->ExtraInstructions){
         if (ui->Type->OperatorType->ParseArgs){
-            ui->Type->OperatorType->ParseArgs(ui->Instructions, &UseIco, buft);
+            ui->Type->OperatorType->ParseArgs(0, ui->Instructions, &UseIco, buft);
         }
         sprintf(buf,"%s",transLate(buft)); HasText=1;
     }
@@ -987,7 +985,7 @@ void la_ButtonDraw(laUiItem *ui, int h){
         ap = ui->PP.LastPs->p;
         label = transLate(ap->Base.Name);
         if (!ap->OperatorType) ap->OperatorType = laGetOperatorType(ap->OperatorID);
-        IconID = ap->Base.IconID ? ap->Base.IconID : ap->OperatorType->IconID;
+        IconID = ap->Base.IconID ? ap->Base.IconID : (ap->OperatorType?ap->OperatorType->IconID:0);
     }else{
         label = transLate(ui->AT->Name);
         IconID = ui->AT->IconID;
@@ -1013,22 +1011,21 @@ void la_ButtonDraw(laUiItem *ui, int h){
         tnsPackAs(GL_LINE_LOOP);
     }
 
-    if (ui->ExtraInstructions){
-        uint32_t tIconID=0;
-        if (ui->AT && ui->AT->ParseArgs){
-            ui->AT->ParseArgs(ui->Instructions, &tIconID, buf);
+    uint32_t tIconID=0;
+    if (ui->ExtraInstructions && ui->AT && ui->AT->ParseArgs){
+        ui->AT->ParseArgs(0, ui->Instructions, &tIconID, buf);
+        if (buf[0]) label = transLate(buf);
+        if (tIconID) IconID=tIconID;
+    }elif (ui->PP.LastPs && ui->PP.LastPs->p->PropertyType == LA_PROP_OPERATOR){
+        laOperatorProp *ap = ui->PP.LastPs->p;
+        if (ap->OperatorType && ap->OperatorType->ParseArgs){
+            ap->OperatorType->ParseArgs(ui->PP.RawThis, ui->Instructions, &tIconID, buf);
             if (buf[0]) label = transLate(buf);
             if (tIconID) IconID=tIconID;
-        }else if (ui->PP.LastPs->p->PropertyType == LA_PROP_OPERATOR){
-            laOperatorProp *ap = ui->PP.LastPs->p;
-            if (ap->OperatorType && ap->OperatorType->ParseArgs){
-                ap->OperatorType->ParseArgs(ui->Instructions, &tIconID, buf);
-                if (buf[0]) label = transLate(buf);
-                if (tIconID) IconID=tIconID;
-            }
         }
     }
 
+
     if (IconID) L = ui->L + LA_M  + h;
     else L = ui->L + LA_M;
 
@@ -1420,7 +1417,7 @@ void la_ConditionToggleDraw(laUiItem *ui, int h){
     buf[0] = 0;
     if (ui->ExtraInstructions){
         if (ui->Type->OperatorType->ParseArgs){
-            ui->Type->OperatorType->ParseArgs(ui->Instructions, &IconID, buf);
+            ui->Type->OperatorType->ParseArgs(0, ui->Instructions, &IconID, buf);
         }
     }
     if (buf[0]){ sprintf(buf2,"%s%s",transLate(buf),(NoDecal&&(ui->State==LA_UI_NORMAL))?" [...]":""); }
@@ -1428,7 +1425,7 @@ void la_ConditionToggleDraw(laUiItem *ui, int h){
     else
         tnsDrawStringAuto(ui->State == LA_UI_ACTIVE ? "⯆" : "⯈", laThemeColor(bt, LA_BT_TEXT|UseState), ui->L+LA_M, ui->R-LA_M, ui->U, ui->Flags);
 }
-void la_DrawColumnAdjusterRecursive(int U, int B, laColumn *c, int W, tnsVector3d color, int LeftMost){
+void la_DrawColumnAdjusterRecursive(int U, int B, laColumn *c, int W, tnsVector4d color, int LeftMost){
     if (c->LS){
         la_DrawColumnAdjusterRecursive(U, B, c->LS, W, color, LeftMost);
         la_DrawColumnAdjusterRecursive(U, B, c->RS, W, color, LeftMost);