*/}}
Jelajahi Sumber

Save layout in preferences

YimingWu 1 tahun lalu
induk
melakukan
e57a029715
6 mengubah file dengan 74 tambahan dan 30 penghapusan
  1. 3 1
      la_data.c
  2. 1 0
      la_interface.h
  3. 14 7
      la_kernel.c
  4. 1 1
      resources/la_operators.c
  5. 52 19
      resources/la_properties.c
  6. 3 2
      resources/la_templates.c

+ 3 - 1
la_data.c

@@ -3461,7 +3461,9 @@ int laExtractUDF(laUDF *udf, laManagedUDF* mUDF, int Mode, laListHandle *Parent)
                 lstAppendItem(Parent, ucni);
             }
             dbi = SubPP.EndInstance; //la_GetWriteDBInst(SubPP.EndInstance);
-            result = la_ExtractProp(udf, mUDF, &SubPP, dbi, Mode, ucni);
+            result = (SubPP.LastPs&&SubPP.LastPs->p)?
+                la_ExtractProp(udf, mUDF, &SubPP, dbi, Mode, ucni):
+                la_ExtractFakeProp(udf);
             EStatus = result ? result : EStatus;
             laNotifyUsersPP(&SubPP);
             logPrint("    [Done]\n", buf);

+ 1 - 0
la_interface.h

