*/}}
Browse Source

Translations, widget improvements, event handling etc a whole lot

YimingWu 1 year ago
parent
commit
f98691873f
14 changed files with 761 additions and 470 deletions
  1. 0 1
      CMakeLists.txt
  2. 20 9
      la_data.c
  3. 4 0
      la_data.h
  4. 4 0
      la_interface.h
  5. 64 53
      la_kernel.c
  6. 12 3
      la_tns_kernel.c
  7. 19 0
      la_translation_gen.py
  8. 16 23
      la_util.c
  9. 0 2
      lagui-config.cmake
  10. 10 10
      resources/la_operators.c
  11. 355 355
      resources/la_properties.c
  12. 1 1
      resources/la_templates.c
  13. 242 0
      resources/la_translations.c
  14. 14 13
      resources/la_widgets.c

+ 0 - 1
CMakeLists.txt

@@ -27,7 +27,6 @@ include_directories(
 	${GLEW_INCLUDE_PATH}
 	${GLM_INCLUDE_PATH}
 	${FREETYPE_INCLUDE_DIRS}
-    ${ODE_INCLUDE_DIRS}
     lagui
 )
 

+ 20 - 9
la_data.c

@@ -804,6 +804,7 @@ laProp *la_CreateProperty(laPropContainer *Container, int Type, const char *Iden
     p->IsRadAngle = (Tag & LA_RAD_ANGLE)? 1 : 0;
     p->UDFHideInSave = (Tag & LA_HIDE_IN_SAVE)? 1 : 0;
     p->UDFReadProgress = (Tag & LA_PROP_READ_PROGRESS)?1:0;
+    p->CanTranslate = (Tag & LA_TRANSLATE)?1:0;
     if(p->IsRadAngle&&(!p->Unit)) p->Unit="°"; 
 
     return p;
@@ -2949,6 +2950,16 @@ void laRequestAdditionalRegistry(laUDFRegistry* r);
 laUDFOwnHyperItem* laNewHyperResource(char* uid);
 laUDFOwnHyperItem* laFindHyperResource(char* uid);
 
+void la_LoadAdditionalRegistries(){
+    laUDFRegistry* r;
+    while(r=lstPopPointer(&MAIN.PendingResourceRequests)){
+        laManagedUDF* m;
+        logPrint("[INFO] Loading additional resource: %s\n",r->Path->Ptr);
+        laUDF* udf = laOpenUDF(r->Path->Ptr, 1, 0, &m);
+        if (udf){ laExtractUDF(udf, m, LA_UDF_MODE_OVERWRITE, 0); laCloseUDF(udf); }else{ logPrint("[WARN] Can't open resource: %s\n",r->Path->Ptr); }
+    }
+}
+
 void la_ExecutePtrSyncCommand(int Mode){
     int i;
     laPtrSyncCommand *psc,*NextPSC;
@@ -2991,14 +3002,7 @@ void la_ExecutePtrSyncCommand(int Mode){
     }
 
     logPrint("Reference Match: Total %d, Failed %d\n", AllCount, FailCount);
-
-    laUDFRegistry*r;
-    while(r=lstPopPointer(&MAIN.PendingResourceRequests)){
-        laManagedUDF* m;
-        logPrint("[INFO] Loading additional resource: %s\n",r->Path->Ptr);
-        laUDF* udf = laOpenUDF(r->Path->Ptr, 1, 0, &m);
-        if (udf){ laExtractUDF(udf, m, LA_UDF_MODE_OVERWRITE, 0); laCloseUDF(udf); }else{ logPrint("[WARN] Can't open resource: %s\n",r->Path->Ptr); }
-    }
+    la_LoadAdditionalRegistries();
 }
 
 int la_ExtractFakeProp(laUDF *udf){
@@ -3573,7 +3577,7 @@ void la_ReadOwnHyperItems(laUDF *udf, laUDFRegistry* r){
             ohi->Registry = r;
             ohi->Seek = Seek;
             strcpy(ohi->NUID.String, uid.String);
-            logPrint("Found Resource: %s | %s\n",ohi->NUID.String,name);
+            //logPrint("Found Resource: %s | %s\n",ohi->NUID.String,name);
         } else {logPrint("Duplicated Resource: %s | %s\n",uid.String,name);}
     }
 }
@@ -3662,6 +3666,13 @@ void laCloseUDF(laUDF *udf){
     if(!udf->Managed){ strSafeDestroy(&udf->FileName); memFree(udf); }
 }
 