@@ -337,6 +337,7 @@ STRUCTURE(LA){
     laProgressDisplay Progress;
 
     int InitDone;
+    int SavePreferenceOnExit;
 
     laKeyMapper KeyMap;
 

+ 14 - 7
la_kernel.c

@@ -138,8 +138,7 @@ void laShowCursor(){
 void la_XErrorHandler(Display *display, XErrorEvent *event){
     char buf[512];
     XGetErrorText(display, event->error_code, buf, sizeof(buf));
-    printf("X Error:\n%s",buf);
-    return 0;
+    printf("X Error:\n%s\n",buf);
 }
 
 Window la_CreateWindowX11(int x, int y, int w, int h, char *title, int SyncToVBlank, GLXContext* r_glc){
@@ -150,7 +149,7 @@ Window la_CreateWindowX11(int x, int y, int w, int h, char *title, int SyncToVBl
         ButtonMotionMask|ButtonPressMask|ButtonReleaseMask|ExposureMask|PointerMotionMask;
     swa.colormap = MAIN.cmap;
     Window root = DefaultRootWindow(MAIN.dpy);
-    Window win = XCreateWindow(MAIN.dpy, root, x, y, w, h, 0, MAIN.xvi->depth, InputOutput, MAIN.xvi->visual, CWColormap | CWEventMask, &swa);
+    Window win = XCreateWindow(MAIN.dpy, root, x,y, w, h, 0, MAIN.xvi->depth, InputOutput, MAIN.xvi->visual, CWColormap | CWEventMask, &swa);
     XSetWMProtocols(MAIN.dpy , win, &MAIN.MsgDelWindow, 1);
 
     if(x>0||y>0){
@@ -166,7 +165,7 @@ Window la_CreateWindowX11(int x, int y, int w, int h, char *title, int SyncToVBl
     }
 
     XStoreName(MAIN.dpy, win, title);
-    XMapWindow(MAIN.dpy, win);
+    //XMapWindow(MAIN.dpy, win);
     glXMakeCurrent(MAIN.dpy, win, (*r_glc));
 
     int sync=SyncToVBlank?1:0; glXSwapIntervalEXTF(MAIN.dpy, win, sync);
@@ -473,6 +472,8 @@ int laGetReady(){
     MAIN.wmfullscroff=XInternAtom(MAIN.dpy,"_NET_WM_STATE_FULLSCREEN",0);
 
     la_GetWorkingDirectoryInternal();
+
+    MAIN.SavePreferenceOnExit=1;
     
     MAIN.FontSize = 0.6;
     MAIN.UiRowHeight = MAIN.ScaledUiRowHeight =24;
@@ -571,6 +572,7 @@ int laGetReady(){
 }
 
 void laShutoff(){
+    if(MAIN.SavePreferenceOnExit){ laSaveUserPreferences(); }
     transDumpMissMatchRecord("TranslationDump.txt");
 
     if(MAIN.Cleanup) MAIN.Cleanup();
@@ -617,6 +619,7 @@ void laShutoff(){
 void laSaveUserPreferences(){
     char path[1024]; sprintf(path,"%s%s",MAIN.WorkingDirectory->Ptr,"preferences.udf");
     laUDF* udf=laPrepareUDF(path);
+    laWriteProp(udf,"la.windows");
     laWriteProp(udf,"la.user_preferences");
     for(laListItemPointer* lip=MAIN.ExtraPreferencePaths.pFirst;lip;lip=lip->pNext){
         laWriteProp(udf,lip->p);
@@ -711,13 +714,15 @@ void la_RecalcBlockRecursive(laBlock *b, int X, int Y, int W, int H){
 
     //if (!b->CurrentPanel)b->CurrentPanel = b->Panels.pFirst;
 
+    for(p=b->Panels.pFirst;p;p=p->Item.pNext){
+        p->TitleWidth = tnsStringGetWidth(transLate(p->Title->Ptr), 0, 0);
+    }
     if (p = b->CurrentPanel){
         int TitleGap=b->Folded?0:LA_RH;
         p->X = X + LA_SEAM_W; p->Y = Y + LA_SEAM_W + TitleGap;
         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(transLate(p->Title->Ptr), 0, 0);
     }
 }
 void la_UpdateUiPlacement(laWindow *w){
@@ -1837,12 +1842,14 @@ void la_WindowDefDraw(laWindow *w, laBoxedTheme *bt){
 }
 int laStartWindow(laWindow *w){
     //ShowWindow(w->win, SW_SHOWNORMAL);
+    XMapWindow(MAIN.dpy,w->win);
     glXMakeContextCurrent(MAIN.dpy, w->win,w->win, w->glc);
     MAIN.CurrentWindow = w;
     if(!w->CurrentLayout){
         if(!w->Layouts.pFirst){laDesignLayout(w, "Empty Layout");}
         w->CurrentLayout=w->Layouts.pFirst;
     }
+    laRedrawCurrentWindow();
     laInvokeUi(0, "LA_window_operator", 0, w, 0, 0);
     w->Shown = 1;
 }
@@ -1854,7 +1861,7 @@ void la_AssignWindowPP(laWindow* w){
     w->PP.LastPs->Type = L'.';
 }
 laWindow *laDesignWindow(int X, int Y, int W, int H){
-    laWindow *n = memAcquireHyper(sizeof(laWindow));
+    laWindow *n = memAcquire(sizeof(laWindow));
 
     strSafeSet(&n->Title, "Empty Window");
     n->X = X; n->Y = Y; n->W = W; n->H = H;
@@ -2030,7 +2037,7 @@ laPanel* laTearOffPanel(laBlock* b, laPanel* p_if_set){
     }
 
     if(!p->TitleBar.UiItems.pFirst){
-        laui_DefaultPanelTitleBar(&p->TitleBar, &p->PP, &p->PropLinkPP, p->PanelTemplate->Header);
+        laui_DefaultPanelTitleBar(&p->TitleBar, &p->PP, &p->PropLinkPP, p->PanelTemplate?p->PanelTemplate->Header:0);
     }
 
     p->Mode = LA_PANEL_FLOATING_TOP;

+ 1 - 1
resources/la_operators.c

@@ -1073,7 +1073,7 @@ int OPCHK_BlockHasMorePanels(laPropPack *This, laStringSplitor *Instructions){
 
     laLayout *l = MAIN.CurrentWindow->CurrentLayout;
     laBlock *b = l->OperatingBlock;
-    if (b->Panels.pFirst == b->Panels.pLast) return 0;
+    if (b && b->Panels.pFirst == b->Panels.pLast) return 0;
     return 1;
 }
 int OPINV_BlockClosePanel(laOperator *a, laEvent *e){

+ 52 - 19
resources/la_properties.c

@@ -299,7 +299,10 @@ 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(transLate(p->Title->Ptr), 0,0);
+}
+void laread_PanelTitle(laPanel *p, char *content){
+    strSafeSet(&p->Title, content);
 }
 void laset_PanelSnapDistance(laPanel *p, int index, int n){
     int a;
@@ -600,10 +603,15 @@ void laget_PanelTemplateCategory(void* rack_unused, laUiTemplate* uit, char* cop
 }
 
 void lapost_Window(laWindow *w){
-    la_CreateSystemWindow(w);
-    MAIN.CurrentWindow = w;
     laStartWindow(w);
 }
+int la_CreateSystemWindow(laWindow *window, int synctovbank);
+void lapostim_Window(laWindow *w){
+    w->IsFullScreen=0;
+    la_CreateSystemWindow(w,MAIN.Windows.pFirst==MAIN.Windows.pLast);
+    la_AssignWindowPP(w);
+    MAIN.CurrentWindow = w;
+}
 void lapost_PropPack(laPropPack *pp){
     char *path = pp->Go;
     if (pp->LastPs /* || !path*/) return;
@@ -623,6 +631,14 @@ void lapostim_UiItem(laUiItem *ui){
 
     la_AssignPropExtras(ui);
 }
+void* laget_SavePanel(laWindow* w, laPropIterator* pi){
+    for(laPanel* p=w->Panels.pFirst;p;p=p->Item.pNext){ if(!p->Mode || p->IsMenuPanel || p->PanelTemplate) return p; }
+    return 0;
+}
+void* lagetnext_SavePanel(laPanel* p, laPropIterator* pi){
+    for(p=p->Item.pNext;p;p=p->Item.pNext){ if(!p->Mode || p->IsMenuPanel || p->PanelTemplate) return p; }
+    return 0;
+}
 void lapost_Panel(laPanel *p){
     p->PP.EndInstance = p;
     p->PP.LastPs = &p->FakePS;
@@ -631,6 +647,17 @@ void lapost_Panel(laPanel *p){
     la_EnsurePanelExtras(p);
 
     p->Refresh = LA_TAG_RECALC;
+    p->FrameDistinguish = 100;
+
+    laUiTemplate* uit=p->PanelTemplate;
+    if(uit&&uit->PropFunc){ uit->PropFunc(p); }
+    if(uit){
+        uit->Define(&p->UI, &p->PP, &p->PropLinkPP, 0, 0);
+        if(p->Mode) laui_DefaultPanelTitleBar(&p->TitleBar, &p->PP, &p->PropLinkPP, uit->Header);
+    }
+    if(p->IsMenuPanel){ laui_DefaultMenuBarActual(&p->TitleBar, &p->PP, &p->PropLinkPP, 0, 0); }
+    if(p->Title) p->TitleWidth = tnsStringGetWidth(transLate(p->Title->Ptr), 0, 0);
+    XSync(MAIN.dpy,1);
 }
 void lapost_UserPreferences(void* unused){
     MAIN.ScaledUiRowHeight=MAIN.UiRowHeight;
@@ -877,8 +904,7 @@ 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);
 
@@ -938,15 +964,15 @@ void la_RegisterInternalProps(){
         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);
+            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);
             
-            _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 inside this application", "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);
             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);
@@ -1104,6 +1130,10 @@ void la_RegisterInternalProps(){
                 laAddEnumItemAs(ep, "DATA_BLOCKS", "Data Blocks", "All data blocks", 0,0);
                 laAddEnumItemAs(ep, "FILES", "Files", "All Files", 1, 0);
             }
+            ep = laAddEnumProperty(p, "save_preferences_on_exit", "Save On Exit", "Save user preferences before exiting the program", 0,0,0,0,0,offsetof(LA, SavePreferenceOnExit), 0,0,0,0,0,0,0,0,0,0);{
+                laAddEnumItemAs(ep, "NONE", "Don't save", "Not saving user preferences on exit", 0,0);
+                laAddEnumItemAs(ep, "SAVE", "Save", "Saving user preferences on exit", 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);
@@ -1121,18 +1151,18 @@ void la_RegisterInternalProps(){
 
         // UI WINDOW ========================================================================================
 
-        p = laAddPropertyContainer("ui_window", "Window Node", "Property Container For A System Window", 0,laui_SubPropInfoDefault, sizeof(laWindow), lapost_Window, 0,2);{
+        p = laAddPropertyContainer("ui_window", "Window Node", "Property Container For A System Window", 0,0, sizeof(laWindow), lapost_Window, lapostim_Window,1);{
             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_PROP_PANEL = laAddSubGroup(p, "panels", "Panels", "Panel list of this window", "ui_panel",0,0,0,-1,laget_SavePanel,0,lagetnext_SavePanel,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, "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|LA_UDF_IGNORE);
+            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|LA_UDF_IGNORE);
             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);
+            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|LA_UDF_IGNORE);
             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);
@@ -1146,7 +1176,7 @@ void la_RegisterInternalProps(){
 
         // UI LAYOUT ========================================================================================
 
-        p = laAddPropertyContainer("ui_block", "Layout Node", "Property Container For Single Layout", 0,laui_LayoutListItem, sizeof(laBlock), 0,0,0);{
+        p = laAddPropertyContainer("ui_block", "Layout Node", "Property Container For Single Layout", 0,laui_LayoutListItem, sizeof(laBlock), 0,0,1);{
             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);
@@ -1155,6 +1185,7 @@ void la_RegisterInternalProps(){
             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);
+            laAddSubGroup(p, "parent", "Parent", "Parent block reference", "ui_block",0,0,0,offsetof(laBlock, parent), 0,0,0,0,0,0,0,LA_UDF_REFER);
             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);
         }
@@ -1168,7 +1199,7 @@ void la_RegisterInternalProps(){
         // 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|LA_TRANSLATE);
+            laAddStringProperty(p, "title", "Title", "The Title/Name Of A Panel", 0,0,0,0,1, offsetof(laPanel, Title), 0,0,laset_PanelTitle, laread_PanelTitle,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);
@@ -1188,11 +1219,13 @@ void la_RegisterInternalProps(){
             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, "uil","Ui List", "Panel Main Ui List", "ui_list",0,0,0,offsetof(laPanel, UI), 0,0,0,0,0,0,0,LA_UDF_IGNORE);
+            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,LA_UDF_IGNORE);
+            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|LA_UDF_IGNORE);
+            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|LA_UDF_IGNORE);
+            laAddSubGroup(p, "parent_block","Parent Block", "The Block That Directly Links This Panel In", "ui_block",0,0,0,offsetof(laPanel, Block), 0,0,0,0,0,0,0,LA_UDF_REFER|LA_UDF_IGNORE);
+            laAddSubGroup(p, "template","Template", "Panel template", "panel_template",0,0,0,offsetof(laPanel, PanelTemplate), 0,0,0,0,0,0,0,LA_UDF_REFER);
+            laAddSubGroup(p, "block", "Block", "Block reference of this panel", "ui_block",0,0,0,offsetof(laPanel, Block), 0,0,0,0,0,0,0,LA_UDF_REFER);
         }
 
         // UI ITEM ==========================================================================================

+ 3 - 2
resources/la_templates.c

@@ -831,8 +831,6 @@ void laui_UiTemplateListItem(laUiList *uil, laPropPack *Base, laPropPack *UNUSED
     laEndCondition(uil, bracket);
 }
 
-int la_CreateSystemWindow(laWindow *window);
-
 void tnsui_GroupItem(laUiList *uil, laPropPack *Base, laPropPack *UNUSED_This, laColumn *UNUSED_Colums, int context){
     laColumn *col, *cl, *cr, *crl, *crr;
     laUiItem *b1;
@@ -1231,6 +1229,9 @@ void laui_UserPreference(laUiList *uil, laPropPack *Base, laPropPack *OperatorIn
     //p->Show = 0;
     //p->FastUpdate = 1;
 
+    b=laBeginRow(uil,cl,0,0); laUiItem* ui=laShowLabel(uil,cl,"Save on exit:",0,0); ui->Expand=1; ui->Flags|=LA_TEXT_ALIGN_RIGHT;
+    laShowItemFull(uil,cl,0,"la.user_preferences.save_preferences_on_exit",LA_WIDGET_ENUM_HIGHLIGHT,"text=🞆",0,0);
+    laEndRow(uil,b);
     laShowItem(uil,cr,0,"LA_save_user_preferences");
 
     bracket = laMakeTab(uil, c, 0);{