+int laLoadHyperResources(char* uid_search){
+    int count=0;
+    for(laUDFOwnHyperItem* ohi=MAIN.UDFResources.pFirst;ohi;ohi=ohi->Item.pNext){
+        if(strstr(ohi->NUID.String,uid_search)){ laRequestAdditionalRegistry(ohi->Registry); count++; };
+    }
+    if(count){ la_LoadAdditionalRegistries(); } return count;
+}
 laUDFOwnHyperItem* laFindHyperResource(char* uid){
     for(laUDFOwnHyperItem* ohi=MAIN.UDFResources.pFirst;ohi;ohi=ohi->Item.pNext){
         if(!strcmp(uid, ohi->NUID.String)) return ohi;

+ 4 - 0
la_data.h

@@ -225,6 +225,7 @@ STRUCTURE(laProp){
     char UDFSingleManageable;
     char UDFReadProgress;
     char IsRadAngle;
+    char CanTranslate;
 
     //int           SignalThrow;
     //int           SignalCatch;
@@ -697,6 +698,7 @@ STRUCTURE(laDiffPost){
 #define LA_UDF_USE_LINK_NODE (1<<26)
 #define LA_READ_ONLY (1<<27)
 #define LA_HIDE_IN_SAVE (1<<28)
+#define LA_TRANSLATE (1<<29)
 
 STRUCTURE(laThreadNotifier){
     laListItem Item;
@@ -920,6 +922,8 @@ laUDF *laOpenUDF(char *FileName, int ReadToMemory, laUDFRegistry* ReadRegistryRe
 void laCloseUDF(laUDF *udf);
 int laExtractUDF(laUDF *udf, laManagedUDF* mUDF, int Mode, laListHandle *Parent);
 
+int laLoadHyperResources(char* uid_search);
+
 laUDFOwnHyperItem* laFindHyperItem(laPropContainer* pc, char* uid);
 laUDFRegistry* laFindUDFRegistry(char* Path);
 laUDFRegistry* laCreateUDFRegistry(char* Path);

+ 4 - 0
la_interface.h

@@ -314,6 +314,7 @@ STRUCTURE(LA){
     int WacomDeviceStylus; real StylusPressure, StylusAngleX, StylusAngleY, StylusMaxPressure;
     int WacomDeviceEraser; real EraserPressure, EraserAngleX, EraserAngleY, EraserMaxPressure;
     int PointerIsEraser,IsPen;
+    int evLastX,evLastY;
 
     laWindow *CurrentWindow;
     laPanel *CurrentPanel;
@@ -1107,6 +1108,7 @@ STRUCTURE(laPanel){
     int Show;
     int DefaultGLFormat;
     short Refresh;
+    short ShowCorner;
     unsigned int FrameDistinguish;
 
     char BoundUi;
@@ -1715,6 +1717,8 @@ STRUCTURE(laManagedSaveExtra){
 #define LA_UDF_SHARE_POINTER(id) \
     la_UDFAppendSharedTypePointer("" #id, id)
 
+void la_MakeTranslations();
+
 laCanvasTemplate *la_GetCanvasTemplate(char *TargetContainerID, char* TemplateID);
 laPropContainer* laUiHasExtraProps(laUiType *ut, int size, int hyper);
 laPropContainer* laCanvasHasExtraProps(laCanvasTemplate *ct, int size, int hyper);

+ 64 - 53
la_kernel.c

@@ -93,6 +93,8 @@ static void la_RegisterWacomEventMasks(Display *display, int deviceid, real* max
 
 	logPrint("    Device Name: '%s' (%d)\n", dev->name, dev->deviceid);
 	//la_PrintWacomValuators(display, dev->classes, dev->num_classes);
+
+    XIFreeDeviceInfo(dev);
 }
 void la_ScanWacomDevices(Display *display, int deviceid){
     XIDeviceInfo *info, *dev;
@@ -124,6 +126,7 @@ void la_ScanWacomDevices(Display *display, int deviceid){
 	}else{
         logPrintNew("No wacom pen device connected.\n");
 	}
+    XIFreeDeviceInfo(info);
 }
 
 void laHideCursor(){
@@ -151,14 +154,14 @@ Window la_CreateWindowX11(int x, int y, int w, int h, char *title, int SyncToVBl
         XSetNormalHints(MAIN.dpy, win, &my_hints);
     }
 
-    //int attribs[] = { GLX_CONTEXT_MAJOR_VERSION_ARB, 3, GLX_CONTEXT_MINOR_VERSION_ARB, 3, 0};
-    //if (((*r_glc) = glXCreateContextAttribsF(MAIN.dpy, MAIN.BestFBC, MAIN.glc, GL_TRUE, attribs)) == NULL){
-    //    printf("\n\tcannot create gl context\n\n"); exit(0);
-    //}
+    int attribs[] = { GLX_CONTEXT_MAJOR_VERSION_ARB, 4, GLX_CONTEXT_MINOR_VERSION_ARB, 6, 0};
+    if (((*r_glc) = glXCreateContextAttribsF(MAIN.dpy, MAIN.BestFBC, MAIN.glc, GL_TRUE, attribs)) == NULL){
+        printf("\n\tcannot create gl context\n\n"); exit(0);
+    }
 
     XStoreName(MAIN.dpy, win, title);
     XMapWindow(MAIN.dpy, win);
-    glXMakeContextCurrent(MAIN.dpy, win, win, MAIN.glc);
+    glXMakeCurrent(MAIN.dpy, win, (*r_glc));
 
     int sync=SyncToVBlank?1:0; glXSwapIntervalEXTF(MAIN.dpy, win, sync);
 
@@ -215,7 +218,7 @@ int la_CreateSystemWindow(laWindow *window, int SyncToVBlank){
 };
 void la_DestroySystemWindowX11(laWindow* w){
     glXMakeCurrent(MAIN.dpy, None, NULL);
-    //glXDestroyContext(MAIN.dpy, w->glc);
+    glXDestroyContext(MAIN.dpy, w->glc);
     XDestroyWindow(MAIN.dpy, w->win);
 };
 int la_DestroySystemWindow(laWindow* wnd){
@@ -321,8 +324,8 @@ void laShowProgress(real p1, real p2){
         real t=laTimeElapsedSecondsf(&tm,&MAIN.Progress.TimeCalled); if(t<0.1) return;
         memcpy(&MAIN.Progress.TimeCalled,&tm,sizeof(laTimeRecorder));
         if(!MAIN.Progress.Shown){
-            int w=XDisplayWidth(MAIN.dpy, 0),h=XDisplayHeight(MAIN.dpy, 0);
-            XMoveResizeWindow(MAIN.dpy,MAIN.Progress.w,w/2-PROGRESSW/2,h/2-LA_RH*2/2,PROGRESSW,LA_RH*2);
+            int w=XDisplayWidth(MAIN.dpy, 0),h=XDisplayHeight(MAIN.dpy, 0); int ww=PROGRESSW+LA_RH*2;
+            XMoveResizeWindow(MAIN.dpy,MAIN.Progress.w,w/2-ww/2,h/2-LA_RH*2/2,ww,LA_RH*2);
             long a=LA_COLOR3_TO_HEX(bg);
             XSetForeground(MAIN.dpy,MAIN.Progress.gc,LA_COLOR3_TO_HEX(fg));
             XSetBackground(MAIN.dpy,MAIN.Progress.gc,LA_COLOR3_TO_HEX(bg));
@@ -337,7 +340,7 @@ void laShowProgress(real p1, real p2){
     XFillRectangle(MAIN.dpy,MAIN.Progress.w,MAIN.Progress.gc,LA_RH*2,LA_RH,PROGRESSW*MAIN.Progress.p2,LA_RH);
     tnsDrawLCD7_ProgressX11(LA_RH*1.5,0,MAIN.Progress.p1);
     tnsDrawLCD7_ProgressX11(LA_RH*1.5,LA_RH,MAIN.Progress.p2);
-    XFlush(MAIN.dpy); XSync(MAIN.dpy, 0);
+    XSync(MAIN.dpy, 0); XFlush(MAIN.dpy);
 }
 void laHideProgress(){
     if(!MAIN.Progress.Shown){
@@ -352,7 +355,7 @@ void laHideProgress(){
 
 //=======================
 
-void laInitProgressWindow(){
+void la_InitProgressWindow(){
     MAIN.Progress.w=XCreateSimpleWindow(MAIN.dpy, RootWindow(MAIN.dpy, 0), 0, 0, PROGRESSW+LA_RH*2, LA_RH*2, 0, BlackPixel(MAIN.dpy, 0), WhitePixel(MAIN.dpy, 0));
     if(!MAIN.Progress.w) return;
     Atom window_type = XInternAtom(MAIN.dpy, "_NET_WM_WINDOW_TYPE", False); long value = XInternAtom(MAIN.dpy, "_NET_WM_WINDOW_TYPE_DOCK", False);
@@ -440,7 +443,7 @@ int laGetReady(){
     }
     glXSwapIntervalEXTF = (glXSwapIntervalEXTProc) glXGetProcAddressARB( (const GLubyte *) "glXSwapIntervalEXT" );
 
-    glXMakeContextCurrent(MAIN.dpy, win,win, MAIN.glc);
+    glXMakeCurrent(MAIN.dpy, win, MAIN.glc);
 
     int major,minor; glGetIntegerv(GL_MAJOR_VERSION, &major); glGetIntegerv(GL_MINOR_VERSION, &minor);
     logPrint("    OpenGL Version: %d.%d\n",major,minor);
@@ -526,7 +529,8 @@ int laGetReady(){
 
     laAddExtraExtension(LA_FILETYPE_UDF,"udf",0);
 
-    laInitProgressWindow();
+    la_InitProgressWindow();
+    la_MakeTranslations();
 
     //tns_RegisterResourcesForSoftwareRender();
     la_RegisterGeneralProps();
@@ -561,6 +565,8 @@ int laGetReady(){
 }
 
 void laShutoff(){
+    transDumpMissMatchRecord("TranslationDump.txt");
+
     if(MAIN.Cleanup) MAIN.Cleanup();
 
     strSafeDestroy(&MAIN.WorkingDirectory);
@@ -705,7 +711,7 @@ void la_RecalcBlockRecursive(laBlock *b, int X, int Y, int W, int H){
         p->TX = X + LA_SEAM_W; p->TY = Y + LA_SEAM_W + TitleGap;
         p->TW = W - LA_SEAM_W*2; p->TH = H - LA_SEAM_W*2 - TitleGap;
         p->Refresh |= LA_TAG_RECALC;
-        p->TitleWidth = tnsStringGetWidth(p->Title->Ptr, 0, 0);
+        p->TitleWidth = tnsStringGetWidth(transLate(p->Title->Ptr), 0, 0);
     }
 }
 void la_UpdateUiPlacement(laWindow *w){
@@ -770,21 +776,21 @@ int la_OnWindowDestroy(Window wnd){
     return 0;
 }
 
-void la_MakeSpecialKeyBit(Window*hwnd,laWindow*wnd,laEvent *e,int use_last_pos){
+void la_MakeSpecialKeyBit(Window hwnd,laWindow*wnd,laEvent *e,int use_last_pos){
     laListHandle *el = &wnd->EventList;
     laEvent* last_e=el->pLast;
-    Window root_ret, win_ret; int rrx,rry,rx,ry,rmask;
-    XQueryPointer(MAIN.dpy, hwnd, &root_ret,&win_ret,&rrx,&rry,&rx,&ry,&rmask);
-    if(use_last_pos){ if(last_e){ e->x= last_e->x; e->y= last_e->y; }else{ e->x = rx; e->y = ry; } }
+    Window root_ret, win_ret; int rrx=0,rry=0,rx=e->x,ry=e->y,rmask=0;
+    XQueryPointer(MAIN.dpy, wnd->win, &root_ret,&win_ret,&rrx,&rry,&rx,&ry,&rmask);
     e->SpecialKeyBit = ((rmask&ShiftMask)?LA_KEY_SHIFT:0)|((rmask&ControlMask)?LA_KEY_CTRL:0)|((rmask&Mod1Mask)?LA_KEY_ALT:0);
 }
 void la_SaveEvent(Window hwnd, laEvent *e, int use_last_pos){
     laListHandle *wl = &MAIN.Windows;
     laWindow* wnd = lstFindItem(hwnd, la_IsThisSysWindow, wl);
-    if (!wnd){ FreeMem(e); return; }
+    if (!wnd){ memFree(e); return; }
     laListHandle *el = &wnd->EventList;
 
     la_MakeSpecialKeyBit(hwnd,wnd,e,use_last_pos);
+    if(use_last_pos){ e->x=MAIN.evLastX; e->y=MAIN.evLastY; }
 
     e->Pressure=MAIN.IsPen?(MAIN.PointerIsEraser?MAIN.EraserPressure:MAIN.StylusPressure):0.5f;
     e->AngleX=MAIN.PointerIsEraser?MAIN.EraserAngleX:MAIN.StylusAngleX;
@@ -795,17 +801,17 @@ void la_SaveEvent(Window hwnd, laEvent *e, int use_last_pos){
     laMappingRequestEval();
 };
 void la_SendKeyboardEvent(Window hwnd, int type, int key){
-    laEvent *e = CreateNew(laEvent); e->Type = type; e->key = key;
+    laEvent *e = memAcquireSimple(sizeof(laEvent)); e->Type = type; e->key = key;
     la_SaveEvent(hwnd, e, 1);
 };
 void la_SendInputEvent(Window hwnd, uint32_t Input){
-    laEvent *e = CreateNew(laEvent);
+    laEvent *e = memAcquireSimple(sizeof(laEvent));
     e->Type = LA_INPUT; e->Input=Input;
 
     la_SaveEvent(hwnd, e, 1);
 }
 void la_SendEmptyEvent(Window hwnd){
-    laEvent *e = CreateNew(laEvent);
+    laEvent *e = memAcquireSimple(sizeof(laEvent));
 
     e->Type = LA_EMPTY;
 
@@ -836,17 +842,19 @@ int la_TranslateSpecialKey(int keysym){
     }
 }
 void la_SendMouseEvent(Window hwnd, int type, int x, int y){
-    laEvent *e = CreateNew(laEvent);
-    e->Type = type;
-    e->x = x;
-    e->y = y;
+    //if((type&LA_STATE_DOWN)&&(x!=MAIN.evLastX || y!=MAIN.evLastY)){
+    //    laEvent *e = memAcquireSimple(sizeof(laEvent));
+    //    e->Type = LA_MOUSEMOVE; e->x = x; e->y = y;
+    //    la_SaveEvent(hwnd, e, 0);
+    //}
+
+    laEvent *e = memAcquireSimple(sizeof(laEvent));
+    e->Type = type; e->x = x; e->y = y;
     la_SaveEvent(hwnd, e, 0);
-    //printf("mouse %d %d\n", e->x, e->y);
-    //if (e->Type == LA_R_MOUSE_DOWN)
-    //	la_PrintOperatorStack();
+    MAIN.evLastX=x; MAIN.evLastY=y;
 };
 void la_SendTimerEvent(Window hwnd, int type){
-    laEvent *e = CreateNew(laEvent);
+    laEvent *e = memAcquireSimple(sizeof(laEvent));
     e->Type = type;
     la_SaveEvent(hwnd, e, 1);
 };
@@ -1219,6 +1227,7 @@ void la_PanelDrawToWindow(laPanel *p, laWindow *w){
     switch (p->AnimationMode){
     case 0:
         tnsDraw2DTextureDirectly(p->OffScr->pColor[0], p->X, p->Y, p->W, p->H);
+        if(p->ShowCorner && ((!p->SR) && (!p->SB))){ tnsDrawStringAuto("◢",laThemeColor(_LA_THEME_PANEL,LA_BT_TEXT),p->X+p->W-LA_RH,p->X+p->W,p->Y+p->H-LA_RH,0); }
         //if(p->Mode==LA_PANEL_FLOATING_TOP)
         //    tnsDrawStringAuto("◿",laThemeColor(*p->BT,LA_BT_BORDER),p->X+p->W-LA_RH, p->X+p->W, p->H+p->Y-LA_RH, LA_TEXT_ALIGN_CENTER);
         break;
@@ -1328,8 +1337,8 @@ void la_PanelRefreshDetachedProp(laPanel *panel){
 }
 
 void la_PanelDrawDescendBorder(laPanel *Panel, laBoxedTheme *bt, int Width, real Alpha){
-    real* color=laThemeColor(bt,LA_BT_NORMAL);
-    tnsColor4d(LA_COLOR3(color),Alpha);
+    real* color=laThemeColor(bt,LA_BT_BORDER);
+    tnsColor4d(0,0,0,Alpha);
     tnsVertex2d(Panel->X + Width, Panel->Y + Panel->H);
     tnsVertex2d(Panel->X + Width, Panel->Y + Panel->H + Width);
     tnsVertex2d(Panel->X + Panel->W, Panel->Y + Panel->H);
@@ -1433,8 +1442,6 @@ void la_PanelDefDraw(laWindow *w, laPanel *p, laBoxedTheme *bt){
         tnsViewportWithScissor(0, 0, w->CW, w->CH);
         tnsOrtho(0, w->CW, w->CH, 0, -100, 100);
 
-        la_PanelDrawToWindow(p, w);
-
         if (p->Mode && (!p->AnimationMode || (p->AnimationMode && p->AnimationRatio > 0.99))){
             tnsUseNoTexture();
             if (!p->IsMenuPanel){
@@ -1442,6 +1449,9 @@ void la_PanelDefDraw(laWindow *w, laPanel *p, laBoxedTheme *bt){
             }
             tnsFlush();
         }
+
+        la_PanelDrawToWindow(p, w);
+
     }elif (p->AnimationMode){
         la_PanelDrawToWindow(p, w);
     }
@@ -1625,9 +1635,9 @@ void la_BlockDefDrawSelf(laBlock *b, int CH){
             tnsColor4dv(laThemeColor(bt,LA_BT_BORDER));
             tnsVertexArray2d(tv, 4);
             tnsPackAs(GL_TRIANGLE_FAN);
-            tnsDrawStringAuto(p->Title->Ptr, laThemeColor(bt,LA_BT_TEXT_ACTIVE), b->X + L +LT* ratio + LA_SEAM_W, b->X + L +RT* ratio, CH - b->Y, LA_TEXT_REVERT_Y);
+            tnsDrawStringAuto(transLate(p->Title->Ptr), laThemeColor(bt,LA_BT_TEXT_ACTIVE), b->X + L +LT* ratio + LA_SEAM_W, b->X + L +RT* ratio, CH - b->Y, LA_TEXT_REVERT_Y);
         }else{
-            tnsDrawStringAuto(p->Title->Ptr, laThemeColor(bt,LA_BT_TEXT), b->X + L +LT* ratio + LA_SEAM_W, b->X + L +RT* ratio, CH - b->Y, LA_TEXT_REVERT_Y);
+            tnsDrawStringAuto(transLate(p->Title->Ptr), laThemeColor(bt,LA_BT_TEXT), b->X + L +LT* ratio + LA_SEAM_W, b->X + L +RT* ratio, CH - b->Y, LA_TEXT_REVERT_Y);
         }
 
         LT =RT;
@@ -1653,7 +1663,7 @@ void la_BlockDefDrawSelfEmpty(laBlock *b, int CH){
     tnsColor4dv(laThemeColor(bt,LA_BT_NORMAL));
     tnsPackAs(GL_TRIANGLE_FAN);
 
-    tnsDrawStringAuto("Dock some panels here.", laThemeColor(bt,LA_BT_TEXT), b->X+LA_SEAM_W,b->X+b->W-LA_SEAM_W, CH-b->Y-b->H/2+LA_RH2,
+    tnsDrawStringAuto(transLate("Dock some panels here."), laThemeColor(bt,LA_BT_TEXT), b->X+LA_SEAM_W,b->X+b->W-LA_SEAM_W, CH-b->Y-b->H/2+LA_RH2,
         LA_TEXT_ALIGN_CENTER|LA_TEXT_REVERT_Y|LA_TEXT_USE_NEWLINE|LA_TEXT_LINE_WRAP);
     tnsFlush();
 
@@ -1821,7 +1831,7 @@ void la_WindowDefDraw(laWindow *w, laBoxedTheme *bt){
 }
 int laStartWindow(laWindow *w){
     //ShowWindow(w->win, SW_SHOWNORMAL);
-    glXMakeContextCurrent(MAIN.dpy, w->win,w->win, MAIN.glc);
+    glXMakeContextCurrent(MAIN.dpy, w->win,w->win, w->glc);
     MAIN.CurrentWindow = w;
     if(!w->CurrentLayout){
         if(!w->Layouts.pFirst){laDesignLayout(w, "Empty Layout");}
@@ -2157,7 +2167,7 @@ laPanel *laCreatePanelT(laBlock *b, laUiTemplate* uit){
     p->Refresh = LA_TAG_RECALC;
     p->FrameDistinguish = 100; //greater than 1 is ok
 
-    p->TitleWidth = tnsStringGetWidth(p->Title->Ptr, 0, 0);
+    p->TitleWidth = tnsStringGetWidth(transLate(p->Title->Ptr), 0, 0);
 
     while (b->B1){
         b = b->B1;
@@ -5107,7 +5117,7 @@ int la_DrawUiListRecursive(laUiListDraw *uild, laUiList *uil, int L, int R, int
                     if(sub->TabName && sub->TabName->Ptr){
                         int NoDecal=ui->Flags&LA_UI_FLAGS_NO_DECAL;
                         int NoGap=ui->Flags&LA_UI_FLAGS_NO_GAP;
-                        tnsDrawStringAuto(sub->TabName->Ptr,laThemeColor(bt,LA_BT_DISABLED|LA_BT_TEXT),
+                        tnsDrawStringAuto(transLate(sub->TabName->Ptr),laThemeColor(bt,LA_BT_DISABLED|LA_BT_TEXT),
                             ui->L+(NoDecal?0:bt->LM)+(NoGap?0:bt->LP),ui->R,sub->U-LA_RH,LA_TEXT_MONO);
                         tnsFlush();
                     }
@@ -6205,6 +6215,8 @@ int la_HandleSingleEvent(laEvent *e, laListHandle *Operators){
 
     a = Operators->pFirst;
 
+    la_DestroyConfirmData(&MAIN.InvokeConfirmData);
+
     while (1){
         if (!a) break;
 
@@ -6306,26 +6318,25 @@ int la_HandleEvents(laWindow *w){
 
     while (1){
         if (MAIN.ReTriggerOperators) laSendOperatorTriggerEvent();
-        while (w->PendingOperators.pLast){
-            a = w->PendingOperators.pLast;
-            if (a->OperatorPanel){
-                laSetOperatorLocalizer(a->OperatorPanel);
-                if (a->OperatorPanel->Mode == LA_PANEL_FLOATING_TOP)
-                    laInvokeUi(a, "LA_modal_panel_operator", 0, a->OperatorPanel, 0, 1);
+        while (w->EventList.pFirst){
+            while (w->PendingOperators.pLast){
+                a = w->PendingOperators.pLast;
+                if (a->OperatorPanel){
+                    laSetOperatorLocalizer(a->OperatorPanel);
+                    if (a->OperatorPanel->Mode == LA_PANEL_FLOATING_TOP)
+                        laInvokeUi(a, "LA_modal_panel_operator", 0, a->OperatorPanel, 0, 1);
+                }
+                lstRemoveItem(&w->PendingOperators, a);
+                lstPushItem(&w->Operators, a);
             }
-            lstRemoveItem(&w->PendingOperators, a);
-            lstPushItem(&w->Operators, a);
-        }
-        while (1){
-            if (!w->EventList.pFirst) break;
 
             e = lstPopItem(&w->EventList);
 
             if (e && !w->Operators.pFirst){ laInvokeUi(0, "LA_window_operator", e, w, 0, 0); }
 
-            if (e) if(!la_HandleSingleEvent(e, &w->Operators)){ la_StopAllOperators(); FreeMem(e); return 0; } //EXIT
+            if (e) if(!la_HandleSingleEvent(e, &w->Operators)){ la_StopAllOperators(); memFree(e); return 0; } //EXIT
 
-            FreeMem(e);
+            memFree(e);
         }
         if (!MAIN.ReTriggerOperators) break;
     }
@@ -6526,7 +6537,7 @@ void laMainLoop(){
             la_DrawWindow(w);
         }
         for(w=MAIN.Windows.pFirst;w;w=w->Item.pNext){
-            glXSwapBuffers(MAIN.dpy, w->win);
+            glXSwapBuffers(MAIN.dpy, w->win); //XSync(MAIN.dpy,0);
         }
 
         if(MAIN.PostFrame){ MAIN.PostFrame(); }

+ 12 - 3
la_tns_kernel.c

@@ -414,7 +414,8 @@ void tnsSwitchToCurrentWindowContext(void *wnd){
 //
     //int s = wglMakeCurrent(hdc, hglrc);
     laWindow* win = wnd;
-    glXMakeContextCurrent(MAIN.dpy, win->win, win->win, MAIN.glc);
+    glXMakeCurrent(MAIN.dpy,win->win, MAIN.glc);//on intel it should not be win->glc?
+    //glXMakeContextCurrent(MAIN.dpy, win->win, win->win, win->glc);
 };
 void tnsViewportWithScissor(int x, int y, int w, int h){
     tnsShader *current_shader = 0;
@@ -2889,8 +2890,16 @@ int tnsLoadSystemFont(char* from, char* name){
     int GenHeight=LA_RH*MAIN.FontSize;
     for(int i=-1;i<9;i++){
         char* option=(i<0)?from:TNS_FONT_LOAD_OPTIONS[i]; sprintf(buf,"%s%s",option,name);
-        if (FT_New_Face(f->ftlib, buf, 0, &f->ftface[f->NumFaces])) continue;
-        FT_Select_Charmap(f->ftface[f->NumFaces], FT_ENCODING_UNICODE);
+        FT_Face face; FT_Long i,num_faces; FT_Open_Args args; args.flags=FT_OPEN_PATHNAME; args.pathname=buf;
+        if(FT_Open_Face(f->ftlib, &args, -1, &face )) continue;
+        num_faces = face->num_faces; FT_Done_Face(face); int found=0;
+        for(int fa=0;fa<num_faces;fa++){
+            if(FT_Open_Face(f->ftlib,&args,fa,&face)){ continue; }
+            if(strstr(face->family_name,"SC")){ found=1; break; }
+            FT_Done_Face(face);
+        }
+        if(found){ f->ftface[f->NumFaces]=face; }else{ if (FT_New_Face(f->ftlib, buf, 0, &f->ftface[f->NumFaces])) continue; }
+        FT_Select_Charmap(f->ftface[f->NumFaces], FT_ENCODING_UNICODE);printf("%s",f->ftface[f->NumFaces]->family_name);
         FT_Set_Char_Size(f->ftface[f->NumFaces], 0, GenHeight << 6, 96, 96);
         f->NumFaces++; FT_Glyph glyph; int half_adv=0;
         if(!f->MonoAdvance && !FT_Get_Advance(f->ftface[f->NumFaces],'a',FT_LOAD_TARGET_NORMAL | FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP, &half_adv)){

+ 19 - 0
la_translation_gen.py

@@ -0,0 +1,19 @@
+import sys,re
+
+if(len(sys.argv))<2:
+    print("Provide a file!")
+    exit(1)
+
+try:
+    f=open(sys.argv[1])
+    t=open("GeneratedTranslations.c",'w')
+    lines = f.readlines()
+    t.write("static const char *entries[]={\n")
+    for l in lines:
+        ma=re.search(r"(.*?)\s*\|\s*(.*)",l)
+        if ma:
+            t.write("\"%s\",\"%s\",\n"%(ma.group(1),ma.group(2)))
+    t.write("0,0};\nfor(int i=0;;i++){if(!entries[i*2])break;\ntransNewEntry(entries[i*2],entries[i*2+1]);\n}")
+except:
+    print("Error parsing file")
+    exit(1)

+ 16 - 23
la_util.c

@@ -967,7 +967,7 @@ unsigned char hsh256DoHashSTR(char *buckle){
 }
 
 void hsh256InsertItemCSTR(laHash256 *hash, laListItem *li, char *buckle){
-    int a = hsh256DoHashSTR(buckle);
+    unsigned char a = hsh256DoHashSTR(buckle);
     lstAppendItem(&hash->Entries[a], li);
 };
 void hsh256InsertItem(laHash256 *hash, laListItem *li, char buckle){
@@ -987,7 +987,9 @@ laListItem *hsh256FindItemSTR(laHash256 *hash, laCompareFunc func, char *buckle)
     //if(hash->Entries[hsh].pFirst == hash->Entries[hsh].pLast)
     //    return hash->Entries[hsh].pFirst;
 
-    return lstFindItem(buckle, func, &hash->Entries[hsh]);
+    laListItem* item=lstFindItem(buckle, func, &hash->Entries[hsh]);
+
+    return item;
 }
 
 //================================================================ [mem]
@@ -2026,7 +2028,7 @@ void strMoveView(laStringEdit *se, int DownLines, int RightCharacters){
 //======================================================[ translation ]
 
 void transNewLanguage(const char *LanguageID){
-    laTranslationNode *tn = CreateNew(laTranslationNode);
+    laTranslationNode *tn = memAcquire(sizeof(laTranslationNode));
     strSafeSet(&tn->LanguageName, LanguageID);
 
     lstAppendItem(&MAIN.Translation.Languages, tn);
@@ -2035,65 +2037,56 @@ void transNewLanguage(const char *LanguageID){
 }
 void transSetLanguage(const char *LanguageID){
     laTranslationNode *tn;
-
     if (!LanguageID){
         MAIN.Translation.CurrentLanguage = 0;
         return;
     }
-
     for (tn = MAIN.Translation.Languages.pFirst; tn; tn = tn->Item.pNext){
         if (!strcmp(tn->LanguageName->Ptr, LanguageID)){
-            MAIN.Translation.CurrentLanguage = tn;
-            break;
+            MAIN.Translation.CurrentLanguage = tn; return;
         }
     }
+    transNewLanguage(LanguageID);
 }
 void transDumpMissMatchRecord(const char *filename){
     laTranslationMatch *tm;
     laListHandle *lst;
     int i;
 
-    FILE *f = fopen(filename, "w");
-    if (!f) return;
+    FILE *f = fopen(filename, "w"); if (!f) return;
 
     for (i = 0; i < 256; i++){
         lst = &MAIN.Translation.MisMatches.Entries[i];
-        for (tm = lst->pFirst; tm; tm = tm->Item.pNext){
-            fprintf(f, "transNewEntry(\"%s\",\"\");\n", tm->Target);
-        }
+        for (tm = lst->pFirst; tm; tm = tm->Item.pNext){ if(tm->Target) fprintf(f, "%s | \n", tm->Target); }
     }
 
     fclose(f);
 }
 int IsThisTranslationMatch(laTranslationMatch *tm, char *p){
-    return (tm->Target && !strcmp(tm->Target, p));
+    return (tm->Target && (!strcmp(tm->Target, p)));
 }
 void transNewEntry(const char *Target, const char *replacement){
     laTranslationMatch *tm = memAcquireSimple(sizeof(laTranslationMatch));
-    tm->Target = Target;
-    tm->Replacement = replacement;
+    tm->Target = Target; tm->Replacement = replacement;
     hsh256InsertItemCSTR(&MAIN.Translation.CurrentLanguage->Matches, tm, Target);
 }
 void transNewMissEntry(const char *Target){
     if (!hsh256FindItemSTR(&MAIN.Translation.MisMatches, IsThisTranslationMatch, Target)){
         laTranslationMatch *tm = memAcquireSimple(sizeof(laTranslationMatch));
-        tm->Target = Target;
+        int len=strlen(Target); tm->Target=memAcquireSimple(len*sizeof(char)+1);
+        strcpy(tm->Target,Target);
         hsh256InsertItemCSTR(&MAIN.Translation.MisMatches, tm, Target);
     }
 }
 char *transLate(char *Target){
-    if (!MAIN.Translation.CurrentLanguage || !MAIN.Translation.EnableTranslation) return Target;
+    if (!MAIN.Translation.CurrentLanguage || !MAIN.Translation.EnableTranslation || !Target || !Target[0]) return Target;
     laTranslationMatch *tm = hsh256FindItemSTR(&MAIN.Translation.CurrentLanguage->Matches, IsThisTranslationMatch, Target);
-    if (!tm){
-        transNewMissEntry(Target);
-        return Target;
-    }
+    if (!tm){ transNewMissEntry(Target); return Target; }
     return tm->Replacement;
 }
 void transState(void *UNUSED, int val){
     if (val) MAIN.Translation.EnableTranslation = 1;
-    else
-        MAIN.Translation.EnableTranslation = 0;
+    else MAIN.Translation.EnableTranslation = 0;
 
     laRedrawCurrentWindow();
 }

+ 0 - 2
lagui-config.cmake

@@ -13,7 +13,6 @@ find_package(X11 REQUIRED)
 find_package(Freetype REQUIRED)
 find_package(GLEW REQUIRED)
 #find_package(PNG REQUIRED)
-find_package(ODE REQUIRED)
 
 set(LAGUI_SHARED_LIBS
     ${X11_LIBRARIES}
@@ -34,7 +33,6 @@ set(LAGUI_INCLUDE_DIRS_ALL
     ${GLEW_INCLUDE_PATH}
     ${GLM_INCLUDE_PATH}
     ${FREETYPE_INCLUDE_DIRS}
-    ${ODE_INCLUDE_DIRS}
     ${LAGUI_INCLUDE_DIRS}
     CACHE INTERNAL "Include dirs of LaGUI and dependencies"
 )

+ 10 - 10
resources/la_operators.c

@@ -408,6 +408,7 @@ int OPEXT_FileBrowser(laOperator *a, int mark){
     while (f=lstPopItem(&fb->Disks)) memFree(f);
     while (f=lstPopItem(&fb->FileList)) memFree(f);
     while (f=lstPopItem(&fb->Bookmarks)) memFree(f);
+    strDestroyStringSplitor(&fb->ss_filter_extensions);
     memFree(fb);
     return 0;
 }
@@ -957,9 +958,7 @@ STRUCTURE(laNewPanelData){
 void laui_TitleOnly(laUiList *uil, laPropPack *This, laPropPack *OP_UNUSED, laColumn *Extra, int context){
     laColumn *col = Extra, *c, *cl, *cr, *crl, *crr, *cll, *clr, *clrl, *clrr, *clrrl, *clrrr;
     laUiItem *ui;
-
     c = laFirstColumn(uil);
-
     laShowItemFull(uil, c, This, "title", LA_WIDGET_STRING_PLAIN, 0, 0, 0);
 }
 laUiTemplate* laget_FirstPanelTemplate(void* unused1, void* unused2){
@@ -1607,7 +1606,7 @@ int OPMOD_Panel(laOperator *a, laEvent *e){
     if(MAIN.DockingPanel){return LA_FINISHED; }
 
     if (!p->Show || (!laIsInPanel(p, x, y) && !uid->TargetIndexVali)){
-        return LA_FINISHED;
+        p->ShowCorner=0; return LA_FINISHED_PASS;
     }
 
     int NoPrimaryUI=(p==MAIN.CurrentWindow->MaximizedUiPanel);
@@ -1650,15 +1649,15 @@ int OPMOD_Panel(laOperator *a, laEvent *e){
     }
     if (ui && !a->Child && ui->Type->OperatorType && !la_UiOperatorExists(ui)){
         laSetOperatorLocalizer(p);
-        if (laInvokeUiP(a, ui->Type->OperatorType, e, ui, &Locals, 0) >= 0) laRetriggerOperators();
+        if (laInvokeUiP(a, ui->Type->OperatorType, e, ui, &Locals, 0) >= 0){ laRetriggerOperators(); }
         lstClearPointer(&Locals);
         //return LA_RUNNING;
     }
     lstClearPointer(&Locals);
     
-    if (p->Mode && e->Type&LA_MOUSE_EVENT && !uid->TargetIndexVali){
-        if (!p->IsMenuPanel && e->x + e->y > p->W + p->H - LA_SCROLL_W*2){
-            if(e->Type==LA_L_MOUSE_DOWN){ uid->TargetIndexVali = 2; uid->LastX=e->x;uid->LastY=e->y;}
+    if (p->Mode && e->Type&LA_MOUSE_EVENT && !uid->TargetIndexVali){ p->ShowCorner=0;
+        if (!p->IsMenuPanel && e->x + e->y > p->W + p->H - LA_SCROLL_W*2){ if(!a->Item.pPrev) p->ShowCorner=1;
+            if(e->Type==LA_L_MOUSE_DOWN){ uid->TargetIndexVali = 2; uid->LastX=e->x;uid->LastY=e->y; }
             return LA_RUNNING;
         }else{
             if(e->Type==LA_L_MOUSE_DOWN){  uid->TargetIndexVali = 1; uid->LastX=e->x;uid->LastY=e->y; return LA_RUNNING; }
@@ -1851,12 +1850,13 @@ int OPMOD_ModalPanel(laOperator *a, laEvent *e){
     }
     lstClearPointer(&Locals);
 
+    int insize=0; if (e->x + e->y > p->W + p->H - LA_SCROLL_W*2){ insize=1; if(!a->Item.pPrev) p->ShowCorner=1; }else{p->ShowCorner=0;}
+    if(!a->Item.pPrev) p->ShowCorner=1;
     if (e->Type == LA_L_MOUSE_DOWN){
         uid->LastX = e->x;
         uid->LastY = e->y;
-        if (e->x + e->y > p->W + p->H -  LA_SCROLL_W*2) uid->TargetIndexVali = 2;
-        else
-            uid->TargetIndexVali = 1;
+        if(insize) uid->TargetIndexVali = 2;
+        else uid->TargetIndexVali = 1;
         return LA_RUNNING;
     }
     if (e->Type == LA_MOUSEMOVE){

+ 355 - 355
resources/la_properties.c

@@ -299,7 +299,7 @@ void laget_PanelTitle(laPanel *p, char *result){
 }
 void laset_PanelTitle(laPanel *p, char *content){
     strSafeSet(&p->Title, content);
-    p->TitleWidth = tnsStringGetWidth(p->Title->Ptr, 0, 0);
+    p->TitleWidth = tnsStringGetWidth(p->Title->Ptr, 0,0);
 }
 void laset_PanelSnapDistance(laPanel *p, int index, int n){
     int a;
@@ -805,26 +805,26 @@ void la_RegisterGeneralProps(){
 
     p = la_SetGeneralRoot(&MAIN.GeneralIntSub, "__general_int__", "Genral Int Operations", "Genral Int Operations");
     laAddOperatorProperty(p, "restore", "Restore Default", "Restore the property to the original value", "LA_int_restore_default", L'⭯', 0);
-    laAddOperatorProperty(p, "set_max", "Set Max", "Set The Property To The Max Value", "LA_int_set_max", 0, 0);
-    laAddOperatorProperty(p, "set_min", "Set Min", "Set The Property To The Min Value", "LA_int_set_min", 0, 0);
+    laAddOperatorProperty(p, "set_max", "Set Max", "Set The Property To The Max Value", "LA_int_set_max", 0,0);
+    laAddOperatorProperty(p, "set_min", "Set Min", "Set The Property To The Min Value", "LA_int_set_min", 0,0);
     laAddOperatorProperty(p, "hyper_data", "View Hyper Data", "Show Properties Of Specific Data Block", "LA_view_hyper_data", L'🛈', 0);
 
     p = la_SetGeneralRoot(&MAIN.GeneralIntArraySub, "__general_int_arr__", "Genral Int Array Operations", "Genral Int Array Operations");
     laAddOperatorProperty(p, "restore", "Restore Default", "Restore the property to the original value", "LA_int_array_restore_default", L'⭯', 0);
-    laAddOperatorProperty(p, "set_max", "Set Max", "Set The Property To The Max Value", "LA_int_array_set_max", 0, 0);
-    laAddOperatorProperty(p, "set_min", "Set Min", "Set The Property To The Min Value", "LA_int_array_set_min", 0, 0);
+    laAddOperatorProperty(p, "set_max", "Set Max", "Set The Property To The Max Value", "LA_int_array_set_max", 0,0);
+    laAddOperatorProperty(p, "set_min", "Set Min", "Set The Property To The Min Value", "LA_int_array_set_min", 0,0);
     laAddOperatorProperty(p, "hyper_data", "View Hyper Data", "Show Properties Of Specific Data Block", "LA_view_hyper_data", L'🛈', 0);
 
     p = la_SetGeneralRoot(&MAIN.GeneralFloatSub, "__general_real__", "Genral Float Operations", "Genral Float Operations");
     laAddOperatorProperty(p, "restore", "Restore Default", "Restore the property to the original value", "LA_real_restore_default", L'⭯', 0);
-    laAddOperatorProperty(p, "set_max", "Set Max", "Set The Property To The Max Value", "LA_real_set_max", 0, 0);
-    laAddOperatorProperty(p, "set_min", "Set Min", "Set The Property To The Min Value", "LA_real_set_min", 0, 0);
+    laAddOperatorProperty(p, "set_max", "Set Max", "Set The Property To The Max Value", "LA_real_set_max", 0,0);
+    laAddOperatorProperty(p, "set_min", "Set Min", "Set The Property To The Min Value", "LA_real_set_min", 0,0);
     laAddOperatorProperty(p, "hyper_data", "View Hyper Data", "Show Properties Of Specific Data Block", "LA_view_hyper_data", L'🛈', 0);
 
     p = la_SetGeneralRoot(&MAIN.GeneralFloatArraySub, "__general_real_arr__", "Genral Float Array Operations", "Genral Float Array Operations");
     laAddOperatorProperty(p, "restore", "Restore Default", "Restore the property to the original value", "LA_real_array_restore_default", L'⭯', 0);
-    laAddOperatorProperty(p, "set_max", "Set Max", "Set The Property To The Max Value", "LA_real_array_set_max", 0, 0);
-    laAddOperatorProperty(p, "set_min", "Set Min", "Set The Property To The Min Value", "LA_real_array_set_min", 0, 0);
+    laAddOperatorProperty(p, "set_max", "Set Max", "Set The Property To The Max Value", "LA_real_array_set_max", 0,0);
+    laAddOperatorProperty(p, "set_min", "Set Min", "Set The Property To The Min Value", "LA_real_array_set_min", 0,0);
     laAddOperatorProperty(p, "hyper_data", "View Hyper Data", "Show Properties Of Specific Data Block", "LA_view_hyper_data", L'🛈', 0);
 
     p = la_SetGeneralRoot(&MAIN.GeneralEnumSub, "__general_enum__", "Genral Enum Operations", "Genral Enum Operations");
@@ -835,8 +835,8 @@ void la_RegisterGeneralProps(){
     p = la_SetGeneralRoot(&MAIN.GeneralStringSub, "__general_string__", "Genral String Operations", "Genral String Operations");
     laAddOperatorProperty(p, "get_folder_path", "Get Folder Path", "Get a folder path", "LA_string_get_folder_path", L'📁', 0);
     laAddOperatorProperty(p, "get_file_path", "Get File Path", "Get a file path", "LA_string_get_file_path", L'🖹', 0);
-    laAddOperatorProperty(p, "copy", "Copy", "Copy to clipboard", "LA_string_copy", 0, 0);
-    laAddOperatorProperty(p, "paste", "Paste", "Paste from clipboard", "LA_system_paste", 0, 0);
+    laAddOperatorProperty(p, "copy", "Copy", "Copy to clipboard", "LA_string_copy", 0,0);
+    laAddOperatorProperty(p, "paste", "Paste", "Paste from clipboard", "LA_system_paste", 0,0);
     laAddOperatorProperty(p, "restore", "Restore Default", "Restore Default Value", "LA_string_set_default", L'⭯', 0);
     p->UiDefine=laui_StringPropUiDefine;
 
@@ -844,7 +844,7 @@ void la_RegisterGeneralProps(){
 
     p = la_SetGeneralRoot(&MAIN.GeneralCollectionSub, "__general_collection__", "Genral Collection Operations", "Genral Collection Operations");
     laAddOperatorProperty(p, "put_data_block", "Put", "Append Pending Data Block Here", "LA_sub_put_data_block", L'🔗', 0);
-    laAddOperatorProperty(p, "save_instance", "Save Instance", "Save instance as a udf block", "LA_udf_save_instance", 0, 0);
+    laAddOperatorProperty(p, "save_instance", "Save Instance", "Save instance as a udf block", "LA_udf_save_instance", 0,0);
 }
 
 void la_RegisterInternalProps(){
@@ -864,80 +864,80 @@ void la_RegisterInternalProps(){
         {
             p = laDefineRoot();
 
-            laAddPropertyContainer("any_pointer", "Any Pointer", "A pointer that is not exposed to access", 0, 0, sizeof(void*), 0, 0, LA_PROP_OTHER_ALLOC);
-
-            laAddSubGroup(p, "windows", "Windows", "All Registered Windows Of This Application", "ui_window",0, 0, 0, -1, laget_FirstWindow, laget_ActiveWindow, laget_ListNext, 0, 0, 0, 0, 0);
-            laAddSubGroup(p, "tns","TNS", "TNS Kernel Main Structure", "tns_main",0, 0, 0, -1, tnsget_TnsMain, 0, 0, 0, 0, 0, 0, LA_UDF_SINGLE | LA_UDF_LOCAL);
-            laAddSubGroup(p, "la","LA", "LA Main Structure", "la_main",0, 0, laui_SubPropInfoDefault, -1, laget_Main, 0, 0, 0, 0, 0, 0, LA_UDF_SINGLE | LA_UDF_LOCAL);
-
-            p = laAddPropertyContainer("boxed_theme", "Boxed Theme", "A Single Theme Item For One Or Multiple Kinds Of UiItems", 0, laui_BoxedThemeItem, sizeof(laBoxedTheme), 0, 0, 1);{
-                laAddStringProperty(p, "name", "Name", "Boxed Theme Name", 0, 0, 0, 0, 1, offsetof(laBoxedTheme, Name), 0, 0, 0, 0, LA_AS_IDENTIFIER);
-                laAddFloatProperty(p, "margins", "Margins", "Margins On Four Sides", 0, "Left,Right,Top,Bottom", 0, 1, -1, 0.05, 1, 0, offsetof(laBoxedTheme, Margins), 0, 0, 4, 0, laset_ThemeMargins, 0, 0, 0, 0, 0, 0);
-                laAddFloatProperty(p, "paddings", "Paddings", "Paddings On Four Sides", 0, "Left,Right,Top,Bottom", 0, 1, -1, 0.05, 1, 0, offsetof(laBoxedTheme, Paddings), 0, 0, 4, 0, laset_ThemePaddings, 0, 0, 0, 0, 0, 0);
-                laAddFloatProperty(p, "normal", "Normal", "Background brightness", 0, 0, 0, 1, 0, 0.025, 1, 0, offsetof(laBoxedTheme, NormalY), 0, laset_ThemeNormal, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-                laAddFloatProperty(p, "active", "Active", "Background brightness in active state", 0, 0, 0, 1, 0, 0.025, 1, 0, offsetof(laBoxedTheme, ActiveY), 0, laset_ThemeActive, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-                laAddFloatProperty(p, "border", "Border", "Border brightness", 0, 0, 0, 1, 0, 0.025, 1, 0, offsetof(laBoxedTheme, BorderY), 0, laset_ThemeBorder, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-                laAddFloatProperty(p, "text", "Text", "Text brightness", 0, 0, 0, 1, 0, 0.025, 1, 0, offsetof(laBoxedTheme, TextY), 0, laset_ThemeText, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-                laAddFloatProperty(p, "text_active", "Text Active", "Text brightness in active state", 0, 0, 0, 1, 0, 0.025, 1, 0, offsetof(laBoxedTheme, TextActiveY), 0, laset_ThemeTextActive, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-                laAddFloatProperty(p, "alpha", "Alpha", "Background alpha", 0, 0, 0, 1, 0, 0.025, 1, 0, offsetof(laBoxedTheme, Alpha), 0, laset_ThemeAlpha, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-                laAddSubGroup(p, "back_ref", "Back Ref", "Boxed theme internal back-ref", "any_pointer",0, 0, 0, offsetof(laBoxedTheme, BackRef), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
-                laAddSubGroup(p, "parent", "Parent", "Parent Theme", "theme",0, 0, 0, offsetof(laBoxedTheme, Parent), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
+            laAddPropertyContainer("any_pointer", "Any Pointer", "A pointer that is not exposed to access", 0,0,sizeof(void*), 0,0,LA_PROP_OTHER_ALLOC);
+
+            laAddSubGroup(p, "windows", "Windows", "All Registered Windows Of This Application", "ui_window",0,0,0,-1, laget_FirstWindow, laget_ActiveWindow, laget_ListNext, 0,0,0,0,0);
+            laAddSubGroup(p, "tns","TNS", "TNS Kernel Main Structure", "tns_main",0,0,0,-1, tnsget_TnsMain, 0,0,0,0,0,0,LA_UDF_SINGLE | LA_UDF_LOCAL);
+            laAddSubGroup(p, "la","LA", "LA Main Structure", "la_main",0,0,laui_SubPropInfoDefault, -1, laget_Main, 0,0,0,0,0,0,LA_UDF_SINGLE | LA_UDF_LOCAL);
+
+            p = laAddPropertyContainer("boxed_theme", "Boxed Theme", "A Single Theme Item For One Or Multiple Kinds Of UiItems", 0,laui_BoxedThemeItem, sizeof(laBoxedTheme), 0,0,1);{
+                laAddStringProperty(p, "name", "Name", "Boxed Theme Name", 0,0,0,0,1, offsetof(laBoxedTheme, Name), 0,0,0,0,LA_AS_IDENTIFIER);
+                laAddFloatProperty(p, "margins", "Margins", "Margins On Four Sides", 0,"Left,Right,Top,Bottom", 0,1, -1, 0.05, 1, 0,offsetof(laBoxedTheme, Margins), 0,0,4, 0,laset_ThemeMargins, 0,0,0,0,0,0);
+                laAddFloatProperty(p, "paddings", "Paddings", "Paddings On Four Sides", 0,"Left,Right,Top,Bottom", 0,1, -1, 0.05, 1, 0,offsetof(laBoxedTheme, Paddings), 0,0,4, 0,laset_ThemePaddings, 0,0,0,0,0,0);
+                laAddFloatProperty(p, "normal", "Normal", "Background brightness", 0,0,0,1, 0,0.025, 1, 0,offsetof(laBoxedTheme, NormalY), 0,laset_ThemeNormal, 0,0,0,0,0,0,0,0,0);
+                laAddFloatProperty(p, "active", "Active", "Background brightness in active state", 0,0,0,1, 0,0.025, 1, 0,offsetof(laBoxedTheme, ActiveY), 0,laset_ThemeActive, 0,0,0,0,0,0,0,0,0);
+                laAddFloatProperty(p, "border", "Border", "Border brightness", 0,0,0,1, 0,0.025, 1, 0,offsetof(laBoxedTheme, BorderY), 0,laset_ThemeBorder, 0,0,0,0,0,0,0,0,0);
+                laAddFloatProperty(p, "text", "Text", "Text brightness", 0,0,0,1, 0,0.025, 1, 0,offsetof(laBoxedTheme, TextY), 0,laset_ThemeText, 0,0,0,0,0,0,0,0,0);
+                laAddFloatProperty(p, "text_active", "Text Active", "Text brightness in active state", 0,0,0,1, 0,0.025, 1, 0,offsetof(laBoxedTheme, TextActiveY), 0,laset_ThemeTextActive, 0,0,0,0,0,0,0,0,0);
+                laAddFloatProperty(p, "alpha", "Alpha", "Background alpha", 0,0,0,1, 0,0.025, 1, 0,offsetof(laBoxedTheme, Alpha), 0,laset_ThemeAlpha, 0,0,0,0,0,0,0,0,0);
+                laAddSubGroup(p, "back_ref", "Back Ref", "Boxed theme internal back-ref", "any_pointer",0,0,0,offsetof(laBoxedTheme, BackRef), 0,0,0,0,0,0,0,LA_UDF_REFER);
+                laAddSubGroup(p, "parent", "Parent", "Parent Theme", "theme",0,0,0,offsetof(laBoxedTheme, Parent), 0,0,0,0,0,0,0,LA_UDF_REFER);
             }
 
-            p = laAddPropertyContainer("theme", "Theme Package", "A Package With ALl Types Of Theme For Ui Items", 0, laui_Theme, sizeof(laTheme), 0, 0, 2);{
-                laAddStringProperty(p, "name", "Name", "Theme Name", 0, 0, 0, 0, 1, offsetof(laTheme, Name), 0, 0, 0, 0, LA_AS_IDENTIFIER);
-                laAddStringProperty(p, "author", "Author", "The Author's Name", 0, 0, 0, 0, 1, offsetof(laTheme, Author), 0, 0, 0, 0, 0);
-                laAddSubGroup(p, "boxed_themes", "Boxed Themes", "The Boxed Theme For Single UiItem Or Panel", "boxed_theme",0, 0, 0, -1, 0, 0, 0, 0, 0, 0, offsetof(laTheme, BoxedThemes), 0);
-                laAddFloatProperty(p, "color", "Color", "Base color of the theme", LA_WIDGET_FLOAT_COLOR, "R,G,B,A", 0, 1, 0, 0.025, 1, 0, offsetof(laTheme, Color), 0, 0, 4, 0, 0, 0, 0, laset_ThemeColor, 0, 0, 0);
-                laAddFloatProperty(p, "accent_color", "Accent Color", "Theme accent color for hightlight etc", LA_WIDGET_FLOAT_COLOR, "R,G,B,A", 0, 1, 0, 0.025, 1, 0, offsetof(laTheme, AccentColor), 0, 0, 4, 0, 0, 0, 0, laset_ThemeAccentColor, 0, 0, 0);
-                laAddFloatProperty(p, "inactive_saturation", "Inactive Saturation", "Reduced saturation on inactive widgets", 0, 0, 0, 1, 0, 0.025, 1, 0, offsetof(laTheme, InactiveSaturation), 0, 0, 1, 0, 0, 0, 0, laset_ThemeInactiveSaturation, 0, 0, 0);
-                laAddFloatProperty(p, "inactive_mix", "Inactive Mix", "Reduced alpha on inactive widgets", 0, 0, 0, 1, 0, 0.025, 1, 0, offsetof(laTheme, InactiveMix), 0, 0, 1, 0, 0, 0, 0, laset_ThemeInactiveMix, 0, 0, 0);
-                laAddFloatProperty(p, "cursor_alpha", "Cursor Alpha", "Transparency of the cursor", 0, 0, 0, 1, 0, 0.025, 1, 0, offsetof(laTheme, CursorAlpha), 0, 0, 1, 0, 0, 0, 0, laset_ThemeCursorAlpha, 0, 0, 0);
-                laAddFloatProperty(p, "selection_alpha", "Selection Alpha", "Transparency of selection backgrounds", 0, 0, 0, 1, 0, 0.025, 1, 0, offsetof(laTheme, SelectionAlpha), 0, 0, 1, 0, 0, 0, 0, laset_ThemeSelectionAlpha, 0, 0, 0);
-                laAddFloatProperty(p, "wire_transparency", "Wire Transparency", "Alpha of the wire color", 0, 0, 0, 1, 0, 0.05, 0.7, 0, offsetof(laTheme, WireTransparency), 0, laset_ThemeWireTransparency, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-                laAddFloatProperty(p, "wire_saturation", "Wire Saturation", "Saturation of the wires", 0, 0, 0, 1, 0, 0.05, 0.8, 0, offsetof(laTheme, WireSaturation), 0, laset_ThemeWireSaturation, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-                laAddFloatProperty(p, "wire_brightness", "Wire Brightness", "Brightness of the wires", 0, 0, 0, 1, 0, 0.05, 0.8, 0, offsetof(laTheme, WireBrightness), 0, laset_ThemeWireBrightness, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-                laAddFloatProperty(p, "edge_transparency", "Edge Transparency", "Transparency of the edge color", 0, 0, 0, 1, 0, 0.05, 0.7, 0, offsetof(laTheme, EdgeTransparency), 0, laset_ThemeEdgeTransparency, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-                laAddFloatProperty(p, "edge_brightness", "Edge Brightness", "Brightness of the edge color", 0, 0, 0, 1, 0, 0.05, 0.7, 0, offsetof(laTheme, EdgeBrightness), 0, laset_ThemeEdgeBrightness, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-                laAddFloatProperty(p, "vertex_transparency", "Edge Transparency", "Transparency of the vertex color", 0, 0, 0, 1, 0, 0.05, 0.7, 0, offsetof(laTheme, VertexTransparency), 0, laset_ThemeVertexTransparency, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-                laAddFloatProperty(p, "vertex_brightness", "Edge Brightness", "Brightness of the vertex color", 0, 0, 0, 1, 0, 0.05, 0.7, 0, offsetof(laTheme, VertexBrightness), 0, laset_ThemeVertexBrightness, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-                laAddFloatProperty(p, "svertex_transparency", "Selected Vertex Transparency", "Transparency of selected vertices", 0, 0, 0, 1, 0, 0.05, 0.7, 0, offsetof(laTheme, SelectedVertexTransparency), 0, laset_ThemeSVertexTransparency, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-                laAddFloatProperty(p, "sedge_transparency", "Selected Edge Transparency", "Transparency of selected edges", 0, 0, 0, 1, 0, 0.05, 0.7, 0, offsetof(laTheme, SelectedEdgeTransparency), 0, laset_ThemeSEdgeTransparency, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-                laAddFloatProperty(p, "sface_transparency", "Selected Face Transparency", "Transparency of selected faces", 0, 0, 0, 1, 0, 0.05, 0.7, 0, offsetof(laTheme, SelectedFaceTransparency), 0, laset_ThemeSFaceTransparency, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-
-                laAddOperatorProperty(p, "delete", "Delete", "Delete this theme", "LA_delete_theme", 0, 0);
+            p = laAddPropertyContainer("theme", "Theme Package", "A Package With ALl Types Of Theme For Ui Items", 0,laui_Theme, sizeof(laTheme), 0,0,2);{
+                laAddStringProperty(p, "name", "Name", "Theme Name", 0,0,0,0,1, offsetof(laTheme, Name), 0,0,0,0,LA_AS_IDENTIFIER);
+                laAddStringProperty(p, "author", "Author", "The Author's Name", 0,0,0,0,1, offsetof(laTheme, Author), 0,0,0,0,0);
+                laAddSubGroup(p, "boxed_themes", "Boxed Themes", "The Boxed Theme For Single UiItem Or Panel", "boxed_theme",0,0,0,-1, 0,0,0,0,0,0,offsetof(laTheme, BoxedThemes), 0);
+                laAddFloatProperty(p, "color", "Color", "Base color of the theme", LA_WIDGET_FLOAT_COLOR, "R,G,B,A", 0,1, 0,0.025, 1, 0,offsetof(laTheme, Color), 0,0,4, 0,0,0,0,laset_ThemeColor, 0,0,0);
+                laAddFloatProperty(p, "accent_color", "Accent Color", "Theme accent color for hightlight etc", LA_WIDGET_FLOAT_COLOR, "R,G,B,A", 0,1, 0,0.025, 1, 0,offsetof(laTheme, AccentColor), 0,0,4, 0,0,0,0,laset_ThemeAccentColor, 0,0,0);
+                laAddFloatProperty(p, "inactive_saturation", "Inactive Saturation", "Reduced saturation on inactive widgets", 0,0,0,1, 0,0.025, 1, 0,offsetof(laTheme, InactiveSaturation), 0,0,1, 0,0,0,0,laset_ThemeInactiveSaturation, 0,0,0);
+                laAddFloatProperty(p, "inactive_mix", "Inactive Mix", "Reduced alpha on inactive widgets", 0,0,0,1, 0,0.025, 1, 0,offsetof(laTheme, InactiveMix), 0,0,1, 0,0,0,0,laset_ThemeInactiveMix, 0,0,0);
+                laAddFloatProperty(p, "cursor_alpha", "Cursor Alpha", "Transparency of the cursor", 0,0,0,1, 0,0.025, 1, 0,offsetof(laTheme, CursorAlpha), 0,0,1, 0,0,0,0,laset_ThemeCursorAlpha, 0,0,0);
+                laAddFloatProperty(p, "selection_alpha", "Selection Alpha", "Transparency of selection backgrounds", 0,0,0,1, 0,0.025, 1, 0,offsetof(laTheme, SelectionAlpha), 0,0,1, 0,0,0,0,laset_ThemeSelectionAlpha, 0,0,0);
+                laAddFloatProperty(p, "wire_transparency", "Wire Transparency", "Alpha of the wire color", 0,0,0,1, 0,0.05, 0.7, 0,offsetof(laTheme, WireTransparency), 0,laset_ThemeWireTransparency, 0,0,0,0,0,0,0,0,0);
+                laAddFloatProperty(p, "wire_saturation", "Wire Saturation", "Saturation of the wires", 0,0,0,1, 0,0.05, 0.8, 0,offsetof(laTheme, WireSaturation), 0,laset_ThemeWireSaturation, 0,0,0,0,0,0,0,0,0);
+                laAddFloatProperty(p, "wire_brightness", "Wire Brightness", "Brightness of the wires", 0,0,0,1, 0,0.05, 0.8, 0,offsetof(laTheme, WireBrightness), 0,laset_ThemeWireBrightness, 0,0,0,0,0,0,0,0,0);
+                laAddFloatProperty(p, "edge_transparency", "Edge Transparency", "Transparency of the edge color", 0,0,0,1, 0,0.05, 0.7, 0,offsetof(laTheme, EdgeTransparency), 0,laset_ThemeEdgeTransparency, 0,0,0,0,0,0,0,0,0);
+                laAddFloatProperty(p, "edge_brightness", "Edge Brightness", "Brightness of the edge color", 0,0,0,1, 0,0.05, 0.7, 0,offsetof(laTheme, EdgeBrightness), 0,laset_ThemeEdgeBrightness, 0,0,0,0,0,0,0,0,0);
+                laAddFloatProperty(p, "vertex_transparency", "Edge Transparency", "Transparency of the vertex color", 0,0,0,1, 0,0.05, 0.7, 0,offsetof(laTheme, VertexTransparency), 0,laset_ThemeVertexTransparency, 0,0,0,0,0,0,0,0,0);
+                laAddFloatProperty(p, "vertex_brightness", "Edge Brightness", "Brightness of the vertex color", 0,0,0,1, 0,0.05, 0.7, 0,offsetof(laTheme, VertexBrightness), 0,laset_ThemeVertexBrightness, 0,0,0,0,0,0,0,0,0);
+                laAddFloatProperty(p, "svertex_transparency", "Selected Vertex Transparency", "Transparency of selected vertices", 0,0,0,1, 0,0.05, 0.7, 0,offsetof(laTheme, SelectedVertexTransparency), 0,laset_ThemeSVertexTransparency, 0,0,0,0,0,0,0,0,0);
+                laAddFloatProperty(p, "sedge_transparency", "Selected Edge Transparency", "Transparency of selected edges", 0,0,0,1, 0,0.05, 0.7, 0,offsetof(laTheme, SelectedEdgeTransparency), 0,laset_ThemeSEdgeTransparency, 0,0,0,0,0,0,0,0,0);
+                laAddFloatProperty(p, "sface_transparency", "Selected Face Transparency", "Transparency of selected faces", 0,0,0,1, 0,0.05, 0.7, 0,offsetof(laTheme, SelectedFaceTransparency), 0,laset_ThemeSFaceTransparency, 0,0,0,0,0,0,0,0,0);
+
+                laAddOperatorProperty(p, "delete", "Delete", "Delete this theme", "LA_delete_theme", 0,0);
             }
         }
 
         // TIME INFO =========================================================================================
 
-        p = laAddPropertyContainer("time_info", "Time Info", "Time Information Y/M/D/H/M/S", L'🕒', 0, sizeof(laTimeInfo), 0, 0, LA_PROP_OTHER_ALLOC);{
-            laAddIntProperty(p, "year", "Year", "Year Value", 0, 0, 0, 0, 0, 0, 0, 0, 0, laget_TimeYear, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddIntProperty(p, "month", "Month", "Month Value", 0, 0, 0, 0, 0, 0, 0, 0, 0, laget_TimeMonth, 0, 0, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
-            laAddIntProperty(p, "day", "Day", "Day Value", 0, 0, 0, 0, 0, 0, 0, 0, 0, laget_TimeDay, 0, 0, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
-            laAddIntProperty(p, "hour", "Hour", "Hour Value", 0, 0, 0, 0, 0, 0, 0, 0, 0, laget_TimeHour, 0, 0, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
-            laAddIntProperty(p, "minute", "Minute", "Minute Value", 0, 0, 0, 0, 0, 0, 0, 0, 0, laget_TimeMinute, 0, 0, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
-            laAddIntProperty(p, "second", "Second", "Second Value", 0, 0, 0, 0, 0, 0, 0, 0, 0, laget_TimeSecond, 0, 0, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
-            laAddStringProperty(p, "time_string", "Time String", "Full String In \"Y-M-D H:M:S\" Format", 0, 0, 0, 0, 0, 0, 0, laget_TimeString, 0, 0,LA_READ_ONLY);
+        p = laAddPropertyContainer("time_info", "Time Info", "Time Information Y/M/D/H/M/S", L'🕒', 0,sizeof(laTimeInfo), 0,0,LA_PROP_OTHER_ALLOC);{
+            laAddIntProperty(p, "year", "Year", "Year Value", 0,0,0,0,0,0,0,0,0,laget_TimeYear, 0,0,0,0,0,0,0,0,0,0);
+            laAddIntProperty(p, "month", "Month", "Month Value", 0,0,0,0,0,0,0,0,0,laget_TimeMonth, 0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
+            laAddIntProperty(p, "day", "Day", "Day Value", 0,0,0,0,0,0,0,0,0,laget_TimeDay, 0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
+            laAddIntProperty(p, "hour", "Hour", "Hour Value", 0,0,0,0,0,0,0,0,0,laget_TimeHour, 0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
+            laAddIntProperty(p, "minute", "Minute", "Minute Value", 0,0,0,0,0,0,0,0,0,laget_TimeMinute, 0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
+            laAddIntProperty(p, "second", "Second", "Second Value", 0,0,0,0,0,0,0,0,0,laget_TimeSecond, 0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
+            laAddStringProperty(p, "time_string", "Time String", "Full String In \"Y-M-D H:M:S\" Format", 0,0,0,0,0,0,0,laget_TimeString, 0,0,LA_READ_ONLY);
         }
 
         // LA MAIN =========================================================================================
 
-        p = laAddPropertyContainer("la_main", "LA Root", "LA Root Structure", L'🖴', 0, sizeof(LA), 0, 0, 2|LA_PROP_OTHER_ALLOC);{
-            laAddSubGroup(p, "logs", "Logs", "Application logs", "la_log",0, 0, laui_LogItem, -1, 0, 0, 0, 0, 0, 0, offsetof(LA, Logs), LA_UDF_IGNORE|LA_READ_ONLY);
-            laAddSubGroup(p, "differences", "Differences", "Difference stack (for undo/redo)", "la_difference",0, 0, 0, offsetof(LA, HeadDifference), 0, 0, 0, 0, 0, 0, offsetof(LA, Differences), LA_UDF_IGNORE|LA_READ_ONLY);
+        p = laAddPropertyContainer("la_main", "LA Root", "LA Root Structure", L'🖴', 0,sizeof(LA), 0,0,2|LA_PROP_OTHER_ALLOC);{
+            laAddSubGroup(p, "logs", "Logs", "Application logs", "la_log",0,0,laui_LogItem, -1, 0,0,0,0,0,0,offsetof(LA, Logs), LA_UDF_IGNORE|LA_READ_ONLY);
+            laAddSubGroup(p, "differences", "Differences", "Difference stack (for undo/redo)", "la_difference",0,0,0,offsetof(LA, HeadDifference), 0,0,0,0,0,0,offsetof(LA, Differences), LA_UDF_IGNORE|LA_READ_ONLY);
             
-            _LA_PROP_WINDOW=laAddSubGroup(p, "windows", "Windows", "All Windows Under LA Control", "ui_window",0, 0, 0, offsetof(LA, CurrentWindow), laget_FirstWindow, 0, laget_ListNext, 0, 0, 0, offsetof(LA, Windows), 0);
+            _LA_PROP_WINDOW=laAddSubGroup(p, "windows", "Windows", "All Windows Under LA Control", "ui_window",0,0,0,offsetof(LA, CurrentWindow), laget_FirstWindow, 0,laget_ListNext, 0,0,0,offsetof(LA, Windows), 0);
             la_UDFAppendSharedTypePointer("_LA_PROP_WINDOW", _LA_PROP_WINDOW);
-            laAddSubGroup(p, "data", "Data", "Data Root Control", "property_container",0, 0, 0, offsetof(LA, DataRoot.Root), 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddSubGroup(p, "prop_containers", "Sub Type", "Sub Type Property Container", "property_container",0, 0, 0, -1, laget_FirstContainer, 0, laget_ListNext, 0, 0, 0, 0, 0);
-            laAddSubGroup(p, "managed_props", "Managed Props", "Managed properties for saving", "managed_prop",0, 0, 0, -1, 0, 0, 0, 0, 0, 0, offsetof(LA, ManagedSaveProps), LA_UDF_IGNORE|LA_READ_ONLY);
-            laAddSubGroup(p, "managed_udfs", "Managed UDFs", "Managed UDFs for saving", "managed_udf", 0, 0, laui_ManagedUDFOps, -1, 0, 0, 0, 0, 0, 0, offsetof(LA, ManagedUDFs), LA_UDF_IGNORE|LA_READ_ONLY);
-            laAddSubGroup(p, "user_preferences", "User Preference", "Kernel Settings For LA Main Structure", "la_user_preference",0, 0, 0, -1, laget_Main, 0, 0, 0, 0, 0, 0, LA_UDF_LOCAL);
-            sp=laAddSubGroup(p, "panel_templates", "Panel Templates", "Panel templates used to create new panel", "panel_template",0, 0, 0, -1, 0, 0, 0, 0, 0, 0, offsetof(LA, PanelTemplates), 0);
+            laAddSubGroup(p, "data", "Data", "Data Root Control", "property_container",0,0,0,offsetof(LA, DataRoot.Root), 0,0,0,0,0,0,0,0);
+            laAddSubGroup(p, "prop_containers", "Sub Type", "Sub Type Property Container", "property_container",0,0,0,-1, laget_FirstContainer, 0,laget_ListNext, 0,0,0,0,0);
+            laAddSubGroup(p, "managed_props", "Managed Props", "Managed properties for saving", "managed_prop",0,0,0,-1, 0,0,0,0,0,0,offsetof(LA, ManagedSaveProps), LA_UDF_IGNORE|LA_READ_ONLY);
+            laAddSubGroup(p, "managed_udfs", "Managed UDFs", "Managed UDFs for saving", "managed_udf", 0,0,laui_ManagedUDFOps, -1, 0,0,0,0,0,0,offsetof(LA, ManagedUDFs), LA_UDF_IGNORE|LA_READ_ONLY);
+            laAddSubGroup(p, "user_preferences", "User Preference", "Kernel Settings For LA Main Structure", "la_user_preference",0,0,0,-1, laget_Main, 0,0,0,0,0,0,LA_UDF_LOCAL);
+            sp=laAddSubGroup(p, "panel_templates", "Panel Templates", "Panel templates used to create new panel", "panel_template",0,0,0,-1, 0,0,0,0,0,0,offsetof(LA, PanelTemplates), 0);
             laSubGroupExtraFunctions(sp,0,0,0,laget_PanelTemplateCategory);
 
-            laAddSubGroup(p, "themes", "Themes", "Themes Loded In The Program", "theme",0, 0, laui_Theme, -1, 0, laget_ActiveTheme, 0, laset_ActiveTheme, 0, 0, offsetof(LA,Themes), 0);
+            laAddSubGroup(p, "themes", "Themes", "Themes Loded In The Program", "theme",0,0,laui_Theme, -1, 0,laget_ActiveTheme, 0,laset_ActiveTheme, 0,0,offsetof(LA,Themes), 0);
 
             sp=laAddSubGroup(p, "controllers", "Controllers", "Detected game controllers","la_controller",laget_ControllerType,0,0,-1,0,0,0,0,0,0,offsetof(LA,Controllers),0);
             laSubGroupDetachable(sp, laget_DetachedControllerFirst, laget_ListNext);
@@ -949,120 +949,120 @@ void la_RegisterInternalProps(){
             laAddSubGroup(p, "input_mapping", "Input Mapping", "Input mapping page collection","la_input_mapping_collection",0,0,0,offsetof(LA,InputMapping),0,0,0,0,0,0,0,LA_UDF_SINGLE);
             laAddSubGroup(p, "drivers", "Drivers", "Driver page collection","la_driver_collection",0,0,0,offsetof(LA,Drivers),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 
-            laAddStringProperty(p, "identifier", "Identifier", "Identifier", 0, 0, 0, 0, 0, 0, 0, laget_MainIdentifier, 0, 0, LA_AS_IDENTIFIER|LA_READ_ONLY);
-            laAddSubGroup(p, "test_ucn", "TEST UCN", "---", "udf_content_node",0, 0, 0, offsetof(LA, TEST_Link), 0, 0, 0, 0, 0, 0, 0, 0);
+            laAddStringProperty(p, "identifier", "Identifier", "Identifier", 0,0,0,0,0,0,0,laget_MainIdentifier, 0,0,LA_AS_IDENTIFIER|LA_READ_ONLY);
+            laAddSubGroup(p, "test_ucn", "TEST UCN", "---", "udf_content_node",0,0,0,offsetof(LA, TEST_Link), 0,0,0,0,0,0,0,0);
             
-            laAddIntProperty(p, "example_int", "Example Integer", "Example integer", 0, 0, 0, 100, 0, 1, 50, 0, offsetof(LA, example_int), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddStringProperty(p, "example_string", "Example String", "Example string", 0, 0, 0, 0, 1, offsetof(LA,example_string), 0, 0, 0, 0, 0);
+            laAddIntProperty(p, "example_int", "Example Integer", "Example integer", 0,0,0,100,0,1, 50,0,offsetof(LA, example_int), 0,0,0,0,0,0,0,0,0,0,0);
+            laAddStringProperty(p, "example_string", "Example String", "Example string", 0,0,0,0,1, offsetof(LA,example_string), 0,0,0,0,0);
             laAddStringProperty(p, "unknown_prop", "Unknown Property", "Placeholder for unknown property, probably due to a wrong property path, or not setting LA_AS_IDENTIFIER in any of the properties.",
-                LA_WIDGET_STRING_PLAIN, 0, 0, 0, 0, 0, 0, laget_UnknownPropertyString, 0, 0, LA_READ_ONLY);
+                LA_WIDGET_STRING_PLAIN, 0,0,0,0,0,0,laget_UnknownPropertyString, 0,0,LA_READ_ONLY);
         
         }
 
-        p = laAddPropertyContainer("la_node_category", "Node Category", "Node category", 0, laui_IdentifierOnly, sizeof(laNodeCategory), 0, 0, 1);{
-            laAddStringProperty(p, "name", "Name", "Name of the page", 0, 0, 0, 0, 1, offsetof(laNodeCategory, Name), 0, 0, 0, 0, LA_AS_IDENTIFIER);
-            laAddIntProperty(p, "for_racks", "For Rack Types", "For rack types", 0, 0, 0, 0, 0, 0, 0, 0, offsetof(laNodeCategory, For), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, LA_READ_ONLY);
+        p = laAddPropertyContainer("la_node_category", "Node Category", "Node category", 0,laui_IdentifierOnly, sizeof(laNodeCategory), 0,0,1);{
+            laAddStringProperty(p, "name", "Name", "Name of the page", 0,0,0,0,1, offsetof(laNodeCategory, Name), 0,0,0,0,LA_AS_IDENTIFIER|LA_TRANSLATE);
+            laAddIntProperty(p, "for_racks", "For Rack Types", "For rack types", 0,0,0,0,0,0,0,0,offsetof(laNodeCategory, For), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
         }
 
-        p = laAddPropertyContainer("la_input_mapping_collection", "Input Mapping Collection", "Input mapping collection", 0, 0, sizeof(laRackPageCollection), 0, 0, 1);{
+        p = laAddPropertyContainer("la_input_mapping_collection", "Input Mapping Collection", "Input mapping collection", 0,0,sizeof(laRackPageCollection), 0,0,1);{
             laAddSubGroup(p, "pages", "Pages", "Rack pages","la_rack_page",0,0,0,offsetof(laRackPageCollection,CurrentPage),0,0,0,0,0,0,offsetof(laRackPageCollection,Pages),0);
             laAddSubGroup(p, "current_page", "Current Page", "Current page","la_rack_page",0,0,0,offsetof(laRackPageCollection,CurrentPage),0,0,0,0,0,0,0,LA_UDF_REFER);
         }
-        p = laAddPropertyContainer("la_driver_collection", "Driver Collection", "Driver collection", 0, 0, sizeof(laRackPageCollection), 0, 0, 1);{
+        p = laAddPropertyContainer("la_driver_collection", "Driver Collection", "Driver collection", 0,0,sizeof(laRackPageCollection), 0,0,1);{
             laAddSubGroup(p, "pages", "Pages", "Rack pages","la_rack_page",0,0,0,-1,0,laget_CurrentRackPage,0,0,0,0,offsetof(laRackPageCollection,Pages),0);
             sp=laAddSubGroup(p, "current_page", "Current Page", "Current page","la_rack_page",0,0,0,offsetof(laRackPageCollection,CurrentPage),0,0,0,0,0,0,0,LA_UDF_REFER);
             laSubGroupDetachable(sp,laget_FirstDriverPage,laget_ListNext);
         }
 
-        p = laAddPropertyContainer("la_rack_page", "Rack Page", "A page of nodes", 0, laui_IdentifierOnly, sizeof(laRackPage), 0, 0, 2);{
-            laAddStringProperty(p, "name", "Name", "Name of the page", 0, 0, 0, 0, 1, offsetof(laRackPage, Name), 0, 0, 0, 0, LA_AS_IDENTIFIER);
+        p = laAddPropertyContainer("la_rack_page", "Rack Page", "A page of nodes", 0,laui_IdentifierOnly, sizeof(laRackPage), 0,0,2);{
+            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);
             laAddOperatorProperty(p,"add_rack","Add Rack", "Add a rack into the page", "LA_add_rack", '+', 0);
         }
 
-        //p = laAddPropertyContainer("udf_fail_node", "UDF Failed Node", "Single Wild Data Block Reference", laui_UDFFailNodeItem, sizeof(laUDFFailNode), 0, 0, 0, 0, 0); {
-        //	laAddSubGroup(p, "instance", "Instance", "Actual Data Block Instance", "property_trash_item",0, 0, 0 Item.p), 0, 0, 0, 0, 0, 0, 0, 0,
-        //		0, 0,
+        //p = laAddPropertyContainer("udf_fail_node", "UDF Failed Node", "Single Wild Data Block Reference", laui_UDFFailNodeItem, sizeof(laUDFFailNode), 0,0,0,0,0); {
+        //	laAddSubGroup(p, "instance", "Instance", "Actual Data Block Instance", "property_trash_item",0,0,0 Item.p), 0,0,0,0,0,0,0,0,
+        //		0,0,
         //		0);
-        //	laAddSubGroup(p, "target_container", "Target Container", "The Container The Data Block Belongs To", "property_container",0, 0, 0 pc), 0, 0, 0, 0, 0, 0, 0, 0,
-        //		0, 0,
+        //	laAddSubGroup(p, "target_container", "Target Container", "The Container The Data Block Belongs To", "property_container",0,0,0 pc), 0,0,0,0,0,0,0,0,
+        //		0,0,
         //		0);
         //}
         
-        p = laAddPropertyContainer("la_difference", "Difference", "A difference stack item (undo/redo).", 0, laui_IdentifierOnly, sizeof(laDiff), 0, 0, 1);{
-            laAddStringProperty(p, "description", "Description", "Description of this recorded change", LA_WIDGET_STRING_PLAIN, 0, 0, 0, 1, offsetof(laDiff, Description), 0, 0, 0, 0, LA_READ_ONLY|LA_AS_IDENTIFIER);
+        p = laAddPropertyContainer("la_difference", "Difference", "A difference stack item (undo/redo).", 0,laui_IdentifierOnly, sizeof(laDiff), 0,0,1);{
+            laAddStringProperty(p, "description", "Description", "Description of this recorded change", LA_WIDGET_STRING_PLAIN, 0,0,0,1, offsetof(laDiff, Description), 0,0,0,0,LA_READ_ONLY|LA_AS_IDENTIFIER);
         }
 
-        p = laAddPropertyContainer("la_log", "Resource Folder", "A resource folder to search for UDF references.", 0, laui_ResourceFolderItem, sizeof(laLogEntry), 0, 0, 1);{
-            laAddStringProperty(p, "content", "Content", "Content of the log", LA_WIDGET_STRING_PLAIN, 0, 0, 0, 1, offsetof(laLogEntry, Content), 0, 0, 0, 0, LA_READ_ONLY);
+        p = laAddPropertyContainer("la_log", "Resource Folder", "A resource folder to search for UDF references.", 0,laui_ResourceFolderItem, sizeof(laLogEntry), 0,0,1);{
+            laAddStringProperty(p, "content", "Content", "Content of the log", LA_WIDGET_STRING_PLAIN, 0,0,0,1, offsetof(laLogEntry, Content), 0,0,0,0,LA_READ_ONLY);
         }
 
-        p = laAddPropertyContainer("la_resource_folder", "Resource Folder", "A resource folder to search for UDF references.", 0, laui_ResourceFolderItem, sizeof(laResourceFolder), 0, 0, 1);{
-            laAddStringProperty(p, "path", "Path", "Path", 0, 0, 0, 0, 1, offsetof(laResourceFolder, Path), 0, 0, laset_ResourcePath, 0, 0);
+        p = laAddPropertyContainer("la_resource_folder", "Resource Folder", "A resource folder to search for UDF references.", 0,laui_ResourceFolderItem, sizeof(laResourceFolder), 0,0,1);{
+            laAddStringProperty(p, "path", "Path", "Path", 0,0,0,0,1, offsetof(laResourceFolder, Path), 0,0,laset_ResourcePath, 0,0);
             laAddOperatorProperty(p, "remove", "Remove", "Remove this resource folder entry", "LA_remove_resource_folder", L'❌', 0);
         }
 
-        p = laAddPropertyContainer("managed_udf", "Managed UDF", "Managed UDF files", L'🖹', laui_ManagedUDFItem, sizeof(laManagedUDF), 0, 0, 0);{
-            laAddStringProperty(p, "basename", "Base Name", "Base name of the file (withiout directory)", 0, 0, 0, 0, 1, offsetof(laManagedUDF, BaseName), 0, 0, 0, 0, LA_AS_IDENTIFIER|LA_READ_ONLY);
-            laAddSubGroup(p, "udf", "UDF", "Reference to target UDF file", "udf",0, 0, 0, offsetof(laManagedUDF, udf), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
+        p = laAddPropertyContainer("managed_udf", "Managed UDF", "Managed UDF files", L'🖹', laui_ManagedUDFItem, sizeof(laManagedUDF), 0,0,0);{
+            laAddStringProperty(p, "basename", "Base Name", "Base name of the file (withiout directory)", 0,0,0,0,1, offsetof(laManagedUDF, BaseName), 0,0,0,0,LA_AS_IDENTIFIER|LA_READ_ONLY);
+            laAddSubGroup(p, "udf", "UDF", "Reference to target UDF file", "udf",0,0,0,offsetof(laManagedUDF, udf), 0,0,0,0,0,0,0,LA_UDF_REFER);
         }
-        p = laAddPropertyContainer("udf", "UDF File", "UDF file block", L'🖹', 0, sizeof(laUDF), 0, 0, 0);{
-            laAddStringProperty(p, "path", "Path", "File Path", 0, 0, 0, 0, 1, offsetof(laUDF, FileName), 0, 0, 0, 0, LA_READ_ONLY);
+        p = laAddPropertyContainer("udf", "UDF File", "UDF file block", L'🖹', 0,sizeof(laUDF), 0,0,0);{
+            laAddStringProperty(p, "path", "Path", "File Path", 0,0,0,0,1, offsetof(laUDF, FileName), 0,0,0,0,LA_READ_ONLY);
             ep=laAddEnumProperty(p, "modified", "Modified", "File modified", LA_WIDGET_ENUM_ICON_PLAIN,0,0,0,0,offsetof(laUDF, Modified),0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
             laAddEnumItemAs(ep, "MODIFIED", "Modified", "There are unsaved changes bound to this file", 1, L'🌑');
-            laAddEnumItemAs(ep, "CLEAN", "Clean", "File data is untouched", 0, 0);
+            laAddEnumItemAs(ep, "CLEAN", "Clean", "File data is untouched", 0,0);
             ep->ElementBytes=2;
         }
 
-        p = laAddPropertyContainer("udf_content_node", "UDF Content Node", "Type Structure For Previewing,Selecting,Linking UDF Contnet", L'🖹', 0, 0, 0, 0, 0);{
-            laAddStringProperty(p, "full_path", "Full Path", "Full Path", 0, 0, 0, 0, 0, 0, 0, laget_UDFContentNodeFullPath, 0, 0,LA_READ_ONLY);
-            laAddStringProperty(p, "identifier", "Identifier", "Self Identifier", 0, 0, 0, 0, 0, 0, 0, laget_UDFContentNodeIdentifier, 0, 0, LA_AS_IDENTIFIER|LA_READ_ONLY);
-            laAddIntProperty(p, "file_seek", "File Seek", "Prop Beginner's Location In The File", 0, 0, 0, 0, 0, 0, 0, 0, offsetof(laUDFContentNode, FileSeek), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
-            laAddSubGroup(p, "instances", "Instances", "Instance Nodes (Only SubProps)", "udf_content_instance",0, 0, 0, -1, 0, 0, 0, 0, 0, 0, offsetof(laUDFContentNode, Instances), 0);
-            laAddSubGroup(p, "parent", "Parent", "Parent Instance Node", "udf_content_node",0, 0, 0, offsetof(laUDFContentNode, Parent), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
-            laAddSubGroup(p, "pc", "Prop Container", "This Property Container", "property_package",0, 0, 0, offsetof(laUDFContentNode, PP), 0, 0, 0, 0, 0, 0, 0, LA_UDF_LOCAL | LA_UDF_REFER);
+        p = laAddPropertyContainer("udf_content_node", "UDF Content Node", "Type Structure For Previewing,Selecting,Linking UDF Contnet", L'🖹', 0,0,0,0,0);{
+            laAddStringProperty(p, "full_path", "Full Path", "Full Path", 0,0,0,0,0,0,0,laget_UDFContentNodeFullPath, 0,0,LA_READ_ONLY);
+            laAddStringProperty(p, "identifier", "Identifier", "Self Identifier", 0,0,0,0,0,0,0,laget_UDFContentNodeIdentifier, 0,0,LA_AS_IDENTIFIER|LA_READ_ONLY);
+            laAddIntProperty(p, "file_seek", "File Seek", "Prop Beginner's Location In The File", 0,0,0,0,0,0,0,0,offsetof(laUDFContentNode, FileSeek), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
+            laAddSubGroup(p, "instances", "Instances", "Instance Nodes (Only SubProps)", "udf_content_instance",0,0,0,-1, 0,0,0,0,0,0,offsetof(laUDFContentNode, Instances), 0);
+            laAddSubGroup(p, "parent", "Parent", "Parent Instance Node", "udf_content_node",0,0,0,offsetof(laUDFContentNode, Parent), 0,0,0,0,0,0,0,LA_UDF_REFER);
+            laAddSubGroup(p, "pc", "Prop Container", "This Property Container", "property_package",0,0,0,offsetof(laUDFContentNode, PP), 0,0,0,0,0,0,0,LA_UDF_LOCAL | LA_UDF_REFER);
         }
 
-        p = laAddPropertyContainer("udf_content_instance", "UDF Content Instance", "Instance/FileSeek Storage For Previewing,Selecting,Linking UDF Contnet", L'🖹', 0, 0, 0, 0, 0);{
-            laAddStringProperty(p, "identifier", "Identifier", "Self Identifier", 0, 0, 0, 0, 0, 0, 0, laget_UDFContentInstanceIdentifier, 0, 0,LA_READ_ONLY);
-            laAddIntProperty(p, "file_seek", "File Seek", "Instance's Location In The File", 0, 0, 0, 0, 0, 0, 0, 0, offsetof(laUDFContentInstance, FileSeek), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, LA_AS_IDENTIFIER|LA_READ_ONLY);
-            laAddSubGroup(p, "children", "Children", "Child Properties (Only SubProps)", "udf_content_node",0, 0, 0, -1, 0, 0, 0, 0, 0, 0, offsetof(laUDFContentInstance, Children), 0);
-            laAddSubGroup(p, "parent", "Parent", "Parent Property Node", "udf_content_node",0, 0, 0, offsetof(laUDFContentInstance, Parent), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
+        p = laAddPropertyContainer("udf_content_instance", "UDF Content Instance", "Instance/FileSeek Storage For Previewing,Selecting,Linking UDF Contnet", L'🖹', 0,0,0,0,0);{
+            laAddStringProperty(p, "identifier", "Identifier", "Self Identifier", 0,0,0,0,0,0,0,laget_UDFContentInstanceIdentifier, 0,0,LA_READ_ONLY);
+            laAddIntProperty(p, "file_seek", "File Seek", "Instance's Location In The File", 0,0,0,0,0,0,0,0,offsetof(laUDFContentInstance, FileSeek), 0,0,0,0,0,0,0,0,0,0,LA_AS_IDENTIFIER|LA_READ_ONLY);
+            laAddSubGroup(p, "children", "Children", "Child Properties (Only SubProps)", "udf_content_node",0,0,0,-1, 0,0,0,0,0,0,offsetof(laUDFContentInstance, Children), 0);
+            laAddSubGroup(p, "parent", "Parent", "Parent Property Node", "udf_content_node",0,0,0,offsetof(laUDFContentInstance, Parent), 0,0,0,0,0,0,0,LA_UDF_REFER);
         }
         
-        p = laAddPropertyContainer("managed_prop", "Managed Property", "Managed property for detecting changes for saving files", 0, 0, sizeof(laManagedSaveProp), 0, 0, 0);{
-            laAddStringProperty(p, "path", "Path", "Property path", 0, 0, 0, 0, 1, offsetof(laManagedSaveProp, Path), 0, 0, 0, 0, LA_READ_ONLY);
+        p = laAddPropertyContainer("managed_prop", "Managed Property", "Managed property for detecting changes for saving files", 0,0,sizeof(laManagedSaveProp), 0,0,0);{
+            laAddStringProperty(p, "path", "Path", "Property path", 0,0,0,0,1, offsetof(laManagedSaveProp, Path), 0,0,0,0,LA_READ_ONLY);
         }
 
-        p = laAddPropertyContainer("int_property", "Int Property", "Int property specific info", L'i', laui_IntPropInfo, sizeof(laIntProp), 0, 0, 1);{
-            laAddIntProperty(p, "range", "Range", "Range of the property", 0, "Min,Max", 0, 0, 0, 0, 0, 0, offsetof(laIntProp, Min), 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
-            laAddIntProperty(p, "default", "Default", "Default value", 0, 0, 0, 0, 0, 0, 0, 0, offsetof(laIntProp, DefVal), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
-            laAddIntProperty(p, "step", "Step", "Ui step of the value", 0, 0, 0, 0, 0, 0, 0, 0, offsetof(laIntProp, Step), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
-            laAddSubGroup(p, "base", "Base", "Property Base", "property_item", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, LA_UDF_SINGLE|LA_UDF_LOCAL);
+        p = laAddPropertyContainer("int_property", "Int Property", "Int property specific info", L'i', laui_IntPropInfo, sizeof(laIntProp), 0,0,1);{
+            laAddIntProperty(p, "range", "Range", "Range of the property", 0,"Min,Max", 0,0,0,0,0,0,offsetof(laIntProp, Min), 0,0,2, 0,0,0,0,0,0,0,LA_READ_ONLY);
+            laAddIntProperty(p, "default", "Default", "Default value", 0,0,0,0,0,0,0,0,offsetof(laIntProp, DefVal), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
+            laAddIntProperty(p, "step", "Step", "Ui step of the value", 0,0,0,0,0,0,0,0,offsetof(laIntProp, Step), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
+            laAddSubGroup(p, "base", "Base", "Property Base", "property_item", 0,0,0,0,0,0,0,0,0,0,0,LA_UDF_SINGLE|LA_UDF_LOCAL);
         } MAIN.ContainerInt = p;
 
-        p = laAddPropertyContainer("float_property", "Float Property", "Float property specific info", L'i', laui_FloatPropInfo, sizeof(laFloatProp), 0, 0, 1);{
-            laAddFloatProperty(p, "range", "Range", "Range of the property", 0, "Min,Max", 0, 0, 0, 0, 0, 0, offsetof(laFloatProp, Min), 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
-            laAddFloatProperty(p, "default", "Default", "Default value", 0, 0, 0, 0, 0, 0, 0, 0, offsetof(laFloatProp, DefVal), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
-            laAddFloatProperty(p, "step", "Step", "Ui step of the value", 0, 0, 0, 0, 0, 0, 0, 0, offsetof(laFloatProp, Step), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
-            laAddSubGroup(p, "base","Base", "Property Base", "property_item", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, LA_UDF_SINGLE|LA_UDF_LOCAL);
+        p = laAddPropertyContainer("float_property", "Float Property", "Float property specific info", L'i', laui_FloatPropInfo, sizeof(laFloatProp), 0,0,1);{
+            laAddFloatProperty(p, "range", "Range", "Range of the property", 0,"Min,Max", 0,0,0,0,0,0,offsetof(laFloatProp, Min), 0,0,2, 0,0,0,0,0,0,0,LA_READ_ONLY);
+            laAddFloatProperty(p, "default", "Default", "Default value", 0,0,0,0,0,0,0,0,offsetof(laFloatProp, DefVal), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
+            laAddFloatProperty(p, "step", "Step", "Ui step of the value", 0,0,0,0,0,0,0,0,offsetof(laFloatProp, Step), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
+            laAddSubGroup(p, "base","Base", "Property Base", "property_item", 0,0,0,0,0,0,0,0,0,0,0,LA_UDF_SINGLE|LA_UDF_LOCAL);
         } MAIN.ContainerFloat = p;
 
         // USER PREF ========================================================
 
-        p = laAddPropertyContainer("la_user_preference", "User Preference", "Kernel settings for LA main structure", L'⚙', 0, sizeof(LA), lapost_UserPreferences, 0, 2|LA_PROP_OTHER_ALLOC);{
+        p = laAddPropertyContainer("la_user_preference", "User Preference", "Kernel settings for LA main structure", L'⚙', 0,sizeof(LA), lapost_UserPreferences, 0,2|LA_PROP_OTHER_ALLOC);{
             laPropContainerExtraFunctions(p,0,lareset_Main,0,0,0);
-            laAddFloatProperty(p, "idle_time", "Idle time", "Time out on no input to show tooltips", 0, 0, 0, 2.0, 0.3, 0.05, 0.75, 0, offsetof(LA, IdleTime), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddIntProperty(p, "top_framerate", "Top Framerate", "Framerate limiter for drawing the user interface", 0, 0, 0, 60, 25, 1, 60, 0, offsetof(LA, TopFramerate), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddIntProperty(p, "valuator_threshold", "Valuator Threshold", "Drag How Many Pixels Trigger A Change In Valuator", 0, 0, 0, 10, 1, 1, 3, 0, offsetof(LA, ValuatorThreshold), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddIntProperty(p, "scroll_speed", "Scrolling Speed", "How Many Pixels To Move When Scrolling Using Mouse Wheel", 0, 0, 0, 10, 1, 1, 3, 0, offsetof(LA, ScrollingSpeed), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddFloatProperty(p, "animation_speed", "Animation Speed", "Ui Animation Speed", 0, 0, 0, 0.6, 0.1, 0.05, 0.2, 0, offsetof(LA, AnimationSpeed), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddFloatProperty(p, "panel_animation_speed", "Panel Animation Speed", "Panel Animation Speed", 0, 0, 0, 0.6, 0.1, 0.05, 0.2, 0, offsetof(LA, PanelAnimationSpeed), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddFloatProperty(p, "zoom_speed_2d", "Zoom Speed 2D", "2D Canvas Zooming Speed", 0, 0, 0, 0.5, 0.01, 0.01, 0.01, 0, offsetof(LA, ZoomSpeed2D), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddIntProperty(p, "tooltip_close_distance", "Tooltip Close Distance", "The tooltip will hide if mouse moved away further", 0, 0, 0, 100, 0, 1, 40, 0, offsetof(LA, TooltipCloseDistance), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-            ep = laAddEnumProperty(p, "panel_multisample", "Panel Multisample", "Multisample mode for drawing panels", 0, 0, 0, 0, 0, offsetof(LA, PanelMultisample), 0, laset_PanelMultisample, 0, 0, 0, 0, 0, 0, 0, 0);{
+            laAddFloatProperty(p, "idle_time", "Idle time", "Time out on no input to show tooltips", 0,0,0,2.0,0.3, 0.05, 0.75, 0,offsetof(LA, IdleTime), 0,0,0,0,0,0,0,0,0,0,0);
+            laAddIntProperty(p, "top_framerate", "Top Framerate", "Framerate limiter for drawing the user interface", 0,0,0,60,25, 1, 60,0,offsetof(LA, TopFramerate), 0,0,0,0,0,0,0,0,0,0,0);
+            laAddIntProperty(p, "valuator_threshold", "Valuator Threshold", "Drag How Many Pixels Trigger A Change In Valuator", 0,0,0,10,1, 1, 3, 0,offsetof(LA, ValuatorThreshold), 0,0,0,0,0,0,0,0,0,0,0);
+            laAddIntProperty(p, "scroll_speed", "Scrolling Speed", "How Many Pixels To Move When Scrolling Using Mouse Wheel", 0,0,0,10,1, 1, 3, 0,offsetof(LA, ScrollingSpeed), 0,0,0,0,0,0,0,0,0,0,0);
+            laAddFloatProperty(p, "animation_speed", "Animation Speed", "Ui Animation Speed", 0,0,0,0.6, 0.1, 0.05, 0.2, 0,offsetof(LA, AnimationSpeed), 0,0,0,0,0,0,0,0,0,0,0);
+            laAddFloatProperty(p, "panel_animation_speed", "Panel Animation Speed", "Panel Animation Speed", 0,0,0,0.6, 0.1, 0.05, 0.2, 0,offsetof(LA, PanelAnimationSpeed), 0,0,0,0,0,0,0,0,0,0,0);
+            laAddFloatProperty(p, "zoom_speed_2d", "Zoom Speed 2D", "2D Canvas Zooming Speed", 0,0,0,0.5, 0.01, 0.01, 0.01, 0,offsetof(LA, ZoomSpeed2D), 0,0,0,0,0,0,0,0,0,0,0);
+            laAddIntProperty(p, "tooltip_close_distance", "Tooltip Close Distance", "The tooltip will hide if mouse moved away further", 0,0,0,100,0,1, 40,0,offsetof(LA, TooltipCloseDistance), 0,0,0,0,0,0,0,0,0,0,0);
+            ep = laAddEnumProperty(p, "panel_multisample", "Panel Multisample", "Multisample mode for drawing panels", 0,0,0,0,0,offsetof(LA, PanelMultisample), 0,laset_PanelMultisample, 0,0,0,0,0,0,0,0);{
                 laAddEnumItemAs(ep, "none", "None", "Don't use multisample", 0,0);
                 laAddEnumItemAs(ep, "2", "2X", "2X multisample", 2, 0);
                 laAddEnumItemAs(ep, "4", "4X", "4X multisample", 4, 0);
@@ -1070,100 +1070,100 @@ void la_RegisterInternalProps(){
                 laAddEnumItemAs(ep, "16", "16X", "16X multisample", 16, 0);
             }
             
-            laAddFloatProperty(p, "margin_size", "Margin Size", "The global margin factor", 0, 0, 0, 2.0f, 0.1f, 0.02, 1.0f, 0, offsetof(LA, MarginSize), 0, laset_MarginSize, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddFloatProperty(p, "font_size", "Font Size", "The height of the font related to the row height", 0, 0, 0, 1.0f, 0.1f, 0.02, 0.75, 0, offsetof(LA, FontSize), 0, laset_FontSize, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddIntProperty(p, "interface_size", "Interface Size", "The height of one row of UI item", 0, 0, 0, 64, 16, 1, 40, 0, offsetof(LA, UiRowHeight), 0, laset_UiRowHeight, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-
-            laAddFloatProperty(p, "floating_alpha", "Shadow Alpha", "Shadow Transparency For Floating Panels", 0, 0, 0, 1, 0, 0.01, 0.7, 0, offsetof(LA, FloatingAlpha), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddIntProperty(p, "solid_shadow_length", "Solid Shadow Length", "Solod Length For Floating Panels", 0, 0, 0, 40, 0, 1, 6, 0, offsetof(LA, SolidShadowLength), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddIntProperty(p, "wire_color_slices", "Wire color slices ", "How many slices of color to give to node sockets", 0, 0, 0, 32, 1, 1, 16, 0, offsetof(LA, WireColorSlices), 0, laset_WireColorSlices, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddFloatProperty(p, "wire_thickness", "Wire thickness", "How thick is a wire", 0, 0, 0, 10, 0.1, 0.5, 5, 0, offsetof(LA, WireThickness), 0, laset_WireThickness, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddFloatProperty(p, "wire_saggyness", "Wire saggyness", "How saggy is a wire", 0, 0, 0, 20, 0, 0.5, 5, 0, offsetof(LA, WireSaggyness), 0, laset_WireSaggyness, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-
-            ep = laAddEnumProperty(p, "enable_translation", "Enable Translation", "Translate user interface into another language", 0, 0, 0, 1, 0, offsetof(LA, Translation.EnableTranslation), 0, transState, 0, 0, 0, 0, 0, 0, 0, 0);{
-                laAddEnumItem(ep, "no", "No", "Use original english string", L'🗩');
+            laAddFloatProperty(p, "margin_size", "Margin Size", "The global margin factor", 0,0,0,2.0f, 0.1f, 0.02, 1.0f, 0,offsetof(LA, MarginSize), 0,laset_MarginSize, 0,0,0,0,0,0,0,0,0);
+            laAddFloatProperty(p, "font_size", "Font Size", "The height of the font related to the row height", 0,0,0,1.0f, 0.1f, 0.02, 0.75, 0,offsetof(LA, FontSize), 0,laset_FontSize, 0,0,0,0,0,0,0,0,0);
+            laAddIntProperty(p, "interface_size", "Interface Size", "The height of one row of UI item", 0,0,0,64, 16, 1, 40,0,offsetof(LA, UiRowHeight), 0,laset_UiRowHeight, 0,0,0,0,0,0,0,0,0);
+
+            laAddFloatProperty(p, "floating_alpha", "Shadow Alpha", "Shadow transparency for floating panels", 0,0,0,1, 0,0.01, 0.7, 0,offsetof(LA, FloatingAlpha), 0,0,0,0,0,0,0,0,0,0,0);
+            laAddIntProperty(p, "solid_shadow_length", "Solid Shadow Length", "Solid shadow length for floating panels", 0,0,0,40,0,1, 6, 0,offsetof(LA, SolidShadowLength), 0,0,0,0,0,0,0,0,0,0,0);
+            laAddIntProperty(p, "wire_color_slices", "Wire color slices", "How many slices of color to give to node sockets", 0,0,0,32, 1, 1, 16, 0,offsetof(LA, WireColorSlices), 0,laset_WireColorSlices, 0,0,0,0,0,0,0,0,0);
+            laAddFloatProperty(p, "wire_thickness", "Wire thickness", "How thick is a wire", 0,0,0,10,0.1, 0.5, 5, 0,offsetof(LA, WireThickness), 0,laset_WireThickness, 0,0,0,0,0,0,0,0,0);
+            laAddFloatProperty(p, "wire_saggyness", "Wire saggyness", "How saggy is a wire", 0,0,0,20,0,0.5, 5, 0,offsetof(LA, WireSaggyness), 0,laset_WireSaggyness, 0,0,0,0,0,0,0,0,0);
+
+            ep = laAddEnumProperty(p, "enable_translation", "Enable Translation", "Translate user interface into another language", 0,0,0,1, 0,offsetof(LA, Translation.EnableTranslation), 0,transState, 0,0,0,0,0,0,0,0);{
+                laAddEnumItem(ep, "no", "No", "Use original english string", 0);
                 laAddEnumItem(ep, "yes", "Yes", "Use translated string", 0);
             }
-            laAddSubGroup(p, "languages", "Language", "The language list in the software", "la_translation_language",0, 0, laui_IdentifierOnly, offsetof(LA, Translation.CurrentLanguage), 0, 0, 0, 0, 0, 0, offsetof(LA, Translation.Languages), 0);
+            laAddSubGroup(p, "languages", "Language", "The language list in the software", "la_translation_language",0,0,laui_IdentifierOnly, offsetof(LA, Translation.CurrentLanguage), 0,0,0,0,0,0,offsetof(LA, Translation.Languages),LA_UDF_IGNORE);
             
-            laAddSubGroup(p, "resource_folders", "Resource Folders", "Folders to search for resources", "la_resource_folder",0,0,0, -1, 0, 0, 0, 0, 0, 0, offsetof(LA, ResourceFolders), 0);
-            ep = laAddEnumProperty(p, "manager_default_view", "UDF Manager Default View", "Prefer to show data blocks or files when saving", 0, 0, 0, 0, 0, offsetof(LA, ManagerDefaultView), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);{
-                laAddEnumItemAs(ep, "DATA_BLOCKS", "Data Blocks", "All data blocks", 0, 0);
+            laAddSubGroup(p, "resource_folders", "Resource Folders", "Folders to search for resources", "la_resource_folder",0,0,0,-1, 0,0,0,0,0,0,offsetof(LA, ResourceFolders), 0);
+            ep = laAddEnumProperty(p, "manager_default_view", "UDF Manager Default View", "Prefer to show data blocks or files when saving", 0,0,0,0,0,offsetof(LA, ManagerDefaultView), 0,0,0,0,0,0,0,0,0,0);{
+                laAddEnumItemAs(ep, "DATA_BLOCKS", "Data Blocks", "All data blocks", 0,0);
                 laAddEnumItemAs(ep, "FILES", "Files", "All Files", 1, 0);
             }
         
-            laAddIntProperty(p, "wacom_device_stylus", "Stylus Device", "Wacom stylus device ID", LA_WIDGET_INT_PLAIN, 0, 0, 0, 0, 0, 0, 0, offsetof(LA, WacomDeviceStylus), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, LA_READ_ONLY|LA_UDF_IGNORE);
-            laAddIntProperty(p, "wacom_device_eraser", "Eraser Device", "Wacom eraser device ID", LA_WIDGET_INT_PLAIN, 0, 0, 0, 0, 0, 0, 0, offsetof(LA, WacomDeviceEraser), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, LA_READ_ONLY|LA_UDF_IGNORE);
+            laAddIntProperty(p, "wacom_device_stylus", "Stylus Device", "Wacom stylus device ID", LA_WIDGET_INT_PLAIN, 0,0,0,0,0,0,0,offsetof(LA, WacomDeviceStylus), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY|LA_UDF_IGNORE);
+            laAddIntProperty(p, "wacom_device_eraser", "Eraser Device", "Wacom eraser device ID", LA_WIDGET_INT_PLAIN, 0,0,0,0,0,0,0,offsetof(LA, WacomDeviceEraser), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY|LA_UDF_IGNORE);
         }
 
-        p = laAddPropertyContainer("la_translation_language", "Language", "Translation language pack", 0, 0, sizeof(laTranslationNode), 0, 0, 2);{
-            laAddStringProperty(p, "name", "Name", "The name of this language", 0, 0, 0, "Unknown", 1, offsetof(laTranslationNode, LanguageName), 0, 0, 0, 0, LA_AS_IDENTIFIER);
+        p = laAddPropertyContainer("la_translation_language", "Language", "Translation language pack", 0,0,sizeof(laTranslationNode), 0,0,1);{
+            laAddStringProperty(p, "name", "Name", "The name of this language", 0,0,0,"Unknown", 1, offsetof(laTranslationNode, LanguageName), 0,0,0,0,LA_AS_IDENTIFIER);
         }
 
-        p = laAddPropertyContainer("la_extension_type", "Extension Type", "File extension and its matching type for file filtering", 0, 0, sizeof(laExtensionType), 0, 0, 0);{
-            laAddStringProperty(p, "extension", "Extension", "File extension string", LA_WIDGET_STRING_PLAIN, 0, 0, 0, 0, offsetof(laExtensionType, Extension), 0, 0, 0, 0, LA_AS_IDENTIFIER|LA_READ_ONLY);
+        p = laAddPropertyContainer("la_extension_type", "Extension Type", "File extension and its matching type for file filtering", 0,0,sizeof(laExtensionType), 0,0,0);{
+            laAddStringProperty(p, "extension", "Extension", "File extension string", LA_WIDGET_STRING_PLAIN, 0,0,0,0,offsetof(laExtensionType, Extension), 0,0,0,0,LA_AS_IDENTIFIER|LA_READ_ONLY);
         }
 
         // UI WINDOW ========================================================================================
 
-        p = laAddPropertyContainer("ui_window", "Window Node", "Property Container For A System Window", 0, laui_SubPropInfoDefault, sizeof(laWindow), lapost_Window, 0, 2);{
-            laAddStringProperty(p, "title", "Title", "The Title/Name Of A Panel", 0, 0, 0, 0, 1, offsetof(laWindow, Title), 0, 0, 0, 0, LA_AS_IDENTIFIER);
-            laAddSubGroup(p, "layouts", "Layouts", "Layout List Of The Whole Window", "ui_layout",0, 0, 0, offsetof(laWindow, CurrentLayout), laget_WindowFirstLayout, 0, laget_ListNext, 0, 0, laset_WindowActiveLayout, offsetof(laWindow, Layouts), 0);
-            _LA_PROP_PANEL = laAddSubGroup(p, "panels", "Panels", "Panel list of this window", "ui_panel",0, 0, 0, -1, 0, 0, 0, 0, 0, 0, offsetof(laWindow, Panels), 0);
+        p = laAddPropertyContainer("ui_window", "Window Node", "Property Container For A System Window", 0,laui_SubPropInfoDefault, sizeof(laWindow), lapost_Window, 0,2);{
+            laAddStringProperty(p, "title", "Title", "The Title/Name Of A Panel", 0,0,0,0,1, offsetof(laWindow, Title), 0,0,0,0,LA_AS_IDENTIFIER);
+            laAddSubGroup(p, "layouts", "Layouts", "Layout List Of The Whole Window", "ui_layout",0,0,0,offsetof(laWindow, CurrentLayout), laget_WindowFirstLayout, 0,laget_ListNext, 0,0,laset_WindowActiveLayout, offsetof(laWindow, Layouts), 0);
+            _LA_PROP_PANEL = laAddSubGroup(p, "panels", "Panels", "Panel list of this window", "ui_panel",0,0,0,-1, 0,0,0,0,0,0,offsetof(laWindow, Panels), 0);
             la_UDFAppendSharedTypePointer("_LA_PROP_PANEL", _LA_PROP_PANEL);
-            laAddSubGroup(p, "maximized_block", "Maximized Block", "Maximized block in this window", "ui_block",0, 0, 0, offsetof(laWindow, MaximizedBlock), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
-            laAddSubGroup(p, "maximized_ui", "Maximized Ui", "Maximized ui in this window", "ui_item",0, 0, 0, offsetof(laWindow, MaximizedUi), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
-            laAddSubGroup(p, "panels_hidden", "Hidden Panels", "Hidden panels of this window", "ui_panel",0, 0, 0, -1, laget_FirstHiddenPanel, 0, laget_NextHiddenPanel, laset_WindowHiddenPanel, 0, 0, 0, LA_UDF_IGNORE);
-            laAddIntProperty(p, "position", "Position", "The Position Of A Window", 0, "X,Y", "px", 0, 0, 1, 0, 0, offsetof(laWindow, X), 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddIntProperty(p, "size", "Size", "The Size Of A Window", 0, "W,H", "px", 0, 0, 0, 0, 0, offsetof(laWindow, W), 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
-            laAddIntProperty(p, "client_size", "Client Area Size", "Display Canvans Size Of A Window", 0, "W,H", "px", 0, 0, 1, 0, 0, offsetof(laWindow, CW), 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
-            laAddStringProperty(p, "operator_hints", "Operator Hints", "Operator hints if there's any", LA_WIDGET_STRING_PLAIN, 0, 0, 0, 1, offsetof(laWindow, OperatorHints), 0, 0, 0, 0, LA_READ_ONLY);
-            ep = laAddEnumProperty(p, "output_color_space", "Output Color Space", "Output color space of this window, set this to the monitor's color space to get accurate result", 0, 0, 0, 0, 0, offsetof(laWindow, OutputColorSpace), 0, laset_WindowColorSpace, 0, 0, 0, 0, 0, 0, 0, 0);{
+            laAddSubGroup(p, "maximized_block", "Maximized Block", "Maximized block in this window", "ui_block",0,0,0,offsetof(laWindow, MaximizedBlock), 0,0,0,0,0,0,0,LA_UDF_REFER);
+            laAddSubGroup(p, "maximized_ui", "Maximized Ui", "Maximized ui in this window", "ui_item",0,0,0,offsetof(laWindow, MaximizedUi), 0,0,0,0,0,0,0,LA_UDF_REFER);
+            laAddSubGroup(p, "panels_hidden", "Hidden Panels", "Hidden panels of this window", "ui_panel",0,0,0,-1, laget_FirstHiddenPanel, 0,laget_NextHiddenPanel, laset_WindowHiddenPanel, 0,0,0,LA_UDF_IGNORE);
+            laAddIntProperty(p, "position", "Position", "The Position Of A Window", 0,"X,Y", "px", 0,0,1, 0,0,offsetof(laWindow, X), 0,0,2, 0,0,0,0,0,0,0,0);
+            laAddIntProperty(p, "size", "Size", "The Size Of A Window", 0,"W,H", "px", 0,0,0,0,0,offsetof(laWindow, W), 0,0,2, 0,0,0,0,0,0,0,LA_READ_ONLY);
+            laAddIntProperty(p, "client_size", "Client Area Size", "Display Canvans Size Of A Window", 0,"W,H", "px", 0,0,1, 0,0,offsetof(laWindow, CW), 0,0,2, 0,0,0,0,0,0,0,LA_READ_ONLY);
+            laAddStringProperty(p, "operator_hints", "Operator Hints", "Operator hints if there's any", LA_WIDGET_STRING_PLAIN, 0,0,0,1, offsetof(laWindow, OperatorHints), 0,0,0,0,LA_READ_ONLY);
+            ep = laAddEnumProperty(p, "output_color_space", "Output Color Space", "Output color space of this window, set this to the monitor's color space to get accurate result", 0,0,0,0,0,offsetof(laWindow, OutputColorSpace), 0,laset_WindowColorSpace, 0,0,0,0,0,0,0,0);{
                 laAddEnumItemAs(ep, "SRGB", "sRGB", "Standard sRGB diplay", TNS_COLOR_SPACE_SRGB, 0);
                 laAddEnumItemAs(ep, "CLAY", "Clay", "Clay color space (AdobeRGB 1998 compatible)", TNS_COLOR_SPACE_CLAY, 0);
             }
-            ep = laAddEnumProperty(p, "output_show_overflow", "Show Overflow", "Show stripes on overflowing colors", LA_WIDGET_ENUM_HIGHLIGHT, 0, 0, 0, 0, offsetof(laWindow, OutputShowStripes), 0, laset_WindowShowStripes, 0, 0, 0, 0, 0, 0, 0, 0);{
-                laAddEnumItemAs(ep, "NONE", "None", "Don't show overflow", 0, 0);
+            ep = laAddEnumProperty(p, "output_show_overflow", "Show Overflow", "Show stripes on overflowing colors", LA_WIDGET_ENUM_HIGHLIGHT, 0,0,0,0,offsetof(laWindow, OutputShowStripes), 0,laset_WindowShowStripes, 0,0,0,0,0,0,0,0);{
+                laAddEnumItemAs(ep, "NONE", "None", "Don't show overflow", 0,0);
                 laAddEnumItemAs(ep, "STRIPES", "Stripes", "Show overflowing colors as stripes", 1, 0);
             }
         }
 
         // UI LAYOUT ========================================================================================
 
-        p = laAddPropertyContainer("ui_block", "Layout Node", "Property Container For Single Layout", 0, laui_LayoutListItem, sizeof(laBlock), 0, 0, 0);{
-            laAddIntProperty(p, "location", "Location", "Block Location", 0, "X,Y", "px", 0, 0, 1, 0, 0, offsetof(laBlock, X), 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
-            laAddIntProperty(p, "size", "Size", "Block Size", 0, "W,H", "px", 0, 0, 1, 0, 0, offsetof(laBlock, W), 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
-            laAddFloatProperty(p, "split_ratio", "Split Ratio", "Split Ratio On Two Subs", 0, 0, 0, 1, 0, 0.05, 0.5, 0, offsetof(laBlock, SplitRatio), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddIntProperty(p, "vertical", "Vertical", "Is Vertival Or Not", 0, 0, 0, 1, 0, 1, 0, 0, offsetof(laBlock, Vertical), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddSubGroup(p, "panel_list", "Panel List", "Panels Under This Block", "ui_panel",0, 0, 0, -1, 0, 0, 0, 0, 0, 0, offsetof(laBlock, Panels), 0);
-            laAddSubGroup(p, "current_panel", "Current Panel", "Current Selected Tab Panel", "ui_panel",0, 0, 0, offsetof(laBlock, CurrentPanel), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
-            laAddSubGroup(p, "sub1", "Sub 1", "Sub Block 1", "ui_block",0, 0, 0, offsetof(laBlock, B1), 0, 0, 0, 0, 0, 0, 0, LA_UDF_SINGLE);
-            laAddSubGroup(p, "sub2", "Sub 2", "Sub Block 2", "ui_block",0, 0, 0, offsetof(laBlock, B2), 0, 0, 0, 0, 0, 0, 0, LA_UDF_SINGLE);
-            laAddOperatorProperty(p, "fold", "Fold", "Fold the title bar", "LA_block_fold_title", 0, 0);
-            laAddOperatorProperty(p, "maximize", "Maximize", "Maximize the block", "LA_block_maximize", 0, 0);
+        p = laAddPropertyContainer("ui_block", "Layout Node", "Property Container For Single Layout", 0,laui_LayoutListItem, sizeof(laBlock), 0,0,0);{
+            laAddIntProperty(p, "location", "Location", "Block Location", 0,"X,Y", "px", 0,0,1, 0,0,offsetof(laBlock, X), 0,0,2, 0,0,0,0,0,0,0,LA_READ_ONLY);
+            laAddIntProperty(p, "size", "Size", "Block Size", 0,"W,H", "px", 0,0,1, 0,0,offsetof(laBlock, W), 0,0,2, 0,0,0,0,0,0,0,LA_READ_ONLY);
+            laAddFloatProperty(p, "split_ratio", "Split Ratio", "Split Ratio On Two Subs", 0,0,0,1, 0,0.05, 0.5, 0,offsetof(laBlock, SplitRatio), 0,0,0,0,0,0,0,0,0,0,0);
+            laAddIntProperty(p, "vertical", "Vertical", "Is Vertival Or Not", 0,0,0,1, 0,1, 0,0,offsetof(laBlock, Vertical), 0,0,0,0,0,0,0,0,0,0,0);
+            laAddSubGroup(p, "panel_list", "Panel List", "Panels Under This Block", "ui_panel",0,0,0,-1, 0,0,0,0,0,0,offsetof(laBlock, Panels), 0);
+            laAddSubGroup(p, "current_panel", "Current Panel", "Current Selected Tab Panel", "ui_panel",0,0,0,offsetof(laBlock, CurrentPanel), 0,0,0,0,0,0,0,LA_UDF_REFER);
+            laAddSubGroup(p, "sub1", "Sub 1", "Sub Block 1", "ui_block",0,0,0,offsetof(laBlock, B1), 0,0,0,0,0,0,0,LA_UDF_SINGLE);
+            laAddSubGroup(p, "sub2", "Sub 2", "Sub Block 2", "ui_block",0,0,0,offsetof(laBlock, B2), 0,0,0,0,0,0,0,LA_UDF_SINGLE);
+            laAddOperatorProperty(p, "fold", "Fold", "Fold the title bar", "LA_block_fold_title", 0,0);
+            laAddOperatorProperty(p, "maximize", "Maximize", "Maximize the block", "LA_block_maximize", 0,0);
         }
 
-        p = laAddPropertyContainer("ui_layout", "Layout Node", "Property Container For Single Layout", 0, laui_LayoutListItem, sizeof(laLayout), 0, 0, 2);{
-            laAddStringProperty(p, "title", "Title", "The Title/Name Of A Panel", 0, 0, 0, 0, 1, offsetof(laLayout, ID), 0, 0, 0, 0, LA_AS_IDENTIFIER);
-            _LA_PROP_BLOCK = laAddSubGroup(p, "root_block", "Root Block", "Root Block For Panel Docking", "ui_block",0, 0, 0, offsetof(laLayout, FirstBlock), 0, 0, 0, 0, 0, 0, 0, LA_UDF_SINGLE);
+        p = laAddPropertyContainer("ui_layout", "Layout Node", "Property Container For Single Layout", 0,laui_LayoutListItem, sizeof(laLayout), 0,0,2);{
+            laAddStringProperty(p, "title", "Title", "The Title/Name Of A Panel", 0,0,0,0,1, offsetof(laLayout, ID), 0,0,0,0,LA_AS_IDENTIFIER);
+            _LA_PROP_BLOCK = laAddSubGroup(p, "root_block", "Root Block", "Root Block For Panel Docking", "ui_block",0,0,0,offsetof(laLayout, FirstBlock), 0,0,0,0,0,0,0,LA_UDF_SINGLE);
             la_UDFAppendSharedTypePointer("_LA_PROP_BLOCK", _LA_PROP_BLOCK);
         }
 
         // UI PANEL =========================================================================================
 
-        p = laAddPropertyContainer("ui_panel", "Panel Node", "Property Container For General Panels", 0, laui_PanelListItem, sizeof(laPanel), lapost_Panel, 0, 1);{
-            laAddStringProperty(p, "title", "Title", "The Title/Name Of A Panel", 0, 0, 0, 0, 1, offsetof(laPanel, Title), 0, 0, laset_PanelTitle, 0, LA_AS_IDENTIFIER);
-            laAddIntProperty(p, "position", "Position", "The Position Of A Panel", 0, "X,Y", "px", 0, 0, 1, 0, 0, offsetof(laPanel, X), 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
-            laAddIntProperty(p, "size", "Size", "The Size Of A Panel", 0, "Width,Height", "px", 0, 0, 1, 0, 0, offsetof(laPanel, W), 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
-            laAddIntProperty(p, "real_xywh", "Real Placemnt", "Placeent Data In Structure", 0, "X,Y,W,H", "px", 0, 0, 1, 0, 0, offsetof(laPanel, TX), 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
-            ep = laAddEnumProperty(p, "snap_enable", "Snap Enable", "Enable Snapping To Edges", 0, "Left,Right,Top,Bottom", 0, 0, 0, 0, 0, 0, 4, 0, laset_PanelSnapEnable, laget_PanelSnapEnable, 0, 0, 0, 0);{
+        p = laAddPropertyContainer("ui_panel", "Panel Node", "Property Container For General Panels", 0,laui_PanelListItem, sizeof(laPanel), lapost_Panel, 0,1);{
+            laAddStringProperty(p, "title", "Title", "The Title/Name Of A Panel", 0,0,0,0,1, offsetof(laPanel, Title), 0,0,laset_PanelTitle, 0,LA_AS_IDENTIFIER|LA_TRANSLATE);
+            laAddIntProperty(p, "position", "Position", "The Position Of A Panel", 0,"X,Y", "px", 0,0,1, 0,0,offsetof(laPanel, X), 0,0,2, 0,0,0,0,0,0,0,LA_READ_ONLY);
+            laAddIntProperty(p, "size", "Size", "The Size Of A Panel", 0,"Width,Height", "px", 0,0,1, 0,0,offsetof(laPanel, W), 0,0,2, 0,0,0,0,0,0,0,LA_READ_ONLY);
+            laAddIntProperty(p, "real_xywh", "Real Placemnt", "Placeent Data In Structure", 0,"X,Y,W,H", "px", 0,0,1, 0,0,offsetof(laPanel, TX), 0,0,4, 0,0,0,0,0,0,0,LA_READ_ONLY);
+            ep = laAddEnumProperty(p, "snap_enable", "Snap Enable", "Enable Snapping To Edges", 0,"Left,Right,Top,Bottom", 0,0,0,0,0,0,4, 0,laset_PanelSnapEnable, laget_PanelSnapEnable, 0,0,0,0);{
                 laAddEnumItem(ep, "no", "No Snap", "Not Snapped to edge", 0);
                 laAddEnumItem(ep, "yes", "Snap", "Snapped to edge", L'🞉');
             } //don't swap order with the one below
-            laAddIntProperty(p, "snap", "Snap Distance", "Snapping Distance To Edges", 0, "Left,Right,Top,Bottom", "px", 0, 0, 1, 0, 0, offsetof(laPanel, SL), 0, 0, 4, 0, laset_PanelSnapDistance, 0, 0, 0, 0, 0, 0);
-            laAddIntProperty(p, "show", "Show", "The Panel Is Shown Or Not", 0, 0, 0, 0, 0, 1, 0, 0, offsetof(laPanel, Show), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddIntProperty(p, "mode", "Mode", "Normal/Floating/Static/Modal etc.", 0, 0, 0, 0, 0, 1, 0, 0, offsetof(laPanel, Mode), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
-            ep = laAddEnumProperty(p, "is_menu_panel", "Is Menu Panel", "Is Menu Panel", 0, 0, 0, 0, 0, offsetof(laPanel, IsMenuPanel), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);{
+            laAddIntProperty(p, "snap", "Snap Distance", "Snapping Distance To Edges", 0,"Left,Right,Top,Bottom", "px", 0,0,1, 0,0,offsetof(laPanel, SL), 0,0,4, 0,laset_PanelSnapDistance, 0,0,0,0,0,0);
+            laAddIntProperty(p, "show", "Show", "The Panel Is Shown Or Not", 0,0,0,0,0,1, 0,0,offsetof(laPanel, Show), 0,0,0,0,0,0,0,0,0,0,0);
+            laAddIntProperty(p, "mode", "Mode", "Normal/Floating/Static/Modal etc.", 0,0,0,0,0,1, 0,0,offsetof(laPanel, Mode), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
+            ep = laAddEnumProperty(p, "is_menu_panel", "Is Menu Panel", "Is Menu Panel", 0,0,0,0,0,offsetof(laPanel, IsMenuPanel), 0,0,0,0,0,0,0,0,0,0);{
                 ep->ElementBytes = 1;
                 laAddEnumItem(ep, "false", "False", "Not A Menu Panel", L'❌');
                 laAddEnumItem(ep, "true", "IsTrue", "Is A Menu Panel", L'🗩');
@@ -1171,58 +1171,58 @@ void la_RegisterInternalProps(){
             laAddOperatorProperty(p, "hide", "Hide", "Hide this panel", "LA_hide_panel", L'🗕', 0);
             laAddOperatorProperty(p, "dock", "Dock", "Dock this panel", "LA_dock_panel", L'🗖', 0);
             laAddOperatorProperty(p, "close", "Close", "Close this panel", "LA_block_close_panel", L'❌', 0);
-            //laAddSubGroup(p, "Detached Props", "Detached Props", "detached_prop",0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, offsetof(laPanel, PropLinkContainer->Props), 0);
-            laAddSubGroup(p, "uil","Ui List", "Panel Main Ui List", "ui_list",0, 0, 0, offsetof(laPanel, UI), 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddSubGroup(p, "title_uil","Title Ui List", "Panel Title Ui List", "ui_list",0, 0, 0,  offsetof(laPanel, TitleBar), 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddSubGroup(p, "pp","Prop Pack", "Panel Base With Own Instance", "property_package",0, 0, 0, offsetof(laPanel, PP), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
-            laAddSubGroup(p, "fake_pp","Fake Prop Pack", "Fake Prop Pack", "property_package",0, 0, 0, offsetof(laPanel, PropLinkPP), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
-            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);
+            //laAddSubGroup(p, "Detached Props", "Detached Props", "detached_prop",0,0,0,0,0,0,0,0,0,0,0,0,offsetof(laPanel, PropLinkContainer->Props), 0);
+            laAddSubGroup(p, "uil","Ui List", "Panel Main Ui List", "ui_list",0,0,0,offsetof(laPanel, UI), 0,0,0,0,0,0,0,0);
+            laAddSubGroup(p, "title_uil","Title Ui List", "Panel Title Ui List", "ui_list",0,0,0, offsetof(laPanel, TitleBar), 0,0,0,0,0,0,0,0);
+            laAddSubGroup(p, "pp","Prop Pack", "Panel Base With Own Instance", "property_package",0,0,0,offsetof(laPanel, PP), 0,0,0,0,0,0,0,LA_UDF_REFER);
+            laAddSubGroup(p, "fake_pp","Fake Prop Pack", "Fake Prop Pack", "property_package",0,0,0,offsetof(laPanel, PropLinkPP), 0,0,0,0,0,0,0,LA_UDF_REFER);
+            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);
         }
 
         // UI ITEM ==========================================================================================
 
-        p = laAddPropertyContainer("ui_list", "Ui List", "Property Container For Ui List Sub Type", L'⮑', 0, sizeof(laUiList), 0, 0, 0);{
-            laAddStringProperty(p, "tab_name", "Tab Name", "The Name Of A Tab", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, LA_AS_IDENTIFIER);
-            _LA_PROP_UI_ITEM = laAddSubGroup(p, "ui_items", "Ui Items", "Ui Items Listed In Ui List", "ui_item",0, 0, 0, -1, laget_FirstUiItem, 0, laget_ListNext, 0, 0, 0, offsetof(laUiList, UiItems), 0);
+        p = laAddPropertyContainer("ui_list", "Ui List", "Property Container For Ui List Sub Type", L'⮑', 0,sizeof(laUiList), 0,0,0);{
+            laAddStringProperty(p, "tab_name", "Tab Name", "The Name Of A Tab", 0,0,0,0,0,0,0,0,0,0,LA_AS_IDENTIFIER);
+            _LA_PROP_UI_ITEM = laAddSubGroup(p, "ui_items", "Ui Items", "Ui Items Listed In Ui List", "ui_item",0,0,0,-1, laget_FirstUiItem, 0,laget_ListNext, 0,0,0,offsetof(laUiList, UiItems), 0);
             la_UDFAppendSharedTypePointer("_LA_PROP_UI_ITEM", _LA_PROP_UI_ITEM);
-            laAddSubGroup(p, "column_items", "Column Items", "Ui Items Listed In Ui List", "ui_column",0, 0, 0, -1, laget_FirstColumnItem, 0, 0, 0, 0, 0, offsetof(laUiList, Columns), 0);
-            laAddIntProperty(p, "pan", "Pan", "Cavans Panning Pixels", 0, "Pan X,Pan Y", "px", 10000, 0, 1, 0, 0, offsetof(laUiList, PanX), 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddSubGroup(p, "instance", "Instance", "Collection Instance For Every Item", "ui_instance",0, 0, 0, offsetof(laUiList, Instance), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
+            laAddSubGroup(p, "column_items", "Column Items", "Ui Items Listed In Ui List", "ui_column",0,0,0,-1, laget_FirstColumnItem, 0,0,0,0,0,offsetof(laUiList, Columns), 0);
+            laAddIntProperty(p, "pan", "Pan", "Cavans Panning Pixels", 0,"Pan X,Pan Y", "px", 10000,0,1, 0,0,offsetof(laUiList, PanX), 0,0,2, 0,0,0,0,0,0,0,0);
+            laAddSubGroup(p, "instance", "Instance", "Collection Instance For Every Item", "ui_instance",0,0,0,offsetof(laUiList, Instance), 0,0,0,0,0,0,0,LA_UDF_REFER);
 
-            laAddIntProperty(p, "height_coeff", "Height Coefficiency", "How Many Rows A Ui Should Take Or Reserve", 0, 0, "Rows", 0, 0, 1, 0, 0, offsetof(laUiList, HeightCoeff), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+            laAddIntProperty(p, "height_coeff", "Height Coefficiency", "How Many Rows A Ui Should Take Or Reserve", 0,0,"Rows", 0,0,1, 0,0,offsetof(laUiList, HeightCoeff), 0,0,0,0,0,0,0,0,0,0,0)
                 ->ElementBytes = 2;
-            laAddIntProperty(p, "icon_id", "Icon ID", "Icon ID For This Ui List", 0, 0, "#", 1800, 32, 1, 0, 0, offsetof(laUiList, IconID), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+            laAddIntProperty(p, "icon_id", "Icon ID", "Icon ID For This Ui List", 0,0,"#", 1800,32, 1, 0,0,offsetof(laUiList, IconID), 0,0,0,0,0,0,0,0,0,0,0)
                 ->ElementBytes = 2;
         }
-        p = laAddPropertyContainer("ui_instance", "Instance", "UiList Instance Entry", L'🗇', 0, sizeof(laColumn), 0, 0, 0);{
+        p = laAddPropertyContainer("ui_instance", "Instance", "UiList Instance Entry", L'🗇', 0,sizeof(laColumn), 0,0,0);{
             //nothing needed
         }
-        p = laAddPropertyContainer("ui_column", "Ui Column", "A Column Handles The Aligning Of Ui Items", L'◫', laui_IdentifierOnly, sizeof(laColumn), 0, 0, 0);{
-            laAddFloatProperty(p, "split_at", "Split At", "Split Width Percentage From Left", 0, 0, 0, 1, 0, 0.01, 0.5, 0, 0, laget_ColumnSP, laset_ColumnSP, 0, 0, 0, 0, 0, 0, 0, 0, LA_UDF_IGNORE);
-            laAddFloatProperty(p, "real_split", "Real Split", "Float Value Split Pos In Real Strucutre", 0, 0, 0, 1, 0, 0.01, 0.5, 0, offsetof(laColumn, SP), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddIntProperty(p, "snap_width", "Snap Width", "Snap Width Of A Column", 0, 0, 0, 200, 20, 1, 30, 0, 0, laget_ColumnSnap, laset_ColumnSnap, 0, 0, 0, 0, 0, 0, 0, 0, LA_UDF_IGNORE);
-            laAddIntProperty(p, "real_snap", "Real Snap", "Int Snap Value In Real Structure", 0, 0, 0, 0, 0, 0, 0, 0, offsetof(laColumn, MaxW), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-            ep = laAddEnumProperty(p, "snap_state", "Sub Snap State", "How To Snap Sub Columns", 0, 0, 0, 0, 0, 0, laget_SnapState, laset_SnapState, 0, 0, 0, 0, 0, 0, 0, LA_UDF_IGNORE);{
+        p = laAddPropertyContainer("ui_column", "Ui Column", "A Column Handles The Aligning Of Ui Items", L'◫', laui_IdentifierOnly, sizeof(laColumn), 0,0,0);{
+            laAddFloatProperty(p, "split_at", "Split At", "Split Width Percentage From Left", 0,0,0,1, 0,0.01, 0.5, 0,0,laget_ColumnSP, laset_ColumnSP, 0,0,0,0,0,0,0,0,LA_UDF_IGNORE);
+            laAddFloatProperty(p, "real_split", "Real Split", "Float Value Split Pos In Real Strucutre", 0,0,0,1, 0,0.01, 0.5, 0,offsetof(laColumn, SP), 0,0,0,0,0,0,0,0,0,0,0);
+            laAddIntProperty(p, "snap_width", "Snap Width", "Snap Width Of A Column", 0,0,0,200,20,1, 30,0,0,laget_ColumnSnap, laset_ColumnSnap, 0,0,0,0,0,0,0,0,LA_UDF_IGNORE);
+            laAddIntProperty(p, "real_snap", "Real Snap", "Int Snap Value In Real Structure", 0,0,0,0,0,0,0,0,offsetof(laColumn, MaxW), 0,0,0,0,0,0,0,0,0,0,0);
+            ep = laAddEnumProperty(p, "snap_state", "Sub Snap State", "How To Snap Sub Columns", 0,0,0,0,0,0,laget_SnapState, laset_SnapState, 0,0,0,0,0,0,0,LA_UDF_IGNORE);{
                 laAddEnumItem(ep, "none", "None", "No Snapping", 0);
                 laAddEnumItem(ep, "left", "Left", "Snap At Left", L'⮄');
                 laAddEnumItem(ep, "right", "Right", "Snap At Right", L'⮆');
             }
-            laAddSubGroup(p, "left", "Left Sub Column", "Left Sub Column", "ui_column",0, 0, 0, offsetof(laColumn, LS), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
-            laAddSubGroup(p, "right", "Right Sub Column", "Right Sub Column", "ui_column",0, 0, 0, offsetof(laColumn, RS), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
-            laAddSubGroup(p, "self", "Self", "Self Display", "ui_column",0, LA_WIDGET_COLUMN_VIEWER, 0, -1, laget_Self, 0, 0, 0, 0, 0, 0, LA_UDF_REFER | LA_AS_IDENTIFIER);
+            laAddSubGroup(p, "left", "Left Sub Column", "Left Sub Column", "ui_column",0,0,0,offsetof(laColumn, LS), 0,0,0,0,0,0,0,LA_UDF_REFER);
+            laAddSubGroup(p, "right", "Right Sub Column", "Right Sub Column", "ui_column",0,0,0,offsetof(laColumn, RS), 0,0,0,0,0,0,0,LA_UDF_REFER);
+            laAddSubGroup(p, "self", "Self", "Self Display", "ui_column",0,LA_WIDGET_COLUMN_VIEWER, 0,-1, laget_Self, 0,0,0,0,0,0,LA_UDF_REFER | LA_AS_IDENTIFIER);
         }
-        p = laAddPropertyContainer("panel_template", "Panel Template", "Panel template for creating new panels", 0, 0, sizeof(laUiTemplate), 0, 0, 0);{
-            laAddStringProperty(p, "identifier", "Identifier", "Identifier Of This Template", 0, 0, 0, 0, 1, offsetof(laUiTemplate, Identifier), 0, 0, 0, 0, LA_AS_IDENTIFIER);
-            laAddStringProperty(p, "title", "Title", "Panel title", 0, 0, 0, 0, 1, offsetof(laUiTemplate, Title), 0, 0, 0, 0, 0);
-            laAddIntProperty(p, "define_func", "Define Func", "Define Function Distinguish(Internal Only)", 0, 0, 0, 0, 0, 0, 0, 0, offsetof(laUiTemplate, Define), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, LA_UDF_IGNORE|LA_READ_ONLY);
+        p = laAddPropertyContainer("panel_template", "Panel Template", "Panel template for creating new panels", 0,0,sizeof(laUiTemplate), 0,0,0);{
+            laAddStringProperty(p, "identifier", "Identifier", "Identifier Of This Template", 0,0,0,0,1, offsetof(laUiTemplate, Identifier), 0,0,0,0,LA_AS_IDENTIFIER);
+            laAddStringProperty(p, "title", "Title", "Panel title", 0,0,0,0,1, offsetof(laUiTemplate, Title), 0,0,0,0,LA_TRANSLATE);
+            laAddIntProperty(p, "define_func", "Define Func", "Define Function Distinguish(Internal Only)", 0,0,0,0,0,0,0,0,offsetof(laUiTemplate, Define), 0,0,0,0,0,0,0,0,0,0,LA_UDF_IGNORE|LA_READ_ONLY);
         }
 
-        p = laAddPropertyContainer("ui_item", "Ui Item", "Property Container For Ui Items", 0, 0, sizeof(laUiItem), lapost_UiItem, lapostim_UiItem, 0);{
-            laAddIntProperty(p, "location", "Location", "The Ui's Location In A UiList(Prop For Live Edit Only)", 0, "Up", "Down", 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, LA_AS_IDENTIFIER);
-            laAddIntProperty(p, "state", "State", "The Ui's Internal State", 0, 0, 0, 0, 0, 1, 0, 0, offsetof(laUiItem, State), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
-            laAddIntProperty(p, "column_layout", "Column Layout", "The Ui's Column Layout", 0, 0, 0, 10, -10, 1, 0, 0, offsetof(laUiItem, SymbolID), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+        p = laAddPropertyContainer("ui_item", "Ui Item", "Property Container For Ui Items", 0,0,sizeof(laUiItem), lapost_UiItem, lapostim_UiItem, 0);{
+            laAddIntProperty(p, "location", "Location", "The Ui's Location In A UiList(Prop For Live Edit Only)", 0,"Up", "Down", 0,0,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,LA_AS_IDENTIFIER);
+            laAddIntProperty(p, "state", "State", "The Ui's Internal State", 0,0,0,0,0,1, 0,0,offsetof(laUiItem, State), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
+            laAddIntProperty(p, "column_layout", "Column Layout", "The Ui's Column Layout", 0,0,0,10,-10,1, 0,0,offsetof(laUiItem, SymbolID), 0,0,0,0,0,0,0,0,0,0,0)
                 ->ElementBytes = sizeof(short);
-            //ep = laAddEnumProperty(p, "type", "Type", "The Type Of This Ui Item", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, LA_UDF_IGNORE);{
+            //ep = laAddEnumProperty(p, "type", "Type", "The Type Of This Ui Item", 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,LA_UDF_IGNORE);{
             //    laAddEnumItemAs(ep, "button", "Button", "Button (Pure Operator)", LA_UI_INTERNAL_BUTTON, L'🔨');
             //    laAddEnumItemAs(ep, "property_watcher", "Property Watcher", "Property Watcher For Int/Float/Enum", LA_UI_INTERNAL_WATCHER, L'🔑');
             //    laAddEnumItemAs(ep, "group", "Group", "A Group That Holds A Sub-UiList", LA_UI_INTERNAL_GROUP, L'📁');
@@ -1238,115 +1238,115 @@ void la_RegisterInternalProps(){
             //    laAddEnumItemAs(ep, "aligner", "Aligner", "Align Column Heights", LA_UI_INTERNAL_ALIGNER, 0);
             //    laAddEnumItemAs(ep, "menu", "Menu", "Menu Activiator", LA_UI_INTERNAL_MENU, L'🗩');
             //}
-            laAddStringProperty(p, "path", "Path", "Data Path", 0, 0, 0, 0, 0, 0, 0, laget_UiDataPath, 0, laread_UiDataPath,LA_READ_ONLY);
-            laAddStringProperty(p, "actuator_id", "Operator ID", "Pure Operator With No 'This' Pointer", 0, 0, 0, 0, 0, 0, 0, laget_UiOperatorID, 0, laread_UiOperatorID,LA_READ_ONLY);
-            laAddSubGroup(p, "pp", "Prop Pack", "Property Package In ui->PP Entry", "property_package",0, 0, 0, offsetof(laUiItem, PP), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
-            laAddSubGroup(p, "extra_pp", "Extra Prop Pack", "Property Package In ui->ExtraPP Entry", "property_package",0, 0, 0, offsetof(laUiItem, ExtraPP), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
-            laAddSubGroup(p, "go", "Prop Step Go", "Go Entry (For Determin If This Is A Prop Or Not)", "property_step",0, 0, 0, offsetof(laUiItem, PP.Go), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER | LA_UDF_IGNORE);
-            laAddSubGroup(p, "raw_this", "Prop Raw This", "ui->PP.RawThis Entry", "property_package",0, 0, 0, offsetof(laUiItem, PP.RawThis), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
-            //ep = laAddSubGroup(p, "Ui Template", "A Template Used To Create Sub Ui", "ui_template",0, LA_WIDGET_COLLECTION_SELECTOR, 0, offsetof(laUiItem, Template), laget_PanelTemplate, 0, laget_ListNext, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
+            laAddStringProperty(p, "path", "Path", "Data Path", 0,0,0,0,0,0,0,laget_UiDataPath, 0,laread_UiDataPath,LA_READ_ONLY);
+            laAddStringProperty(p, "actuator_id", "Operator ID", "Pure Operator With No 'This' Pointer", 0,0,0,0,0,0,0,laget_UiOperatorID, 0,laread_UiOperatorID,LA_READ_ONLY);
+            laAddSubGroup(p, "pp", "Prop Pack", "Property Package In ui->PP Entry", "property_package",0,0,0,offsetof(laUiItem, PP), 0,0,0,0,0,0,0,LA_UDF_REFER);
+            laAddSubGroup(p, "extra_pp", "Extra Prop Pack", "Property Package In ui->ExtraPP Entry", "property_package",0,0,0,offsetof(laUiItem, ExtraPP), 0,0,0,0,0,0,0,LA_UDF_REFER);
+            laAddSubGroup(p, "go", "Prop Step Go", "Go Entry (For Determin If This Is A Prop Or Not)", "property_step",0,0,0,offsetof(laUiItem, PP.Go), 0,0,0,0,0,0,0,LA_UDF_REFER | LA_UDF_IGNORE);
+            laAddSubGroup(p, "raw_this", "Prop Raw This", "ui->PP.RawThis Entry", "property_package",0,0,0,offsetof(laUiItem, PP.RawThis), 0,0,0,0,0,0,0,LA_UDF_REFER);
+            //ep = laAddSubGroup(p, "Ui Template", "A Template Used To Create Sub Ui", "ui_template",0,LA_WIDGET_COLLECTION_SELECTOR, 0,offsetof(laUiItem, Template), laget_PanelTemplate, 0,laget_ListNext, 0,0,0,0,0,0,LA_UDF_REFER);
             //laSubGroupDetachable(ep, laget_UiTemplate, laget_ListNext);
-            laAddSubGroup(p, "current_page", "Current Page", "Current Page In Sub Ui List", "ui_list",0, 0, 0, offsetof(laUiItem, Page), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
-            laAddSubGroup(p, "internal_type", "Ui Internal Type", "Ui Internal Type", "ui_type",0, 0, 0, offsetof(laUiItem, Type), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
-            laAddSubGroup(p, "on_column", "On Column", "Ui On Which Column", "ui_column",0, 0, 0, offsetof(laUiItem, C), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
-            laAddSubGroup(p, "sub", "Sub UI", "Sub Ui Lists For Tabs And Collection", "ui_list",0, 0, 0, -1, 0, 0, 0, 0, 0, 0, offsetof(laUiItem, Subs), 0);
-            laAddStringProperty(p, "extra_args", "Extra Arguments", "Extra Arguments For This Ui Item", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddStringProperty(p, "display", "Display", "Display String For Label", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-            //laAddSubGroup(p, "Condition Ui Extra Data", "Condition Ui Extra Data For Linkage And Conditioning", "ui_condition_extra_data",0, 0, 0, offsetof(laUiItem, Extra), laget_ConditionerExtra, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-            //laAddSubGroup(p, "2d_extra", "2D View Extra Data", "2D View Ui States And Modes Storage", 0,0, 0, 0, offsetof(laUiItem, Extra), laget_CanvasExtra, 0, 0, 0, 0, 0, 0, 0);
-            laAddOperatorProperty(p, "maximize", "Maximize", "Maximize this UI item", "LA_canvas_ui_maximize", 0, 0);
+            laAddSubGroup(p, "current_page", "Current Page", "Current Page In Sub Ui List", "ui_list",0,0,0,offsetof(laUiItem, Page), 0,0,0,0,0,0,0,LA_UDF_REFER);
+            laAddSubGroup(p, "internal_type", "Ui Internal Type", "Ui Internal Type", "ui_type",0,0,0,offsetof(laUiItem, Type), 0,0,0,0,0,0,0,LA_UDF_REFER);
+            laAddSubGroup(p, "on_column", "On Column", "Ui On Which Column", "ui_column",0,0,0,offsetof(laUiItem, C), 0,0,0,0,0,0,0,LA_UDF_REFER);
+            laAddSubGroup(p, "sub", "Sub UI", "Sub Ui Lists For Tabs And Collection", "ui_list",0,0,0,-1, 0,0,0,0,0,0,offsetof(laUiItem, Subs), 0);
+            laAddStringProperty(p, "extra_args", "Extra Arguments", "Extra Arguments For This Ui Item", 0,0,0,0,0,0,0,0,0,0,0);
+            laAddStringProperty(p, "display", "Display", "Display String For Label", 0,0,0,0,0,0,0,0,0,0,0);
+            //laAddSubGroup(p, "Condition Ui Extra Data", "Condition Ui Extra Data For Linkage And Conditioning", "ui_condition_extra_data",0,0,0,offsetof(laUiItem, Extra), laget_ConditionerExtra, 0,0,0,0,0,0,0,0,0);
+            //laAddSubGroup(p, "2d_extra", "2D View Extra Data", "2D View Ui States And Modes Storage", 0,0,0,0,offsetof(laUiItem, Extra), laget_CanvasExtra, 0,0,0,0,0,0,0);
+            laAddOperatorProperty(p, "maximize", "Maximize", "Maximize this UI item", "LA_canvas_ui_maximize", 0,0);
         }
 
-        p = laAddPropertyContainer("ui_type", "Ui Type", "Ui Type Descriptor", 0, laui_IdentifierOnly, sizeof(laUiType), 0, 0, 0);{
-            laAddStringProperty(p, "identifier", "Identifier", "Identifier Of This Ui Type", 0, 0, 0, 0, 0, offsetof(laUiType, Identifier), 0, 0, 0, 0, LA_AS_IDENTIFIER|LA_READ_ONLY);
+        p = laAddPropertyContainer("ui_type", "Ui Type", "Ui Type Descriptor", 0,laui_IdentifierOnly, sizeof(laUiType), 0,0,0);{
+            laAddStringProperty(p, "identifier", "Identifier", "Identifier Of This Ui Type", 0,0,0,0,0,offsetof(laUiType, Identifier), 0,0,0,0,LA_AS_IDENTIFIER|LA_READ_ONLY);
         }
 
         // NODE ================================================================================================
 
-        p = laAddPropertyContainer("la_out_socket", "Output Socket", "Output socket for nodes", 0, 0, sizeof(laNodeOutSocket), 0, 0, 1);{
-            laAddStringProperty(p, "label", "Label", "Socket's label", 0, 0, 0, 0, 1, offsetof(laNodeOutSocket, Label), 0, 0, 0, 0, LA_AS_IDENTIFIER);
-            laAddIntProperty(p, "data_type", "Data type", "User defined data type", 0, 0, 0, 0, 0, 0, 0, 0, offsetof(laNodeOutSocket, DataType), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
-            laAddIntProperty(p, "array_length", "Array Length", "Array length of data", 0, 0, 0, 0, 0, 0, 0, 0, offsetof(laNodeOutSocket, ArrLen), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
-            laAddSubGroup(p, "parent", "Parent", "Parent node", "la_base_node",0, 0, 0, offsetof(laNodeOutSocket, Parent), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
+        p = laAddPropertyContainer("la_out_socket", "Output Socket", "Output socket for nodes", 0,0,sizeof(laNodeOutSocket), 0,0,1);{
+            laAddStringProperty(p, "label", "Label", "Socket's label", 0,0,0,0,1, offsetof(laNodeOutSocket, Label), 0,0,0,0,LA_AS_IDENTIFIER);
+            laAddIntProperty(p, "data_type", "Data type", "User defined data type", 0,0,0,0,0,0,0,0,offsetof(laNodeOutSocket, DataType), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
+            laAddIntProperty(p, "array_length", "Array Length", "Array length of data", 0,0,0,0,0,0,0,0,offsetof(laNodeOutSocket, ArrLen), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
+            laAddSubGroup(p, "parent", "Parent", "Parent node", "la_base_node",0,0,0,offsetof(laNodeOutSocket, Parent), 0,0,0,0,0,0,0,LA_UDF_REFER);
         } LA_PC_SOCKET_OUT = p;
-        p = laAddPropertyContainer("la_in_socket", "Input Socket", "Input socket for nodest", 0, 0, sizeof(laNodeInSocket), 0, 0, 1);{
-            laAddStringProperty(p, "label", "Label", "Socket's label", 0, 0, 0, 0, 1, offsetof(laNodeInSocket, Label), 0, 0, 0, 0, LA_AS_IDENTIFIER);
-            sp=laAddSubGroup(p, "source", "Source", "Source socket", "la_out_socket",0, 0, offsetof(laNodeInSocket, Source), 0, 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
+        p = laAddPropertyContainer("la_in_socket", "Input Socket", "Input socket for nodest", 0,0,sizeof(laNodeInSocket), 0,0,1);{
+            laAddStringProperty(p, "label", "Label", "Socket's label", 0,0,0,0,1, offsetof(laNodeInSocket, Label), 0,0,0,0,LA_AS_IDENTIFIER);
+            sp=laAddSubGroup(p, "source", "Source", "Source socket", "la_out_socket",0,0,offsetof(laNodeInSocket, Source), 0,0,0,0,0,0,0,0,LA_UDF_REFER);
             LA_PROP_SOCKET_SOURCE=sp;
-            laAddIntProperty(p, "data_type", "Data type", "User defined data type", 0, 0, 0, 0, 0, 0, 0, 0, offsetof(laNodeInSocket, DataType), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
-            laAddIntProperty(p, "color_id", "Color ID", "Color ID of the source wire", 0, 0, 0, 0, 0, 0, 0, 0, offsetof(laNodeInSocket, ColorId), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0);
-            laAddIntProperty(p, "array_length", "Array Length", "Array length of data", 0, 0, 0, 0, 0, 0, 0, 0, offsetof(laNodeInSocket, ArrLen), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
+            laAddIntProperty(p, "data_type", "Data type", "User defined data type", 0,0,0,0,0,0,0,0,offsetof(laNodeInSocket, DataType), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
+            laAddIntProperty(p, "color_id", "Color ID", "Color ID of the source wire", 0,0,0,0,0,0,0,0,offsetof(laNodeInSocket, ColorId), 0,0,0,0,0,0,0,0,0,0,0);
+            laAddIntProperty(p, "array_length", "Array Length", "Array length of data", 0,0,0,0,0,0,0,0,offsetof(laNodeInSocket, ArrLen), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
         } LA_PC_SOCKET_IN = p;
         laPropContainerExtraFunctions(p,0,0,latouched_NodeInSocket,0,0);
 
-        p = laAddPropertyContainer("la_value_mapper", "Value Mapper", "Value mapper", 0, 0, sizeof(laValueMapper), 0, 0, 1);{
-            laAddSubGroup(p, "points", "Points", "Points inside the mapper", "la_value_mapper_point",0, 0, -1, 0, 0, 0, 0, 0, 0, 0, offsetof(laValueMapper, Points), 0);
-            laAddFloatProperty(p, "in_range", "Input Range", "Input range from 0 to 1", 0, "Min,Max", 0, 0, 0, 0, 0, 0, offsetof(laValueMapper, InRange), 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddFloatProperty(p, "out_range", "Output Range", "Output range from 0 to 1", 0, "Min,Max", 0, 0, 0, 0, 0, 0, offsetof(laValueMapper, OutRange), 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+        p = laAddPropertyContainer("la_value_mapper", "Value Mapper", "Value mapper", 0,0,sizeof(laValueMapper), 0,0,1);{
+            laAddSubGroup(p, "points", "Points", "Points inside the mapper", "la_value_mapper_point",0,0,-1, 0,0,0,0,0,0,0,offsetof(laValueMapper, Points), 0);
+            laAddFloatProperty(p, "in_range", "Input Range", "Input range from 0 to 1", 0,"Min,Max", 0,0,0,0,0,0,offsetof(laValueMapper, InRange), 0,0,2, 0,0,0,0,0,0,0,0);
+            laAddFloatProperty(p, "out_range", "Output Range", "Output range from 0 to 1", 0,"Min,Max", 0,0,0,0,0,0,offsetof(laValueMapper, OutRange), 0,0,2, 0,0,0,0,0,0,0,0);
         } LA_PC_MAPPER=p;
-        p = laAddPropertyContainer("la_value_mapper_point", "Value Mapper", "Value mapper", 0, 0, sizeof(laValueMapperPoint), 0, 0, 1);{
-            laAddFloatProperty(p, "position", "Position", "XY Position ranging from 0 to 1", 0, "X,Y", 0, 0, 0, 0, 0, 0, offsetof(laValueMapperPoint, x), 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0);
+        p = laAddPropertyContainer("la_value_mapper_point", "Value Mapper", "Value mapper", 0,0,sizeof(laValueMapperPoint), 0,0,1);{
+            laAddFloatProperty(p, "position", "Position", "XY Position ranging from 0 to 1", 0,"X,Y", 0,0,0,0,0,0,offsetof(laValueMapperPoint, x), 0,0,2, 0,0,0,0,0,0,0,0);
         }
         
 
         // PROPERTIES ==========================================================================================
 
-        p = laAddPropertyContainer("property_item", "Property Item", "Property Item For Data Types Like Int/Float/Enum/String/SubType", L'🔌', 0, sizeof(laProp), 0, 0, 1);{
-            laAddStringProperty(p, "identifier", "Identifier", "Property Unique Identifier", LA_WIDGET_STRING_PLAIN, 0, 0, 0, 0, 0, 0, laget_PropertyIdentifier, 0, 0, LA_AS_IDENTIFIER|LA_READ_ONLY);
-            laAddStringProperty(p, "name", "Name", "Property Display Name", 0, 0, 0, 0, 0, offsetof(laProp, Name), 0, 0, 0, 0,LA_READ_ONLY);
-            laAddStringProperty(p, "description", "Description", "Property Description", 0, 0, 0, 0, 0, offsetof(laProp, Description), 0, 0, 0, 0,LA_READ_ONLY);
-            laAddIntProperty(p, "prop_type", "Property Type", "Property Type(Like Int/Float/Enunm/Sub)", 0, 0, 0, 0, 0, 0, 0, 0, offsetof(laProp, PropertyType), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
-            laAddIntProperty(p, "icon_id", "Icon Id", "Icon ID For Current Container", 0, 0, 0, 0, 0, 0, 0, 0, offsetof(laProp, IconID), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddIntProperty(p, "sub_icon_id", "Icon Id", "Icon ID For Current Container", 0, 0, 0, 0, 0, 0, 0, 0, 0, laget_PropertySubContainerIconID, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddSubGroup(p, "sub", "Sub Type", "Sub Type Property Container", "property_container",0, 0, 0, offsetof(laProp, SubProp), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
+        p = laAddPropertyContainer("property_item", "Property Item", "Property Item For Data Types Like Int/Float/Enum/String/SubType", L'🔌', 0,sizeof(laProp), 0,0,1);{
+            laAddStringProperty(p, "identifier", "Identifier", "Property Unique Identifier", LA_WIDGET_STRING_PLAIN, 0,0,0,0,0,0,laget_PropertyIdentifier, 0,0,LA_AS_IDENTIFIER|LA_READ_ONLY);
+            laAddStringProperty(p, "name", "Name", "Property Display Name", 0,0,0,0,0,offsetof(laProp, Name), 0,0,0,0,LA_READ_ONLY);
+            laAddStringProperty(p, "description", "Description", "Property Description", 0,0,0,0,0,offsetof(laProp, Description), 0,0,0,0,LA_READ_ONLY);
+            laAddIntProperty(p, "prop_type", "Property Type", "Property Type(Like Int/Float/Enunm/Sub)", 0,0,0,0,0,0,0,0,offsetof(laProp, PropertyType), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
+            laAddIntProperty(p, "icon_id", "Icon Id", "Icon ID For Current Container", 0,0,0,0,0,0,0,0,offsetof(laProp, IconID), 0,0,0,0,0,0,0,0,0,0,0);
+            laAddIntProperty(p, "sub_icon_id", "Icon Id", "Icon ID For Current Container", 0,0,0,0,0,0,0,0,0,laget_PropertySubContainerIconID, 0,0,0,0,0,0,0,0,0,0);
+            laAddSubGroup(p, "sub", "Sub Type", "Sub Type Property Container", "property_container",0,0,0,offsetof(laProp, SubProp), 0,0,0,0,0,0,0,LA_UDF_REFER);
         }
 
-        p = laAddPropertyContainer("property_container", "Property Container", "Property Container For Some Property Items", L'🔌', 0, sizeof(laPropContainer), 0, 0, 1);{
-            laAddStringProperty(p, "identifier", "Identifier", "Property Unique Identifier", LA_WIDGET_STRING_PLAIN, 0, 0, 0, 0, offsetof(laPropContainer, Identifier), 0, 0, 0, 0, LA_AS_IDENTIFIER | LA_UDF_IGNORE|LA_READ_ONLY);
-            laAddStringProperty(p, "name", "Name", "Property Display Name", 0, 0, 0, 0, 0, offsetof(laPropContainer, Name), 0, 0, 0, 0, LA_UDF_IGNORE|LA_READ_ONLY);
-            laAddStringProperty(p, "description", "Description", "Property Description", 0, 0, 0, 0, 0, offsetof(laPropContainer, Name), 0, 0, 0, 0, LA_UDF_IGNORE|LA_READ_ONLY);
-            laAddIntProperty(p, "icon_id", "Icon Id", "Icon ID For Current Container", 0, 0, 0, 0, 0, 0, 0, 0, offsetof(laPropContainer, IconID), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-            laAddSubGroup(p, "properties", "Properties", "Single Property", "property_item", laget_PropertyNodeType, 0, 0, -1, laget_PropertyItemFirst, laget_PropertyItemFirst, laget_PropertyItemNext, 0, 0, 0, 0, LA_UDF_IGNORE);
-            _LA_PROP_FAILED_ITEM = laAddSubGroup(p, "failed_nodes", "Failed Nodes", "Used To Store UDF Failed Nodes", "property_trash_item",0, 0, 0, -1, 0, 0, 0, 0, 0, 0, offsetof(laPropContainer, FailedNodes), LA_UDF_IGNORE);
-            _LA_PROP_TRASH_ITEM = laAddSubGroup(p, "trash_bin", "Trash Bin", "Used To Store Unlinked Items", "property_trash_item",0, 0, 0, -1, 0, 0, 0, 0, 0, 0, offsetof(laPropContainer, TrashBin), LA_UDF_IGNORE);
+        p = laAddPropertyContainer("property_container", "Property Container", "Property Container For Some Property Items", L'🔌', 0,sizeof(laPropContainer), 0,0,1);{
+            laAddStringProperty(p, "identifier", "Identifier", "Property Unique Identifier", LA_WIDGET_STRING_PLAIN, 0,0,0,0,offsetof(laPropContainer, Identifier), 0,0,0,0,LA_AS_IDENTIFIER | LA_UDF_IGNORE|LA_READ_ONLY);
+            laAddStringProperty(p, "name", "Name", "Property Display Name", 0,0,0,0,0,offsetof(laPropContainer, Name), 0,0,0,0,LA_UDF_IGNORE|LA_READ_ONLY);
+            laAddStringProperty(p, "description", "Description", "Property Description", 0,0,0,0,0,offsetof(laPropContainer, Name), 0,0,0,0,LA_UDF_IGNORE|LA_READ_ONLY);
+            laAddIntProperty(p, "icon_id", "Icon Id", "Icon ID For Current Container", 0,0,0,0,0,0,0,0,offsetof(laPropContainer, IconID), 0,0,0,0,0,0,0,0,0,0,0);
+            laAddSubGroup(p, "properties", "Properties", "Single Property", "property_item", laget_PropertyNodeType, 0,0,-1, laget_PropertyItemFirst, laget_PropertyItemFirst, laget_PropertyItemNext, 0,0,0,0,LA_UDF_IGNORE);
+            _LA_PROP_FAILED_ITEM = laAddSubGroup(p, "failed_nodes", "Failed Nodes", "Used To Store UDF Failed Nodes", "property_trash_item",0,0,0,-1, 0,0,0,0,0,0,offsetof(laPropContainer, FailedNodes), LA_UDF_IGNORE);
+            _LA_PROP_TRASH_ITEM = laAddSubGroup(p, "trash_bin", "Trash Bin", "Used To Store Unlinked Items", "property_trash_item",0,0,0,-1, 0,0,0,0,0,0,offsetof(laPropContainer, TrashBin), LA_UDF_IGNORE);
             laAddOperatorProperty(p, "restore_all", "Restore All", "Restore All Trash Items Or Failed Nodes To A User Selected Linkage", "LA_sub_restore_data_block", L'⭯', 0);
         }
 
-        p = laAddPropertyContainer("property_trash_item", "Trash Item", "Single Trash Item", 0, 0, 0, 0, 0, 0);{
-            laAddIntProperty(p, "instance_int", "Instance", "Memory Address Of This Data Block (INT Represent)", 0, 0, 0, 0, 0, 0, 0, 0, 0, laget_TrashItemInstance, 0, 0, 0, 0, 0, 0, 0, 0, 0, LA_AS_IDENTIFIER|LA_READ_ONLY);
-            laAddSubGroup(p, "instance", "Instance", "Single Memory Address Of This Data Block", "property_trash_item",0, 0, 0, -1, 0, laget_TrashItemInstance, 0, 0, 0, 0, 0, LA_UDF_REFER | LA_UDF_IGNORE);
+        p = laAddPropertyContainer("property_trash_item", "Trash Item", "Single Trash Item", 0,0,0,0,0,0);{
+            laAddIntProperty(p, "instance_int", "Instance", "Memory Address Of This Data Block (INT Represent)", 0,0,0,0,0,0,0,0,0,laget_TrashItemInstance, 0,0,0,0,0,0,0,0,0,LA_AS_IDENTIFIER|LA_READ_ONLY);
+            laAddSubGroup(p, "instance", "Instance", "Single Memory Address Of This Data Block", "property_trash_item",0,0,0,-1, 0,laget_TrashItemInstance, 0,0,0,0,0,LA_UDF_REFER | LA_UDF_IGNORE);
             laAddOperatorProperty(p, "restore", "Restore", "Restore Data Block To A User Selected Linkage", "LA_sub_restore_data_block", L'⭯', 0);
         }
 
-        p = laAddPropertyContainer("property_package", "Property Package", "Property Package For Data Access (Mainly UI)", L'🔌', 0, sizeof(laPropPack), 0, 0, 0);{
-            laAddSubGroup(p, "last_step", "Last Step", "Last Prop Step(Segment)", "property_step",0, 0, 0, offsetof(laPropPack, LastPs), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER | LA_UDF_IGNORE);
+        p = laAddPropertyContainer("property_package", "Property Package", "Property Package For Data Access (Mainly UI)", L'🔌', 0,sizeof(laPropPack), 0,0,0);{
+            laAddSubGroup(p, "last_step", "Last Step", "Last Prop Step(Segment)", "property_step",0,0,0,offsetof(laPropPack, LastPs), 0,0,0,0,0,0,0,LA_UDF_REFER | LA_UDF_IGNORE);
         }
-        p = laAddPropertyContainer("property_step", "Property Step", "Property Segment Item", 0, 0, sizeof(laPropStep), 0, 0, 0);{
-            laAddSubGroup(p, "property", "Property", "Property Reference", "property_item",0, 0, 0, offsetof(laPropStep, p), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
+        p = laAddPropertyContainer("property_step", "Property Step", "Property Segment Item", 0,0,sizeof(laPropStep), 0,0,0);{
+            laAddSubGroup(p, "property", "Property", "Property Reference", "property_item",0,0,0,offsetof(laPropStep, p), 0,0,0,0,0,0,0,LA_UDF_REFER);
         }
-        p = laAddPropertyContainer("detached_prop", "Detached Prop", "Detached Prop", L'🔌', 0, sizeof(laSubProp) + 48, lapost_DetachedProp, 0, 0);{
-            laAddSubGroup(p, "raw_this", "Raw This", "Raw This Pointer", "property_package",0, 0, 0, offsetof(laProp, DetachedPP.RawThis), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
-            laAddStringProperty(p, "path", "Path", "Data Path", 0, 0, 0, 0, 0, 0, 0, laget_DetachedPropPath, 0, laread_DetachedPropPath, 0);
-            laAddStringProperty(p, "rename", "Rename", "Rename", 0, 0, 0, 0, 0, offsetof(laProp, Identifier), 0, 0, 0, laread_DetachedPropRename, 0);
+        p = laAddPropertyContainer("detached_prop", "Detached Prop", "Detached Prop", L'🔌', 0,sizeof(laSubProp) + 48, lapost_DetachedProp, 0,0);{
+            laAddSubGroup(p, "raw_this", "Raw This", "Raw This Pointer", "property_package",0,0,0,offsetof(laProp, DetachedPP.RawThis), 0,0,0,0,0,0,0,LA_UDF_REFER);
+            laAddStringProperty(p, "path", "Path", "Data Path", 0,0,0,0,0,0,0,laget_DetachedPropPath, 0,laread_DetachedPropPath, 0);
+            laAddStringProperty(p, "rename", "Rename", "Rename", 0,0,0,0,0,offsetof(laProp, Identifier), 0,0,0,laread_DetachedPropRename, 0);
         }
 
     }
 
     // TNS WORLD ============================================================================================
 
-    p = laAddPropertyContainer("tns_main", "TNS Main", "Render Kernel Root Structure", 0, 0, sizeof(tnsMain), 0, 0, 2);{
-        laAddSubGroup(p, "world", "World", "World Descriptor", "tns_world",0, 0, 0, offsetof(tnsMain, World), 0, 0, 0, 0, 0, 0, 0, LA_UDF_SINGLE | LA_UDF_LOCAL);
+    p = laAddPropertyContainer("tns_main", "TNS Main", "Render Kernel Root Structure", 0,0,sizeof(tnsMain), 0,0,2);{
+        laAddSubGroup(p, "world", "World", "World Descriptor", "tns_world",0,0,0,offsetof(tnsMain, World), 0,0,0,0,0,0,0,LA_UDF_SINGLE | LA_UDF_LOCAL);
 
-        sp = laAddSubGroup(p, "texture_list", "Texture List", "List Of All Textures Under TNS Management", "tns_texture",0, 0, 0, -1, 0, tnsget_PreviewTexture, 0, 0, 0, tnsset_PreviewTexture, offsetof(tnsMain, Textures), LA_UDF_IGNORE);
+        sp = laAddSubGroup(p, "texture_list", "Texture List", "List Of All Textures Under TNS Management", "tns_texture",0,0,0,-1, 0,tnsget_PreviewTexture, 0,0,0,tnsset_PreviewTexture, offsetof(tnsMain, Textures), LA_UDF_IGNORE);
         laSubGroupDetachable(sp, tnsget_detached_FirstTexture, laget_ListNext);
 
-        //laAddSubGroup(p, "Render Buffers", "Storing All Render Buffers In Current Program Instance", "tns_render_buffer",0, 0, 0, offsetof(tnsMain, ActiveRenderBuffer), 0, 0, 0, 0, 0, 0, 0, 0, offsetof(tnsMain, RenderBuffers), 0);
+        //laAddSubGroup(p, "Render Buffers", "Storing All Render Buffers In Current Program Instance", "tns_render_buffer",0,0,0,offsetof(tnsMain, ActiveRenderBuffer), 0,0,0,0,0,0,0,0,offsetof(tnsMain, RenderBuffers), 0);
     }
 
-    p = laAddPropertyContainer("tns_texture", "TNS Texture Item", "A Texture Descriptor With GL Handle", 0, 0, sizeof(tnsTexture), 0, 0, 0);{
-        laAddIntProperty(p, "gl_handle", "OpenGL Handle", "OpenGL Handle Of This Texture", LA_WIDGET_INT_PLAIN, 0, 0, 0, 0, 0, 0, 0, offsetof(tnsTexture, GLTexHandle), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, LA_AS_IDENTIFIER|LA_READ_ONLY);
-        laAddIntProperty(p, "size", "Size", "Width And Height", 0, "Width,Height", "px", 0, 0, 0, 0, 0, offsetof(tnsTexture, Width), 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
-        ep = laAddEnumProperty(p, "internal_type", "Internal Type", "Internal bits type", LA_WIDGET_ENUM_CYCLE, 0, 0, 0, 0, offsetof(tnsTexture, GLTexBitsType), 0, 0, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);{
+    p = laAddPropertyContainer("tns_texture", "TNS Texture Item", "A Texture Descriptor With GL Handle", 0,0,sizeof(tnsTexture), 0,0,0);{
+        laAddIntProperty(p, "gl_handle", "OpenGL Handle", "OpenGL Handle Of This Texture", LA_WIDGET_INT_PLAIN, 0,0,0,0,0,0,0,offsetof(tnsTexture, GLTexHandle), 0,0,0,0,0,0,0,0,0,0,LA_AS_IDENTIFIER|LA_READ_ONLY);
+        laAddIntProperty(p, "size", "Size", "Width And Height", 0,"Width,Height", "px", 0,0,0,0,0,offsetof(tnsTexture, Width), 0,0,2, 0,0,0,0,0,0,0,LA_READ_ONLY);
+        ep = laAddEnumProperty(p, "internal_type", "Internal Type", "Internal bits type", LA_WIDGET_ENUM_CYCLE, 0,0,0,0,offsetof(tnsTexture, GLTexBitsType), 0,0,0,0,0,0,0,0,0,LA_READ_ONLY);{
             laAddEnumItemAs(ep, "rgba", "GL_RGBA", "GL_RGBA", GL_RGBA8,0);
             laAddEnumItemAs(ep, "rgb", "GL_RGB", "GL_RGB", GL_RGB8,0);
             laAddEnumItemAs(ep, "rg", "GL_RG", "GL_RG", GL_RG8,0);
@@ -1361,75 +1361,75 @@ void la_RegisterInternalProps(){
             laAddEnumItemAs(ep, "r32i", "GL_R32I", "GL_R32I", GL_R32I,0);
             laAddEnumItemAs(ep, "depth", "GL_DEPTH_COMPONENT32F", "GL_DEPTH_COMPONENT32F", GL_DEPTH_COMPONENT32F,0);
         }
-        p->Template2D = la_GetCanvasTemplate(0, "la_CanvasDrawTexture");
+        p->Template2D = la_GetCanvasTemplate(0,"la_CanvasDrawTexture");
     }
 
-    p = laAddPropertyContainer("tns_world", "World", "3D World Structure", 0, 0, sizeof(tnsWorld), 0, 0, 2|LA_PROP_OTHER_ALLOC);{
-        sp = laAddSubGroup(p, "root_objects", "Root Objects", "List of all root objects", "tns_object",0, 0, 0, 0, 0, 0, 0, 0, 0, 0, offsetof(tnsWorld, RootObjects), 0);
+    p = laAddPropertyContainer("tns_world", "World", "3D World Structure", 0,0,sizeof(tnsWorld), 0,0,2|LA_PROP_OTHER_ALLOC);{
+        sp = laAddSubGroup(p, "root_objects", "Root Objects", "List of all root objects", "tns_object",0,0,0,0,0,0,0,0,0,0,offsetof(tnsWorld, RootObjects), 0);
         laSubGroupDetachable(sp, tnsget_detached_FirstRootObject, laget_ListNext);
-        sp = laAddSubGroup(p, "objects", "Objects", "List of all objects", "tns_object",tnsget_ObjectType, 0, 0, -1, 0, 0, 0, 0, 0, 0, offsetof(tnsWorld, AllObjects), 0);
+        sp = laAddSubGroup(p, "objects", "Objects", "List of all objects", "tns_object",tnsget_ObjectType, 0,0,-1, 0,0,0,0,0,0,offsetof(tnsWorld, AllObjects), 0);
     }
 
-    p = laAddPropertyContainer("tns_child_object", "Child Object", "Child object linker", 0, 0, sizeof(laListItemPointer), 0, 0, 0);{
-        laAddSubGroup(p, "object", "Object", "Object link", "tns_object",tnsget_ObjectType, 0, 0, offsetof(laListItemPointer, p), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
+    p = laAddPropertyContainer("tns_child_object", "Child Object", "Child object linker", 0,0,sizeof(laListItemPointer), 0,0,0);{
+        laAddSubGroup(p, "object", "Object", "Object link", "tns_object",tnsget_ObjectType, 0,0,offsetof(laListItemPointer, p), 0,0,0,0,0,0,0,LA_UDF_REFER);
     }
 
-    p = laAddPropertyContainer("tns_object", "Object", "3D Object Item", 0, 0, sizeof(tnsObject), tnspost_Object, 0, 2);{
+    p = laAddPropertyContainer("tns_object", "Object", "3D Object Item", 0,0,sizeof(tnsObject), tnspost_Object, 0,2);{
         laPropContainerExtraFunctions(p,0,0,0,tnspropagate_Object,0);
         TNS_PC_OBJECT_GENERIC=p;
-        laAddStringProperty(p, "name", "Object Name", "The Name Of The Object", 0, 0, 0, 0, 1, offsetof(tnsObject, Name), 0, 0, 0, 0, LA_AS_IDENTIFIER);
+        laAddStringProperty(p, "name", "Object Name", "The Name Of The Object", 0,0,0,0,1, offsetof(tnsObject, Name), 0,0,0,0,LA_AS_IDENTIFIER);
         laAddIntProperty(p,"flags","Flags","Flags",0,0,0,0,0,0,0,0,offsetof(tnsObject,Flags),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
-        ep = laAddEnumProperty(p, "show", "Show", "Show object in the viewport", 0, 0, 0, 0, 0, offsetof(tnsObject, Show), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);{
+        ep = laAddEnumProperty(p, "show", "Show", "Show object in the viewport", 0,0,0,0,0,offsetof(tnsObject, Show), 0,0,0,0,0,0,0,0,0,0);{
             laAddEnumItem(ep, "false", "False", "False", L'🌔');
             laAddEnumItem(ep, "true", "IsTrue", "IsTrue", L'🌑');
         }
-        ep = laAddEnumProperty(p, "show_on_render", "Show On Render", "Show on render", 0, 0, 0, 0, 0, offsetof(tnsObject, ShowOnRender), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);{
+        ep = laAddEnumProperty(p, "show_on_render", "Show On Render", "Show on render", 0,0,0,0,0,offsetof(tnsObject, ShowOnRender), 0,0,0,0,0,0,0,0,0,0);{
             laAddEnumItem(ep, "false", "False", "False", L'🚫');
             laAddEnumItem(ep, "true", "IsTrue", "IsTrue", L'📷');
         }
-        ep = laAddEnumProperty(p, "type", "Type", "Object Type Like Mesh,Camera And Lamp", 0, 0, 0, 0, 0, offsetof(tnsObject, Type), 0, 0, 0, 0, 0, 0, 0, 0, 0, LA_READ_ONLY);{
-            laAddEnumItemAs(ep, "EMPTY", "Empty", "Empty object, not rendered", 0, L'➕');
+        ep = laAddEnumProperty(p, "type", "Type", "Object Type Like Mesh,Camera And Lamp", 0,0,0,0,0,offsetof(tnsObject, Type), 0,0,0,0,0,0,0,0,0,LA_READ_ONLY);{
+            laAddEnumItemAs(ep, "EMPTY", "Empty", "Empty object, not rendered", 0,L'➕');
             laAddEnumItemAs(ep, "CAMERA", "Camera", "Camera object, to render a scene", TNS_OBJECT_CAMERA, L'📷');
             laAddEnumItemAs(ep, "LIGHT", "Lamp", "Lamp object, to illuminate the scene", TNS_OBJECT_LIGHT, 0);
             laAddEnumItemAs(ep, "MESH", "Mesh", "Mesh object, made of verts/edges/faces", TNS_OBJECT_MESH, 0);
         }
-        laAddFloatProperty(p, "location", "Location", "XYZ Location In Local Coordinates", 0, "X,Y,Z", 0, 0, 0, 0.1, 0, 0, offsetof(tnsObject, Location), 0, 0, 3, 0, tnsset_ObjectLocation, 0, 0, 0, 0, 0, 0);
-        laAddFloatProperty(p, "rotation", "Rotation", "Rotation In Local Coordinates", 0, "X,Y,Z", 0, 0, 0, 0, 0, 0, offsetof(tnsObject, Rotation), 0, 0, 3, 0, tnsset_ObjectRotation, 0, 0, 0, 0, 0, 0);
-        laAddFloatProperty(p, "scale", "Scale", "Local Uniform Scale", 0, 0, 0, 0, 0, 0, 0, 0, offsetof(tnsObject, Scale), 0, tnsset_ObjectScale, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-        laAddFloatProperty(p, "glocation", "Global Location", "Location in global coordinates", 0, "X,Y,Z", 0, 0, 0, 0.1, 0, 0, offsetof(tnsObject, GLocation), 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0);
-        laAddFloatProperty(p, "grotation", "Global Rotation", "Rotation in global coordinates", 0, "X,Y,Z", 0, 0, 0, 0, 0, 0, offsetof(tnsObject, GRotation), 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0);
-        laAddFloatProperty(p, "gscale", "Global Scale", "Global uniform scale", 0, 0, 0, 0, 0, 0, 0, 0, offsetof(tnsObject, GScale), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-        laAddFloatProperty(p, "global_mat", "Global Matrix", "Global transformation matrix", 0, 0, 0, 0, 0, 0, 0, 0, offsetof(tnsObject, GlobalTransform), 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, LA_READ_ONLY);
-        laAddFloatProperty(p, "local_mat", "Local Matrix", "Local transformation matrix", 0, 0, 0, 0, 0, 0, 0, 0, offsetof(tnsObject, SelfTransform), 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, LA_READ_ONLY);
-        ep = laAddEnumProperty(p, "rotation_mode", "Rotation Mode", "Rotation Mode Of This Object(e.g. XYZ/XZY/Quaternion...)", 0, 0, 0, 0, 0, offsetof(tnsObject, RotationMode), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);{
+        laAddFloatProperty(p, "location", "Location", "XYZ Location In Local Coordinates", 0,"X,Y,Z", 0,0,0,0.1, 0,0,offsetof(tnsObject, Location), 0,0,3, 0,tnsset_ObjectLocation, 0,0,0,0,0,0);
+        laAddFloatProperty(p, "rotation", "Rotation", "Rotation In Local Coordinates", 0,"X,Y,Z", 0,0,0,0,0,0,offsetof(tnsObject, Rotation), 0,0,3, 0,tnsset_ObjectRotation, 0,0,0,0,0,0);
+        laAddFloatProperty(p, "scale", "Scale", "Local Uniform Scale", 0,0,0,0,0,0,0,0,offsetof(tnsObject, Scale), 0,tnsset_ObjectScale, 0,0,0,0,0,0,0,0,0);
+        laAddFloatProperty(p, "glocation", "Global Location", "Location in global coordinates", 0,"X,Y,Z", 0,0,0,0.1, 0,0,offsetof(tnsObject, GLocation), 0,0,3, 0,0,0,0,0,0,0,0);
+        laAddFloatProperty(p, "grotation", "Global Rotation", "Rotation in global coordinates", 0,"X,Y,Z", 0,0,0,0,0,0,offsetof(tnsObject, GRotation), 0,0,3, 0,0,0,0,0,0,0,0);
+        laAddFloatProperty(p, "gscale", "Global Scale", "Global uniform scale", 0,0,0,0,0,0,0,0,offsetof(tnsObject, GScale), 0,0,0,0,0,0,0,0,0,0,0);
+        laAddFloatProperty(p, "global_mat", "Global Matrix", "Global transformation matrix", 0,0,0,0,0,0,0,0,offsetof(tnsObject, GlobalTransform), 0,0,16, 0,0,0,0,0,0,0,LA_READ_ONLY);
+        laAddFloatProperty(p, "local_mat", "Local Matrix", "Local transformation matrix", 0,0,0,0,0,0,0,0,offsetof(tnsObject, SelfTransform), 0,0,16, 0,0,0,0,0,0,0,LA_READ_ONLY);
+        ep = laAddEnumProperty(p, "rotation_mode", "Rotation Mode", "Rotation Mode Of This Object(e.g. XYZ/XZY/Quaternion...)", 0,0,0,0,0,offsetof(tnsObject, RotationMode), 0,0,0,0,0,0,0,0,0,0);{
             laAddEnumItem(ep, "xyz", "XYZ", "XYZ Euler Mode", 0); laAddEnumItem(ep, "xzy", "XZY", "XZY Euler Mode", 0);
             laAddEnumItem(ep, "yxz", "YXZ", "YXZ Euler Mode", 0); laAddEnumItem(ep, "yzx", "YZX", "YZX Euler Mode", 0);
             laAddEnumItem(ep, "zxy", "ZXY", "ZXY Euler Mode", 0); laAddEnumItem(ep, "zyx", "ZYX", "ZYX Euler Mode", 0);
             laAddEnumItem(ep, "quaternion", "Quaternion", "Quaternion Mode", 0);
         }
-        laAddSubGroup(p, "active", "Active", "Active reference", "tns_object",0, 0, 0, offsetof(tnsObject, Active), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER|LA_READ_ONLY);
-        laAddSubGroup(p, "in_root", "In Root", "Root object of this object", "tns_object",0, 0, 0, offsetof(tnsObject, InRoot), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
-        laAddSubGroup(p, "parent", "Parent", "Object parent", "tns_object",0, 0, 0, offsetof(tnsObject, ParentObject), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
-        laAddSubGroup(p, "children", "Children", "The Children Of This Object", "tns_child_object",0, 0, 0, -1, 0, 0, 0, 0, 0, 0, offsetof(tnsObject, ChildObjects), 0);
+        laAddSubGroup(p, "active", "Active", "Active reference", "tns_object",0,0,0,offsetof(tnsObject, Active), 0,0,0,0,0,0,0,LA_UDF_REFER|LA_READ_ONLY);
+        laAddSubGroup(p, "in_root", "In Root", "Root object of this object", "tns_object",0,0,0,offsetof(tnsObject, InRoot), 0,0,0,0,0,0,0,LA_UDF_REFER);
+        laAddSubGroup(p, "parent", "Parent", "Object parent", "tns_object",0,0,0,offsetof(tnsObject, ParentObject), 0,0,0,0,0,0,0,LA_UDF_REFER);
+        laAddSubGroup(p, "children", "Children", "The Children Of This Object", "tns_child_object",0,0,0,-1, 0,0,0,0,0,0,offsetof(tnsObject, ChildObjects), 0);
     }
-    p = laAddPropertyContainer("tns_mesh_object", "Mesh Object", "Mesh object", 0, 0, sizeof(tnsMeshObject), tnspost_Object, 0, 2);{
+    p = laAddPropertyContainer("tns_mesh_object", "Mesh Object", "Mesh object", 0,0,sizeof(tnsMeshObject), tnspost_Object, 0,2);{
         laPropContainerExtraFunctions(p,0,0,tnstouched_Object,tnspropagate_Object,0);
         TNS_PC_OBJECT_MESH=p;
-        laAddStringProperty(p, "name", "Object Name", "The Name Of The Object", 0, 0, 0, 0, 1, offsetof(tnsObject, Name), 0, 0, 0, 0, LA_AS_IDENTIFIER);
-        laAddSubGroup(p, "base", "Base", "Object base", "tns_object",0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, LA_UDF_LOCAL);
-        ep = laAddEnumProperty(p, "mode", "Mode", "Mesh object mode", 0, 0, 0, 0, 0, offsetof(tnsMeshObject, Mode), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);{
+        laAddStringProperty(p, "name", "Object Name", "The Name Of The Object", 0,0,0,0,1, offsetof(tnsObject, Name), 0,0,0,0,LA_AS_IDENTIFIER);
+        laAddSubGroup(p, "base", "Base", "Object base", "tns_object",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
+        ep = laAddEnumProperty(p, "mode", "Mode", "Mesh object mode", 0,0,0,0,0,offsetof(tnsMeshObject, Mode), 0,0,0,0,0,0,0,0,0,0);{
             laAddEnumItemAs(ep, "OBJECT", "Object", "Object mode", TNS_MESH_OBJECT_MODE, 0);
             laAddEnumItemAs(ep, "EDIT", "Edit", "Edit mode", TNS_MESH_EDIT_MODE, 0);
         }
-        laAddSubGroup(p, "mv", "MMesh Verts", "Vertices of editing mesh", "tns_mvert",0, 0, 0, -1, 0, 0, 0, 0, 0, 0, offsetof(tnsMeshObject, mv), 0);
-        laAddSubGroup(p, "me", "MMesh Edges", "Edges of editing mesh", "tns_medge",0, 0, 0, -1, 0, 0, 0, 0, 0, 0, offsetof(tnsMeshObject, me), 0);
-        laAddSubGroup(p, "mf", "MMesh Faces", "Faces of editing mesh", "tns_mface",0, 0, 0, -1, 0, 0, 0, 0, 0, 0, offsetof(tnsMeshObject, mf), 0);
+        laAddSubGroup(p, "mv", "MMesh Verts", "Vertices of editing mesh", "tns_mvert",0,0,0,-1, 0,0,0,0,0,0,offsetof(tnsMeshObject, mv), 0);
+        laAddSubGroup(p, "me", "MMesh Edges", "Edges of editing mesh", "tns_medge",0,0,0,-1, 0,0,0,0,0,0,offsetof(tnsMeshObject, me), 0);
+        laAddSubGroup(p, "mf", "MMesh Faces", "Faces of editing mesh", "tns_mface",0,0,0,-1, 0,0,0,0,0,0,offsetof(tnsMeshObject, mf), 0);
         laAddIntProperty(p, "totmv", "MVert Count", "Total MVert", 0,0,0,0,0,0,0,0,offsetof(tnsMeshObject, totmv),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
         laAddIntProperty(p, "totme", "MEdge Count", "Total MEdge", 0,0,0,0,0,0,0,0,offsetof(tnsMeshObject, totme),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
         laAddIntProperty(p, "totmf", "MFace Count", "Total MFace", 0,0,0,0,0,0,0,0,offsetof(tnsMeshObject, totmf),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
-        laAddRawProperty(p, "v", "Verts", "Verts", offsetof(tnsMeshObject, v), tnsget_MeshObjectVertSize, 0, 0, LA_READ_ONLY);
-        laAddRawProperty(p, "e", "Edges", "Edges", offsetof(tnsMeshObject, e), tnsget_MeshObjectEdgeSize, 0, 0, LA_READ_ONLY);
-        laAddRawProperty(p, "f", "Faces", "Faces", offsetof(tnsMeshObject, f), 0, tnsget_MeshObjectFaceRaw, tnsset_MeshObjectFaceRaw, LA_READ_ONLY);
+        laAddRawProperty(p, "v", "Verts", "Verts", offsetof(tnsMeshObject, v), tnsget_MeshObjectVertSize, 0,0,LA_READ_ONLY);
+        laAddRawProperty(p, "e", "Edges", "Edges", offsetof(tnsMeshObject, e), tnsget_MeshObjectEdgeSize, 0,0,LA_READ_ONLY);
+        laAddRawProperty(p, "f", "Faces", "Faces", offsetof(tnsMeshObject, f), 0,tnsget_MeshObjectFaceRaw, tnsset_MeshObjectFaceRaw, LA_READ_ONLY);
         laAddIntProperty(p, "totv", "Vert Count", "Total Vert", 0,0,0,0,0,0,0,0,offsetof(tnsMeshObject, totv),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
         laAddIntProperty(p, "tote", "Edge Count", "Total Edge", 0,0,0,0,0,0,0,0,offsetof(tnsMeshObject, tote),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
         laAddIntProperty(p, "totf", "Face Count", "Total Face", 0,0,0,0,0,0,0,0,offsetof(tnsMeshObject, totf),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
@@ -1437,40 +1437,40 @@ void la_RegisterInternalProps(){
         //laAddIntProperty(p, "maxe", "Max Edge", "Max Edge count", 0,0,0,0,0,0,0,0,offsetof(tnsMeshObject, maxe),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
         //laAddIntProperty(p, "maxf", "Max Face", "Max Face count", 0,0,0,0,0,0,0,0,offsetof(tnsMeshObject, maxf),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
     }
-    p = laAddPropertyContainer("tns_camera", "Camera", "Camera object", L'📷', 0, sizeof(tnsCamera), 0, 0, 2);{
+    p = laAddPropertyContainer("tns_camera", "Camera", "Camera object", L'📷', 0,sizeof(tnsCamera), 0,0,2);{
         laPropContainerExtraFunctions(p,0,0,0,tnspropagate_Object,0);
         TNS_PC_OBJECT_CAMERA=p;
-        laAddStringProperty(p, "name", "Object Name", "The Name Of The Object", 0, 0, 0, 0, 1, offsetof(tnsObject, Name), 0, 0, 0, 0, LA_AS_IDENTIFIER);
-        laAddSubGroup(p, "base", "Base", "Object base", "tns_object",0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, LA_UDF_LOCAL);
-        ep = laAddEnumProperty(p, "camera_type", "Camera Type", "Type Of A Camera, Like Perspective Or Fisheye", 0, 0, 0, 0, 0, offsetof(tnsCamera, CameraType), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);{
+        laAddStringProperty(p, "name", "Object Name", "The Name Of The Object", 0,0,0,0,1, offsetof(tnsObject, Name), 0,0,0,0,LA_AS_IDENTIFIER);
+        laAddSubGroup(p, "base", "Base", "Object base", "tns_object",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
+        ep = laAddEnumProperty(p, "camera_type", "Camera Type", "Type Of A Camera, Like Perspective Or Fisheye", 0,0,0,0,0,offsetof(tnsCamera, CameraType), 0,0,0,0,0,0,0,0,0,0);{
             laAddEnumItem(ep, "PERSP", "Perspective", "Camera in linear perspective", 0);
             laAddEnumItem(ep, "ORTHO", "Orthographic", "Camera in orthographic view", 0);
         }
-        laAddFloatProperty(p, "fov", "FOV", "Field Of View", 0, 0, "^", rad(160), rad(1), rad(0.1), rad(60), 0, offsetof(tnsCamera, FOV), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, LA_RAD_ANGLE);
-        laAddFloatProperty(p, "depth_range", "Depth Range", "Depth Range To Map From 0 To 1", 0, "Near,Far", 0, 0, 0, 0.1, 0, 0, offsetof(tnsCamera, ZMin), 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0);
-        laAddFloatProperty(p, "focus_distance", "Focus Distance", "For Viewing Camera To Determin Zooming Center", 0, 0, 0, 0, 0, 0.1, 100, 0, offsetof(tnsCamera, FocusDistance), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-        laAddFloatProperty(p, "orth_scale", "Scale", "Orthographical Camera Scale", 0, 0, "^^", 1000, 0.001, 0.1, 1, 0, offsetof(tnsCamera, OrthScale), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-        laAddOperatorProperty(p, "set_active", "Set Active", "Set this camera as the active one", "TNS_set_active_camera", 0, 0);
+        laAddFloatProperty(p, "fov", "FOV", "Field Of View", 0,0,"^", rad(160), rad(1), rad(0.1), rad(60), 0,offsetof(tnsCamera, FOV), 0,0,0,0,0,0,0,0,0,0,LA_RAD_ANGLE);
+        laAddFloatProperty(p, "depth_range", "Depth Range", "Depth Range To Map From 0 To 1", 0,"Near,Far", 0,0,0,0.1, 0,0,offsetof(tnsCamera, ZMin), 0,0,2, 0,0,0,0,0,0,0,0);
+        laAddFloatProperty(p, "focus_distance", "Focus Distance", "For Viewing Camera To Determin Zooming Center", 0,0,0,0,0,0.1, 100,0,offsetof(tnsCamera, FocusDistance), 0,0,0,0,0,0,0,0,0,0,0);
+        laAddFloatProperty(p, "orth_scale", "Scale", "Orthographical Camera Scale", 0,0,"^^", 1000,0.001, 0.1, 1, 0,offsetof(tnsCamera, OrthScale), 0,0,0,0,0,0,0,0,0,0,0);
+        laAddOperatorProperty(p, "set_active", "Set Active", "Set this camera as the active one", "TNS_set_active_camera", 0,0);
     }
-    p = laAddPropertyContainer("tns_light", "Light", "Light object", L'🔅', 0, sizeof(tnsLight), 0, 0, 2);{
+    p = laAddPropertyContainer("tns_light", "Light", "Light object", L'🔅', 0,sizeof(tnsLight), 0,0,2);{
         laPropContainerExtraFunctions(p,0,0,0,tnspropagate_Object,0);
         TNS_PC_OBJECT_LIGHT=p;
-        laAddStringProperty(p, "name", "Object Name", "The Name Of The Object", 0, 0, 0, 0, 1, offsetof(tnsObject, Name), 0, 0, 0, 0, LA_AS_IDENTIFIER);
-        laAddSubGroup(p, "base", "Base", "Object base", "tns_object",0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, LA_UDF_LOCAL);
-        ep = laAddEnumProperty(p, "unidirectional", "UniDirectional", "UniDirectional lighting", 0, 0, 0, 0, 0, offsetof(tnsLight, UniDirectional), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);{
+        laAddStringProperty(p, "name", "Object Name", "The Name Of The Object", 0,0,0,0,1, offsetof(tnsObject, Name), 0,0,0,0,LA_AS_IDENTIFIER);
+        laAddSubGroup(p, "base", "Base", "Object base", "tns_object",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
+        ep = laAddEnumProperty(p, "unidirectional", "UniDirectional", "UniDirectional lighting", 0,0,0,0,0,offsetof(tnsLight, UniDirectional), 0,0,0,0,0,0,0,0,0,0);{
             laAddEnumItem(ep, "NONE", "Perspective", "Camera in linear perspective", 0);
             laAddEnumItem(ep, "orthographic", "Orthographic", "Camera in orthographic view", 0);
         }
     }
 
-    p = laAddPropertyContainer("tns_mvert", "MVert", "MMesh vert", 0, 0, sizeof(tnsMVert), 0, 0, 0);{
-        laAddFloatProperty(p, "p", "Position", "Position", 0, "X,Y,Z", 0,0,0,0,0,0, offsetof(tnsMVert, p),0,0,3,0,0,0,0,0,0,0,0);
-        laAddFloatProperty(p, "n", "Normal", "Normal", 0, "X,Y,Z", 0,0,0,0,0,0, offsetof(tnsMVert, n),0,0,3,0,0,0,0,0,0,0,0);
+    p = laAddPropertyContainer("tns_mvert", "MVert", "MMesh vert", 0,0,sizeof(tnsMVert), 0,0,0);{
+        laAddFloatProperty(p, "p", "Position", "Position", 0,"X,Y,Z", 0,0,0,0,0,0,offsetof(tnsMVert, p),0,0,3,0,0,0,0,0,0,0,0);
+        laAddFloatProperty(p, "n", "Normal", "Normal", 0,"X,Y,Z", 0,0,0,0,0,0,offsetof(tnsMVert, n),0,0,3,0,0,0,0,0,0,0,0);
         laAddIntProperty(p,"i","Index","Index",0,0,0,0,0,0,0,0,offsetof(tnsMVert, i),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
         laAddIntProperty(p,"flags","Flags","Flags",0,0,0,0,0,0,0,0,offsetof(tnsMVert, flags),0,0,0,0,0,0,0,0,0,0,0);
         laAddSubGroup(p, "elink", "Edge Link", "Edge link", "tns_medge_link",0,0,0,-1,0,0,0,0,0,0,offsetof(tnsMVert, elink),0);
     }
-    p = laAddPropertyContainer("tns_medge", "MEdge", "MMesh edge", 0, 0, sizeof(tnsMEdge), 0, 0, 0);{
+    p = laAddPropertyContainer("tns_medge", "MEdge", "MMesh edge", 0,0,sizeof(tnsMEdge), 0,0,0);{
         laAddIntProperty(p,"i","Index","Index",0,0,0,0,0,0,0,0,offsetof(tnsMEdge, i),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
         laAddIntProperty(p,"flags","Flags","Flags",0,0,0,0,0,0,0,0,offsetof(tnsMEdge, flags),0,0,0,0,0,0,0,0,0,0,0);
         laAddSubGroup(p, "vl", "vl", "Left vert", "tns_mvert",0,0,0,offsetof(tnsMEdge, vl),0,0,0,0,0,0,0,LA_UDF_REFER);
@@ -1478,19 +1478,19 @@ void la_RegisterInternalProps(){
         laAddSubGroup(p, "fl", "fl", "Left face", "tns_mface",0,0,0,offsetof(tnsMEdge, fl),0,0,0,0,0,0,0,LA_UDF_REFER);
         laAddSubGroup(p, "fr", "fr", "Right face", "tns_mface",0,0,0,offsetof(tnsMEdge, fr),0,0,0,0,0,0,0,LA_UDF_REFER);
     }
-    p = laAddPropertyContainer("tns_mface", "MFace", "MMesh face", 0, 0, sizeof(tnsMFace), 0, 0, 0);{
+    p = laAddPropertyContainer("tns_mface", "MFace", "MMesh face", 0,0,sizeof(tnsMFace), 0,0,0);{
         laAddIntProperty(p,"i","Index","Index",0,0,0,0,0,0,0,0,offsetof(tnsMFace, i),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
         laAddIntProperty(p,"flags","Flags","Flags",0,0,0,0,0,0,0,0,offsetof(tnsMFace, flags),0,0,0,0,0,0,0,0,0,0,0);
         laAddSubGroup(p, "l", "Loop", "Loop", "tns_loop",0,0,0,-1,0,0,0,0,0,0,offsetof(tnsMFace, l),0);
         laAddIntProperty(p,"looplen","Loop Length","Loop length",0,0,0,0,0,0,0,0,offsetof(tnsMFace, looplen),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY)->ElementBytes=2;
-        laAddFloatProperty(p, "n", "Normal", "Normal", 0, "X,Y,Z", 0,0,0,0,0,0, offsetof(tnsMFace, n),0,0,3,0,0,0,0,0,0,0,0);
-        //laAddFloatProperty(p, "gn", "Global Normal", "Global normal", 0, "X,Y,Z", 0,0,0,0,0,0, offsetof(tnsMFace, gn),0,0,3,0,0,0,0,0,0,0,0);
-        laAddFloatProperty(p, "c", "Center", "Center", 0, "X,Y,Z", 0,0,0,0,0,0, offsetof(tnsMFace, c),0,0,3,0,0,0,0,0,0,0,0);
+        laAddFloatProperty(p, "n", "Normal", "Normal", 0,"X,Y,Z", 0,0,0,0,0,0,offsetof(tnsMFace, n),0,0,3,0,0,0,0,0,0,0,0);
+        //laAddFloatProperty(p, "gn", "Global Normal", "Global normal", 0,"X,Y,Z", 0,0,0,0,0,0,offsetof(tnsMFace, gn),0,0,3,0,0,0,0,0,0,0,0);
+        laAddFloatProperty(p, "c", "Center", "Center", 0,"X,Y,Z", 0,0,0,0,0,0,offsetof(tnsMFace, c),0,0,3,0,0,0,0,0,0,0,0);
     }
-    p = laAddPropertyContainer("tns_medge_link", "MEdge Link", "MEdge Link", 0, 0, sizeof(laListItemPointer), 0, 0, 0);{
+    p = laAddPropertyContainer("tns_medge_link", "MEdge Link", "MEdge Link", 0,0,sizeof(laListItemPointer), 0,0,0);{
         laAddSubGroup(p, "e", "Edge", "Edge", "tns_medge",0,0,0,offsetof(laListItemPointer, p),0,0,0,0,0,0,0,LA_UDF_REFER);
     }
-    p = laAddPropertyContainer("tns_loop", "MFace Loop", "MFace Loop", 0, 0, sizeof(laListItemPointer), 0, 0, 0);{
+    p = laAddPropertyContainer("tns_loop", "MFace Loop", "MFace Loop", 0,0,sizeof(laListItemPointer), 0,0,0);{
         laAddSubGroup(p, "e", "Edge", "Edge", "tns_medge",0,0,0,offsetof(laListItemPointer, p),0,0,0,0,0,0,0,LA_UDF_REFER);
     }
 }

+ 1 - 1
resources/la_templates.c

@@ -1270,7 +1270,7 @@ void laui_UserPreference(laUiList *uil, laPropPack *Base, laPropPack *OperatorIn
 
             laShowLabel(muil, mc, "Translation:", 0, 0);
             laShowLabel(muil, mcl, "Enable Translation:", 0, 0);
-            laShowItem(muil, mcr, 0, "la.user_preferences.enable_translation");
+            laShowItemFull(muil, mcr, 0, "la.user_preferences.enable_translation",LA_WIDGET_ENUM_CYCLE,0,0,0);
             b = laOnConditionThat(muil, mcl, laPropExpression(0, "la.user_preferences.enable_translation"));{
             laShowLabel(muil, mcl, "Language:", 0, 0);
                 laShowItemFull(muil, mcr, 0, "la.user_preferences.languages", LA_WIDGET_COLLECTION_SELECTOR, 0, 0, 0);

+ 242 - 0
resources/la_translations.c

@@ -0,0 +1,242 @@
+/*
+* LaGUI: A graphical application framework.
+* Copyright (C) 2022 Wu Yiming
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "la_5.h"
+
+static const char *entries[]={
+"Color","颜色",
+"Route","路径",
+"Driver","驱动",
+"Auxiliary","辅助",
+"Fold","折叠",
+"Restore Layout","恢复布局",
+"Maximize","最大化",
+"Background color of the canvas","画布的背景颜色",
+"Create a new window","创建一个新窗口",
+"Cosine","余弦",
+"Log","对数",
+"Tangent","正切",
+"Subtract","相减",
+"Cycle All Layouts In Current Window","在当前窗口中循环所有布局",
+"The Title/Name Of A Panel","面板的标题/名字",
+"Themes Loaded In The Program","该程序已加载的主题",
+"Arcsin","反正弦",
+"Atan2","正切2",
+"Divide","箱除",
+"Arccosine","反余切",
+"Sine","正弦",
+"Arctangent","余弦",
+"Mod","取余",
+"Power","指数",
+"Framerate limiter for drawing the user interface","绘制整个用户界面的帧率限制",
+"Dock some panels here.","将面板停靠到这里。",
+"User Preferences","用户偏好设置",
+"Drivers","驱动",
+"Controllers","控制器",
+"Data Manager","数据管理",
+"System","系统",
+"Input Mapper","输入映射",
+"Terminal","终端",
+"Controlling","控制",
+"Tools","工具",
+"Texture Inspector","纹理检查工具",
+"Yiming's Blog","吴奕茗的博客",
+"Details","细节",
+"Add","相加",
+"Ignore The Statement","忽略该陈述",
+"Histories","历史",
+"Show Border","显示边框",
+"显示 User Preferences","显示 用户设置",
+"Range of the random values","随机值的范围",
+"RGB to OKHSL","RGB 到 OKHSL",
+"Show ","显示 ",
+"Discard And Quit","放弃并退出",
+"Make Transform","生成变换",
+"OKHSL to RGB","OKHSL 到 RGB",
+"Vector Math","矢量数学",
+"Show User Preferences","显示用户设置",
+"Refresh","刷新",
+"Random","随机",
+"Move","移动",
+"Split","拆分",
+"Visualizer","可视化",
+"Matrix","矩阵",
+"Configure","配置",
+"Small Math","小数学",
+"Save","保存",
+"Math","数学",
+"Comment","评论",
+"Values","数值",
+"Save All Modified","保存所有已修改",
+"Transform","变换",
+"Switch","切换",
+"Mapper","映射",
+"Binding","绑定",
+"You still have unsaved/unassigned datablocks:","您还有未保存/未指定文件的数据块:",
+"If you exit the program now, you will lose those changes.","如果现在退出,这些更改将丢失",
+"Input Mapping:","输入映射:",
+"Undo","撤销",
+"UDF Manager","UDF 管理",
+"Please select a controller.","请选择一个控制器",
+"Normal","普通",
+"px","px",
+"Information","信息",
+"Width,Height","宽度,高度",
+"Floating Panel:","浮动面板:",
+"Solid Shadow Length","阴影长度",
+"Wire Transparency","线条透明度",
+"Cursor Alpha","指针透明度",
+"Selected Face Transparency","已选择面的透明度",
+"Wire color slices","线条颜色数",
+"Scrolling Speed","滚动速度",
+"Redo","重做",
+"A graphical user interface application toolkit","一个图形界面应用程序框架",
+"Meshes:","网格:",
+"Add Resource Folder","添加资源文件夹",
+"User Interactions:","用户交互:",
+"Enable Translation:","使用翻译:",
+"Active","活动的",
+"Inactive Mix","不活动的",
+"Edit","编辑",
+"Delete Rack","删除挂架",
+"Panel Animation Speed","面板动画速度",
+"Active Theme","当前主题",
+"Panel doesn't have configurable property.","面板没有可调节属性。",
+"Font Size","字符尺寸",
+"Margin Size","留白尺寸",
+"Add Rack","添加挂架",
+"Left,Right,Top,Bottom","左,右,上,下",
+"Tooltip Close Distance","工具提示关闭距离",
+"UDF Manager Default View:","默认UDF管理视图:",
+"Alpha","透明度",
+"Other Entries","其他条目",
+"Interface:","界面:",
+"Settings","设置",
+"New Panel","新面板",
+"Font Size:","字符尺寸:",
+"Border","边框",
+"Accent Color:","亮点颜色:",
+"Wire Saturation","线条饱和度",
+"Text","文字",
+"LaGUI application framework is made by Wu Yiming.","LaGUI应用程序框架由吴奕茗制作。",
+"Refresh Controllers","刷新控制器",
+"Dock","停靠",
+"Panel Multisample:","面板多重采样",
+"Files","文件",
+"None","无",
+"Text Active","文字激活",
+"Shadow Alpha","阴影透明度",
+"Input device handling:","输入设备行为:",
+"Add Node","添加节点",
+"Hide","隐藏",
+"Viewing Texture:","查看贴图:",
+"Stylus Device","手写笔设备",
+"Base Color:","基础颜色:",
+"Margin Size:","留白尺寸:",
+"Eraser Device","橡皮擦设备",
+"Animation Speed","动画速度",
+"File Dialog","选择文件",
+"Row Height:","行高:",
+"Border:","边缘:",
+"Selected Vertex Transparency","已选择点的透明度",
+"Quit","退出",
+"Dump Untranslated Text","导出未翻译的词句",
+"History","历史",
+"Margins:","留白:",
+"Zoom Speed 2D","平面缩放速度",
+"Idle time","静止时间",
+"UDF Extensions:","UDF扩展:",
+"Options","选项",
+"Top Framerate","最高帧率",
+"Goto","前往",
+"Cursor:","光标:",
+"Yes Or No","是/否",
+"Selection Alpha","选择区域透明度",
+"Widgets:","挂件:",
+"Pads/Joysticks:","手柄/操纵杆:",
+"Edge Brightness","边缘亮度",
+"Valuator Threshold","数值挂件拖动阈值",
+"Save as","另存为",
+"Switch Layout","切换布局",
+"Adaptive","自适应",
+"Cancel","取消",
+"File","文件",
+"Show","显示 ",
+"Remove","删除",
+"Wire saggyness","连线松弛程度",
+"Inactive Saturation","未激活饱和度",
+"Get Folder Path","获得文件夹路径",
+"New Window","新窗口",
+"Resource Folders","资源文件夹",
+"Basics:","基础:",
+"Selected Edge Transparency","已选择边的透明度",
+"Read","读取",
+"Wire thickness","线条粗细",
+"Panel Activator","面板激活工具",
+"Data Blocks","数据块",
+"Transparency:","透明度:",
+"Language:","语言:",
+"Wacom Devices:","Wacom 设备:",
+"Move Rack","移动挂架",
+"Yes","是",
+"Interface Size","界面尺寸",
+"Nodes:","节点:",
+"Translation:","翻译:",
+"Delete","删除",
+"(C)Yiming Wu","(C) 吴奕茗",
+"Wire Brightness","连线亮度",
+"Rebuild Input Mapping","重生成输入映射",
+"Save Preferences","保存偏好设置",
+"Close","关闭",
+"Paddings:","外留白:",
+"Function Test","功能测试",
+"Edge Transparency","边透明度",
+"Insert Rack","插入挂架",
+"Line Width:","线宽度:",
+"Add Page","新建页",
+"Viewing","正查看",
+"Controller:","控制器:",
+"Size","尺寸",
+"File Size","文件尺寸",
+"Last Modified On","最后修改于",
+"Resource","资源",
+"New File","新文件",
+"… Bookmarks","… 书签",
+"Bytes","字节",
+"Logic Drives","逻辑驱动器",
+"Folder","文件夹",
+"Confirm","确认",
+"Display","显示",
+"Show","显示",
+"Theme","主题",
+"Input","输入",
+"File Name","文件名",
+"Up","上一级",
+"Device Graphics","设备图形信息",
+"Authors","作者",
+"LaGUI information","LaGUI 信息",
+"Show","显示",
+"Version","版本",
+0,0};
+
+void la_MakeTranslations(){
+    transSetLanguage("zh-CN");
+    for(int i=0;;i++){if(!entries[i*2])break;
+        transNewEntry(entries[i*2],entries[i*2+1]);
+    }
+}

+ 14 - 13
resources/la_widgets.c

@@ -176,7 +176,7 @@ int la_LabelHeight(laUiItem *ui){
     int Wrap=ui->Flags&LA_TEXT_LINE_WRAP;
     if(!Wrap) return 1;
     int rows;
-    tnsStringGetDimension(ui->Display->Ptr, 0, 0, ui->TR-ui->TL, &rows, ui->Flags&LA_TEXT_MONO);
+    tnsStringGetDimension(transLate(ui->Display->Ptr), 0, 0, ui->TR-ui->TL, &rows, ui->Flags&LA_TEXT_MONO);
     return rows;
 }
 int la_SocketGetHeight(laUiItem *ui){
@@ -188,12 +188,12 @@ int la_ColorSelectorGetMinWidth(laUiItem *ui){
 }
 int la_ValueGetMinWidth(laUiItem *ui){
     int ExtraW=0;
-    if(ui->Flags&LA_UI_FLAGS_EXPAND){ ExtraW+=tnsStringGetWidth(ui->PP.LastPs->p->Name,0,0);  }
+    if(ui->Flags&LA_UI_FLAGS_EXPAND){ ExtraW+=tnsStringGetWidth(transLate(ui->PP.LastPs->p->Name),0,0);  }
     return LA_RH*4+ExtraW;
 }
 int la_LabelGetMinWidth(laUiItem *ui){
     laBoxedTheme *bt = *ui->Type->Theme;
-    int strw=tnsStringGetWidth(ui->Display->Ptr, 0, ui->Flags&LA_TEXT_MONO);
+    int strw=tnsStringGetWidth(transLate(ui->Display->Ptr), 0, ui->Flags&LA_TEXT_MONO);
     if(ui->Type==_LA_UI_MENU_ROOT && strw<LA_RH)strw=LA_RH;
     return (strw + bt->LM + bt->RM);
 }
@@ -225,15 +225,15 @@ int la_EnumGetMinWidth(laUiItem *ui){
                 if (ui->Type->OperatorType->ParseArgs){
                     int ico; char buf[256]; buf[0]=0;
                     ui->Type->OperatorType->ParseArgs(ui->Instructions, &ico, buf);
-                    tW = tnsStringGetWidth(buf, 0, ui->Flags&LA_TEXT_MONO) + SharedWidth;
+                    tW = tnsStringGetWidth(transLate(buf), 0, ui->Flags&LA_TEXT_MONO) + SharedWidth;
                 }
             }else{
-                tW = tnsStringGetWidth(ep->Base.Name, 0, ui->Flags&LA_TEXT_MONO) + SharedWidth;
+                tW = tnsStringGetWidth(transLate(ep->Base.Name), 0, ui->Flags&LA_TEXT_MONO) + SharedWidth;
             }
             if (tW > W) W = tW;
         }else{
             for (i = ep->Items.pFirst; i; i = i->Item.pNext){
-                tW = tnsStringGetWidth(i->Name, 0, ui->Flags&LA_TEXT_MONO) + SharedWidth;
+                tW = tnsStringGetWidth(transLate(i->Name), 0, ui->Flags&LA_TEXT_MONO) + SharedWidth;
                 if (i->IconID){ HasIcon=1; }
                 if (tW > W) W = tW;
             }
@@ -266,23 +266,23 @@ int la_ButtonGetMinWidth(laUiItem *ui){
 
     if (ui->PP.LastPs && ui->PP.LastPs->p){
         ap = ui->PP.LastPs->p;
-        label = ap->Base.Name;
+        label = transLate(ap->Base.Name);
         IconID = ap->Base.IconID ? ap->Base.IconID : ap->OperatorType->IconID;
         if (!ap->OperatorType) ap->OperatorType = laGetOperatorType(ap->OperatorID);
     }else{
-        label = ui->AT->Name;
+        label = transLate(ui->AT->Name);
         IconID = ui->AT->IconID;
     }
 
     if (ui->ExtraInstructions){
         if (ui->AT && ui->AT->ParseArgs){
             ui->AT->ParseArgs(ui->Instructions, &IconID, buf);
-            if (buf[0]) label = 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 = buf;
+                if (buf[0]) label = transLate(buf);
             }
         }
     }
@@ -554,7 +554,7 @@ void la_IntDraw(laUiItem *ui, int h){
         }else{
             buf[0] = '\0'; buf2[0] = '\0';
             if(Len==1){ strcat(buf2, transLate(ui->PP.LastPs->p->Name)); }
-            if(i<8)strcat(Len==1?buf:buf2, &prefix[i]);
+            if(i<8)strcat(Len==1?buf:buf2,&prefix[i]);
             strPrintIntAfter(buf, 48, Data[i]);
             strAppend(buf, ui->PP.LastPs->p->Unit ? transLate(ui->PP.LastPs->p->Unit) : "");
         }
@@ -849,13 +849,13 @@ void la_ButtonDraw(laUiItem *ui, int h){
         uint32_t tIconID=0;
         if (ui->AT && ui->AT->ParseArgs){
             ui->AT->ParseArgs(ui->Instructions, &tIconID, buf);
-            if (buf[0]) label = 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 = buf;
+                if (buf[0]) label = transLate(buf);
                 if (tIconID) IconID=tIconID;
             }
         }
@@ -935,6 +935,7 @@ void la_SingleLineStringDraw(laUiItem *ui, int h){
 
     if (line) la_SingleLineStringDrawSelection(ui, ui->L+(NoDecal?0:bt->LM), ui->U, bt, line, ui->Extra->Edit);
 
+    if(ui->PP.LastPs->p->CanTranslate){ temp=transLate(temp); }
     tnsDrawStringAutoM(line?0:temp, line, IsDisabled?laThemeColor(bt,LA_BT_TEXT|LA_UI_DISABLED):laThemeColor(bt,LA_BT_TEXT), ui->L+(NoDecal?0:bt->LM), ui->R-(NoDecal?0:bt->RM), ui->U, ui->Flags);
 }
 void la_MultiStringDraw(laUiItem *ui, int h){