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

instance clean and panel default sizes

YimingWu 1 rok temu
rodzic
commit
c295590e7f
9 zmienionych plików z 80 dodań i 46 usunięć
  1. 11 10
      la_data.c
  2. 4 3
      la_interface.h
  3. 10 9
      la_kernel.c
  4. 2 1
      la_tns.h
  5. 7 2
      la_tns_kernel.c
  6. 9 6
      resources/la_operators.c
  7. 15 0
      resources/la_properties.c
  8. 15 9
      resources/la_templates.c
  9. 7 6
      resources/la_widgets.c

+ 11 - 10
la_data.c

@@ -2945,7 +2945,7 @@ laPtrSyncCommand *la_AddPtrSyncCommand(void *ReadRefer, void *ParentInst, char *
     return psc;
 }
 
-void la_ResetInstance(void* inst, laPropContainer* pc);
+void la_ResetInstance(void* inst, laPropContainer* pc, int IsListItem);
 void laRequestAdditionalRegistry(laUDFRegistry* r);
 laUDFOwnHyperItem* laNewHyperResource(char* uid);
 laUDFOwnHyperItem* laFindHyperResource(char* uid);
@@ -3146,7 +3146,7 @@ int la_ExtractProp(laUDF *udf, laManagedUDF* mUDF, laPropPack *pp, void *ParentI
 
                 Instance = laGetInstance(p, pp->LastPs->UseInstance, &PI);
 
-                la_ResetInstance(Instance, p->SubProp);
+                la_ResetInstance(Instance, p->SubProp,0);
 
                 if (ItemType == LA_UDF_HYPER_ITEM){
                     if (p->SubProp->Hyper == 2){
@@ -3207,16 +3207,17 @@ int la_ExtractProp(laUDF *udf, laManagedUDF* mUDF, laPropPack *pp, void *ParentI
 
                     int replaced=0;
                     if (udf){
+                        int IsItem=((laSubProp*)p)->ListHandleOffset?1:0;
                         RealSize = RealSize ? RealSize : p->SubProp->NodeSize;
                         if (!Parent && !IsExceptionNode){
-                            if (p->UDFIsSingle && pp->EndInstance){ Instance = pp->EndInstance; la_ResetInstance(Instance, pc); replaced=1; }
+                            if (p->UDFIsSingle && pp->EndInstance){ Instance = pp->EndInstance; la_ResetInstance(Instance, pc, IsItem); replaced=1; }
                             else{
                                 // if overwrite, find the instance here for hyper2, if not hyper 2 then notice can't overwrite.
                                 if (pc->Hyper == 2){
                                     if(Mode==LA_UDF_MODE_OVERWRITE && ItemType == LA_UDF_HYPER_ITEM){
                                         laUID uid; la_PeekHyperUID(udf, &uid.String);
                                         Instance = la_GetReadDBInstNUID(uid.String);
-                                        if(Instance){ la_ResetInstance(Instance, pc); replaced=1; }
+                                        if(Instance){ la_ResetInstance(Instance, pc,IsItem); replaced=1; }
                                         else{ /*logPrint("[Note] Hyper2 item [%s] from property '%s' hasn't been loaded yet, will append.\n", uid.String, p->Identifier);*/ }
                                     }
                                     if(!Instance) Instance = memAcquireHyperNoAppend(RealSize);
@@ -3227,7 +3228,7 @@ int la_ExtractProp(laUDF *udf, laManagedUDF* mUDF, laPropPack *pp, void *ParentI
                         }
 
                         if (ItemType == LA_UDF_HYPER_ITEM){
-                            if (pc->Hyper == 2){
+                            if (pc->Hyper == 2 && Mode==LA_UDF_MODE_OVERWRITE){
                                 la_ReadHyperData(udf, Instance);
                                 if(mUDF) memAssignRef(Instance, &((laMemNodeHyper*)memGetHead(Instance, 0))->FromFile, mUDF);
                             }
@@ -4276,9 +4277,9 @@ void la_FreeInstance(void* inst, laPropContainer* pc, int no_free){
     }
     if(!no_free && !pc->OtherAlloc) memFree(inst);
 }
-void la_ResetInstance(void* inst, laPropContainer* pc){
-    if(pc->SaverDummy) 
-    if(pc->Reset) pc->Reset(inst); else memset(inst,0,pc->NodeSize);
+void la_ResetInstance(void* inst, laPropContainer* pc, int IsListItem){
+    if(pc->SaverDummy) laMarkMemClean(((char*)inst)+((laSubProp*)pc->SaverDummy)->ListHandleOffset);
+    if(pc->Reset) pc->Reset(inst); //else { int a=IsListItem?sizeof(laListItem):0; memset(((char*)inst)+a,0,pc->NodeSize-a); }
 }
 
 laListHandle* la_GetOriginalListHandle(laDiffCommandSub* dcs){
@@ -4292,7 +4293,7 @@ laListHandle* la_GetOriginalListHandle(laDiffCommandSub* dcs){
 void la_UndoListDifferences(laDBSubProp* dsp, laDiffCommandSub* dcs){
     laListHandle* ol=la_GetOriginalListHandle(dcs);
     for(laDiffCommandInst* dci=dcs->AddedInst.pFirst;dci;dci=dci->Item.pNext){
-        if(dcs->Base.p->UDFNoCreate){ la_ResetInstance(dci->DBInst->OriginalInstance,dci->DBInst->pc); continue; }
+        if(dcs->Base.p->UDFNoCreate){ la_ResetInstance(dci->DBInst->OriginalInstance,dci->DBInst->pc,((laSubProp*)dcs->Base.p)->ListHandleOffset?1:0); continue; }
         dci->OriginalPrev = dci->DBInst->Item.pPrev; dci->OriginalNext = dci->DBInst->Item.pNext;
         //if(dsp->Instances.pFirst == dci->DBInst){ dsp->Instances.pFirst=dci->DBInst->Item.pNext; ol->pFirst=dci->DBInst->Item.pNext?((laDBInst*)dci->DBInst->Item.pNext)->OriginalInstance:0; }
         //if(dsp->Instances.pLast == dci->DBInst){ dsp->Instances.pLast=dci->DBInst->Item.pPrev; ol->pLast=dci->DBInst->Item.pPrev?((laDBInst*)dci->DBInst->Item.pPrev)->OriginalInstance:0; }
@@ -4324,7 +4325,7 @@ void la_UndoListDifferences(laDBSubProp* dsp, laDiffCommandSub* dcs){
 void la_RedoListDifferences(laDBSubProp* dsp, laDiffCommandSub* dcs){
     laListHandle* ol=la_GetOriginalListHandle(dcs);
     for(laDiffCommandInst* dci=dcs->RemovedInst.pFirst;dci;dci=dci->Item.pNext){
-        if(dcs->Base.p->UDFNoCreate){ la_ResetInstance(dci->DBInst->OriginalInstance,dci->DBInst->pc); continue; }
+        if(dcs->Base.p->UDFNoCreate){ la_ResetInstance(dci->DBInst->OriginalInstance,dci->DBInst->pc,((laSubProp*)dcs->Base.p)->ListHandleOffset?1:0); continue; }
         //dci->OriginalPrev = dci->DBInst->Item.pPrev;
         //dci->OriginalNext = dci->DBInst->Item.pNext;
         lstRemoveItem(&dsp->Instances, dci->DBInst); lstRemoveItem(ol, dci->DBInst->OriginalInstance); 

+ 4 - 3
la_interface.h

@@ -439,8 +439,7 @@ STRUCTURE(LA){
     //preference:
 
     //color
-    int ColorAccessCorrectGamma;
-    real Gamma;
+    real ColorPickerGamma;
     int NextWireColor, WireColorSlices;
     real WireThickness;
     real WireSaggyness;
@@ -916,6 +915,7 @@ STRUCTURE(laUiTemplate){
     laUiDefineFunc          Header;
     laPanelDetachedPropFunc PropFunc;
     int DefaultGLFormat;
+    int DefaultW_RH,DefaultH_RH;
     laKeyMapper KeyMap;
 };
 
@@ -1707,6 +1707,7 @@ STRUCTURE(laUDFPreviewExtra){
     laUDF *UDF;
     laListHandle ContentNodes;
     int Opened;
+    int Append;
 };
 
 STRUCTURE(laManagedSaveExtra){
@@ -1900,7 +1901,7 @@ laUiTemplate *laFindUiTemplate(char *Identifier);
 
 void la_DestroyUiTemplate(laUiTemplate* uit);
 void la_DestroyCanvasTemplate(laCanvasTemplate* uit);
-laUiTemplate *laRegisterUiTemplate(char *Identifier, char* Title, laUiDefineFunc func,laPanelDetachedPropFunc PropFunc, laUiDefineFunc header, char* NewCategory, int DefaultGLFormat);
+laUiTemplate *laRegisterUiTemplate(char *Identifier, char* Title, laUiDefineFunc func,laPanelDetachedPropFunc PropFunc, laUiDefineFunc header, char* NewCategory, int DefaultGLFormat, int DefaultW_RH, int DefaultH_RH);
 laCanvasTemplate *laRegisterCanvasTemplate(char *Identifier, char *ForContainer, laModalFunc ExtraModal, laCanvasDrawFunc Func, laUiDrawFunc SecondDraw, laUiInitFunc CustomInit, laUiDestroyFunc CustomDestroy);
 
 void laGet2DViewRange(laCanvasExtra *e, int *L, int *R, int *U, int *B);

+ 10 - 9
la_kernel.c

@@ -466,15 +466,14 @@ int laGetReady(){
 	if(MAIN.UTF8 == None) MAIN.UTF8 = XA_STRING;
 
     la_GetWorkingDirectoryInternal();
-    //laSetAuthorInfo("YimingWu", "(C)Nick'sBest");
-
-    //transInitTranslation_zh_cn();
-    //transState(0, 1); //enable translation
+    
     MAIN.FontSize = 0.6;
     MAIN.UiRowHeight = MAIN.ScaledUiRowHeight =24;
     MAIN.UiScale=1;
     MAIN.MarginSize = 1;
 
+    MAIN.ColorPickerGamma=1.5;
+
     tnsInitRenderKernel(64);
     tnsInitBuiltinShaders();
 
@@ -2099,6 +2098,9 @@ laPanel *la_NewPanel(laUiTemplate* uit, int X, int Y, int W, int H, int MaxW, in
     int CH = MAIN.CurrentWindow->CH;
     p->PanelTemplate = uit;
 
+    if((!W) && uit)W=uit->DefaultW_RH*LA_RH;
+    if((!H) && uit)H=uit->DefaultH_RH*LA_RH;
+
     if (!MaxW) MaxW = 10000;
     if (!MaxH) MaxH = 10000;
 
@@ -2241,7 +2243,7 @@ void laHidePanelWithMinimizeEffect(laPanel *p){
 void laActivatePanel(char* TemplateID, int x, int y){
     laUiTemplate* uit = laFindUiTemplate(TemplateID);
     laPanel *p = la_FindFreePanelByTemplate(MAIN.CurrentWindow, uit);
-    if (!p){ p=laCreateTopPanel(MAIN.CurrentWindow, TemplateID, x, y, 400,400, 0, 0, 0, 0, 0, 0, 0, 0); }
+    if (!p){ p=laCreateTopPanel(MAIN.CurrentWindow, TemplateID, x, y, 0,0, 0, 0, 0, 0, 0, 0, 0, 0); }
     laShowPanelWithExpandEffect(p); laPopPanel(p);
 }
 void laPanPanel(laPanel *p, int DeltaX, int DeltaY){
@@ -3967,15 +3969,14 @@ void la_DestroyCanvasTemplate(laCanvasTemplate* uit){
     laKeyMapItem* kmi; while(kmi=lstPopItem(&uit->KeyMapper.Items)){ la_FreeKeyMapItem(kmi); }
     memFree(uit);
 }
-laUiTemplate *laRegisterUiTemplate(char *Identifier, char* Title, laUiDefineFunc func,laPanelDetachedPropFunc PropFunc, laUiDefineFunc header, char* NewCategory, int DefaultGLFormat){
+laUiTemplate *laRegisterUiTemplate(char *Identifier, char* Title, laUiDefineFunc func,laPanelDetachedPropFunc PropFunc, laUiDefineFunc header, char* NewCategory, int DefaultGLFormat, int DefaultW_RH, int DefaultH_RH){
     laUiTemplate *uit = memAcquire(sizeof(laUiTemplate));
     strSafeSet(&uit->Identifier, Identifier);
     strSafeSet(&uit->Title, Title);
     strSafeSet(&uit->CategoryName, NewCategory);
-    uit->Define = func;
-    uit->Header = header;
-    uit->PropFunc = PropFunc;
+    uit->Define = func; uit->Header = header; uit->PropFunc = PropFunc;
     uit->DefaultGLFormat=DefaultGLFormat;
+    uit->DefaultH_RH=DefaultH_RH?abs(DefaultH_RH):15; uit->DefaultW_RH=DefaultW_RH?abs(DefaultW_RH):15;
     if(MAIN.InitDone) lstAppendItem(&MAIN.PanelTemplates, uit); else lstAppendItem(&MAIN.InitPanelTemplates, uit);
     la_UDFAppendSharedTypePointer(Identifier, uit);
     return uit;

+ 2 - 1
la_tns.h

@@ -85,7 +85,7 @@ struct _tnsShader{
     int iTexColor,iTexNormal,iTexGPos;
     int iTexColorMS;
     int iMultiplyColor, StateMultiplyColor;
-    int iTextureMode, StateTextureMode, iColorMode;
+    int iTextureMode, StateTextureMode, iColorMode,iHCYGamma;
     int iSampleAmount, StateSampleAmount;
     int iInputColorSpace, iOutputColorSpace, iShowStripes;
 
@@ -1238,6 +1238,7 @@ void tnsBindTexture(tnsTexture *t);
 void tnsUnbindTexture();
 void tnsUniformUseTexture(tnsShader* s, int mode, int sample);
 void tnsUniformColorMode(tnsShader* s, int mode);
+void tnsUniformHCYGamma(tnsShader* s, float Gamma);
 void tnsUniformInputColorSpace(tnsShader* s, int ColorSpace);
 void tnsUniformOutputColorSpace(tnsShader* s, int ColorSpace);
 void tnsUniformShowColorOverflowStripes(tnsShader* s, int Show);

+ 7 - 2
la_tns_kernel.c

@@ -112,6 +112,7 @@ uniform int UseNormal;\n\
 uniform int InputColorSpace;\n\
 uniform int OutputColorSpace;\n\
 uniform int ShowStripes;\n\
+uniform float HCYGamma;\n\
 uniform vec3 uViewPos;\n\
 in vec4 fColor;\n\
 in vec2 fUV;\n\
@@ -127,13 +128,13 @@ vec3 ConvertColorSpace(vec3 color){\n\
             if(InputColorSpace==0) color=to_linear_srgb(color);\n\
             else if(InputColorSpace==1) color=to_linear_clay(color);\n\
         } \n\
-        vec3 xyz; if(ColorMode==1){ color=okhsl_to_linear_srgb(color); }\n\
+        vec3 xyz; if(ColorMode==1){ color.y=pow(color.y,max(HCYGamma,1)); color=okhsl_to_linear_srgb(color); }\n\
         if(InputColorSpace==1){ xyz=Clay2XYZ(color); }\n\
         if(InputColorSpace==0){ xyz=sRGB2XYZ(color); }\n\
         if(OutputColorSpace==0){ color=to_log_srgb(XYZ2sRGB(xyz)); }\n\
         if(OutputColorSpace==1){ color=to_log_clay(XYZ2Clay(xyz)); }\n\
     }else{\n\
-        if(ColorMode==1){ color=okhsl_to_srgb(color); }\n\
+        if(ColorMode==1){ color.y=pow(color.y,max(HCYGamma,1)); color=okhsl_to_srgb(color); }\n\
         else if(ColorMode==0){ color=color; }\n\
         else{\n\
             if(OutputColorSpace==0){ color=to_log_srgb(color); }\n\
@@ -544,6 +545,7 @@ void tnsShaderMakeIndex(tnsShader *tns){
     tns->iMultiplyColor = glGetUniformLocation(program, "MultiplyColor");
     tns->iTextureMode = glGetUniformLocation(program, "TextureMode");
     tns->iColorMode = glGetUniformLocation(program, "ColorMode");
+    tns->iHCYGamma = glGetUniformLocation(program, "HCYGamma");
     tns->iSampleAmount = glGetUniformLocation(program, "SampleAmount");
     tns->iUseNormal = glGetUniformLocation(program, "UseNormal");
     tns->iOutputColorSpace=glGetUniformLocation(program, "OutputColorSpace");
@@ -2055,6 +2057,9 @@ void tnsUniformUseMultiplyColor(tnsShader* s, int enable){
 void tnsUniformColorMode(tnsShader* s, int mode){
     glUniform1i(s->iColorMode,mode);
 }
+void tnsUniformHCYGamma(tnsShader* s, float Gamma){
+    glUniform1f(s->iHCYGamma,Gamma);
+}
 void tnsUniformInputColorSpace(tnsShader* s, int ColorSpace){
     glUniform1i(s->iInputColorSpace,ColorSpace);
 }

+ 9 - 6
resources/la_operators.c

@@ -489,19 +489,21 @@ int OPEXT_UDFOperation(laOperator *a, laEvent *e){
     }
     memFree(upe);
 }
-int OPINV_UDFAppend(laOperator *a, laEvent *e){
+int OPINV_UDFRead(laOperator *a, laEvent *e){
     laInvoke(a, "LA_file_dialog", e, 0, "filter_type=1;", 0);
     a->CustomData = memAcquireSimple(sizeof(laUDFPreviewExtra));
+    laUDFPreviewExtra *upe = a->CustomData;
+    if(strArgumentMatch(a->ExtraInstructionsP,"mode","append")){ upe->Append=1; }
     return LA_RUNNING;
 }
-int OPMOD_UDFAppend(laOperator *a, laEvent *e){
+int OPMOD_UDFRead(laOperator *a, laEvent *e){
     laUDFPreviewExtra *upe = a->CustomData;
     if (a->ConfirmData){
         if (a->ConfirmData->StrData){
             laManagedUDF* m;
             upe->UDF = laOpenUDF(a->ConfirmData->StrData, 1, 0, &m);
             if (upe->UDF){
-                laExtractUDF(upe->UDF, m, LA_UDF_MODE_OVERWRITE, 0);
+                laExtractUDF(upe->UDF, m, upe->Append?LA_UDF_MODE_APPEND:LA_UDF_MODE_OVERWRITE, 0);
                 laCloseUDF(upe->UDF);
                 laRecordEverythingAndPush();
                 return LA_FINISHED;
@@ -984,7 +986,7 @@ int OPINV_NewLayout(laOperator *a, laEvent *e){
 int OPINV_NewPanel(laOperator *a, laEvent *e){
     laNewPanelData* np= CreateNew(laNewPanelData);
     a->CustomData = np;
-    laEnableOperatorPanel(a, 0, e->x-50,e->y-50,500,500,1000,0,0,0,0,0,0,0,e);
+    laEnableOperatorPanel(a, 0, e->x-50,e->y-50,500,500,10000,0,0,0,0,0,0,0,e);
     return LA_RUNNING;
 }
 int OPMOD_NewPanel(laOperator *a, laEvent *e){
@@ -999,7 +1001,7 @@ int OPMOD_NewPanel(laOperator *a, laEvent *e){
         if (!np || !np->SelectedTemplate) return LA_CANCELED;
         laPanel *p = la_FindFreePanelByTemplate(MAIN.CurrentWindow, np->SelectedTemplate);
         if (!p){
-            p = laCreateTopPanel(MAIN.CurrentWindow, np->SelectedTemplate->Identifier->Ptr, e->x, e->y,400,400,0,0,0,0,0,0,0,0);
+            p = laCreateTopPanel(MAIN.CurrentWindow, np->SelectedTemplate->Identifier->Ptr, e->x, e->y,0,0,0,0,0,0,0,0,0,0);
         }
         laShowPanelWithExpandEffect(p); laPopPanel(p); free(np);
         return LA_FINISHED;
@@ -1416,6 +1418,7 @@ int OPINV_SwitchLayout(laOperator *a, laEvent *e){
     la_StopAllOperators();
     laRetriggerOperators();
 
+    laRedrawCurrentWindow();
     laNotifyUsers("la.windows.layouts");
 
     return LA_FINISHED;
@@ -2105,7 +2108,7 @@ void la_RegisterBuiltinOperators(){
         laAddStringProperty(p, "path", "Path", "Bookmark path", 0, 0, 0, 0, 0, offsetof(laBookmarkedFolder, Path), 0, 0, 0, 0, LA_UDF_LOCAL);
     }
     
-    at = laCreateOperatorType("LA_udf_read", "Read", "Read a UDF file", 0, 0, OPEXT_UDFOperation, OPINV_UDFAppend, OPMOD_UDFAppend, L'📑', LA_ACTUATOR_SYSTEM);
+    at = laCreateOperatorType("LA_udf_read", "Read", "Read a UDF file", 0, 0, OPEXT_UDFOperation, OPINV_UDFRead, OPMOD_UDFRead, L'📑', LA_ACTUATOR_SYSTEM);
     pc = laDefineOperatorProps(at, 0);
     at->UiDefine = laui_LinkerPanel;
     laAddSubGroup(pc, "root_nodes", "UDF Nodes", "List Of All Linkable/Appendable Nodes In The File", "udf_content_node",0, 0, laui_LinkerSelectionProp, -1, 0, 0, 0, 0, 0, 0, offsetof(laUDFPreviewExtra, ContentNodes), 0);

+ 15 - 0
resources/la_properties.c

@@ -636,6 +636,9 @@ void lapost_UserPreferences(void* unused){
     MAIN.ScaledUiRowHeight=MAIN.UiRowHeight;
     tnsInvalidateFontCache();
 }
+void laset_ColorPickerGamma(void* unused, real gamma){
+    MAIN.ColorPickerGamma=gamma; laRedrawCurrentWindow();
+}
 
 //void laget_DetachedPropContainerID(laProp* p, char * result) {
 //	strcpy(result, p->Detached->Container->Identifier);
@@ -847,6 +850,15 @@ void la_RegisterGeneralProps(){
     laAddOperatorProperty(p, "save_instance", "Save Instance", "Save instance as a udf block", "LA_udf_save_instance", 0,0);
 }
 
+void lareset_RackPage(laRackPage* rp){
+    laNodeRack* r; while(r=rp->Racks.pFirst){
+        laBaseNode* bn; while(bn=r->Nodes.pFirst){
+            bn->Type->Destroy(bn); lstRemoveItem(&r->Nodes,bn);
+        }
+        lstRemoveItem(&r->ParentPage->Racks, r); memLeave(r);
+    }
+}
+
 void la_RegisterInternalProps(){
     laPropContainer *p, *ip, *p2, *ip2, *sp1, *sp2;
     laProp *ep;
@@ -975,6 +987,7 @@ void la_RegisterInternalProps(){
         }
 
         p = laAddPropertyContainer("la_rack_page", "Rack Page", "A page of nodes", 0,laui_IdentifierOnly, sizeof(laRackPage), 0,0,2);{
+            laPropContainerExtraFunctions(p,0,lareset_RackPage,0,0,0);
             laAddStringProperty(p, "name", "Name", "Name of the page", 0,0,0,0,1, offsetof(laRackPage, Name), 0,0,0,0,LA_AS_IDENTIFIER);
             laAddIntProperty(p,"type", "Type", "Type of the rack", 0,0,0,0,0,0,0,0,offsetof(laRackPage,RackType),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
             laAddIntProperty(p,"has_rack", "Has Rack", "Has rack", 0,0,0,0,0,0,0,0,offsetof(laRackPage,Racks.pFirst),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY|LA_UDF_IGNORE);
@@ -1094,6 +1107,8 @@ void la_RegisterInternalProps(){
         
             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);
+
+            laAddFloatProperty(p, "color_picker_gamma", "Color Picker Gamma", "Allows less saturated colors to have more areas", 0,0,0,3.0,1.0, 0.05,1.5, 0,offsetof(LA, ColorPickerGamma), 0,laset_ColorPickerGamma,0,0,0,0,0,0,0,0,0);
         }
 
         p = laAddPropertyContainer("la_translation_language", "Language", "Translation language pack", 0,0,sizeof(laTranslationNode), 0,0,1);{

+ 15 - 9
resources/la_templates.c

@@ -486,6 +486,7 @@ void laui_DefaultMenuButtonsFileEntries(laUiList *uil, laPropPack *pp, laPropPac
     laShowItem(uil, c, 0, "LA_pure_yes_no");
     laShowItem(uil, c, 0, "LA_file_dialog");
     laShowItem(uil, c, 0, "LA_udf_read");
+    laShowItemFull(uil, c, 0, "LA_udf_read",0,"mode=append;text=Append",0,0);
     laShowItem(uil, c, 0, "LA_managed_save");
     laShowItem(uil, c, 0, "LA_manage_udf");
 
@@ -1255,6 +1256,11 @@ void laui_UserPreference(laUiList *uil, laPropPack *Base, laPropPack *OperatorIn
 
             laShowSeparator(muil, mc);
 
+            laShowLabel(muil, mc, "Color:", 0, 0);
+            laShowItem(muil, mcr, 0, "la.user_preferences.color_picker_gamma");
+
+            laShowSeparator(muil, mc);
+
             laShowLabel(muil, mc, "Nodes:", 0, 0);
             laShowItem(muil, mcr, 0, "la.user_preferences.wire_color_slices");
             laShowItem(muil, mcr, 0, "la.user_preferences.wire_thickness");
@@ -1542,13 +1548,13 @@ void laui_Drivers(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *
 
 
 void la_RegisterBuiltinTemplates(){
-    laRegisterUiTemplate("LAUI_input_mapper","Input Mapper",laui_InputMapper,0,0,"Controlling", 0);
-    laRegisterUiTemplate("LAUI_drivers","Drivers",laui_Drivers,lauidetached_Drivers,0,0, 0);
-    laRegisterUiTemplate("LAUI_controllers", "Controllers", laui_GameController, lauidetached_GameController, 0,0, 0);
-    laRegisterUiTemplate("LAUI_user_preferences", "User Preferences", laui_UserPreference, 0, 0, "System", 0);
-    laRegisterUiTemplate("LAUI_about", "About", laui_About, 0, 0, 0, 0);
-    laRegisterUiTemplate("LAUI_texture_inspector", "Texture Inspector", laui_TextureInspector, lauidetached_TextureInspector, 0, 0, 0);
-    laRegisterUiTemplate("LAUI_data_manager", "Data Manager", laui_IdleDataManager, lauidetached_IdleDataManager, 0, 0, 0);
-    laRegisterUiTemplate("LAUI_histories", "Histories", laui_UndoHistories, 0, 0, 0, 0);
-    laRegisterUiTemplate("LAUI_terminal", "Terminal", laui_Terminal, 0, 0, 0, 0);
+    laRegisterUiTemplate("LAUI_input_mapper","Input Mapper",laui_InputMapper,0,0,"Controlling",0,0,0);
+    laRegisterUiTemplate("LAUI_drivers","Drivers",laui_Drivers,lauidetached_Drivers,0,0,0,0,0);
+    laRegisterUiTemplate("LAUI_controllers", "Controllers", laui_GameController, lauidetached_GameController, 0,0,0,0,0);
+    laRegisterUiTemplate("LAUI_user_preferences", "User Preferences", laui_UserPreference, 0, 0, "System",0,0,0);
+    laRegisterUiTemplate("LAUI_about", "About", laui_About, 0, 0, 0, 0,15,25);
+    laRegisterUiTemplate("LAUI_texture_inspector", "Texture Inspector", laui_TextureInspector, lauidetached_TextureInspector, 0, 0, 0,0,0);
+    laRegisterUiTemplate("LAUI_data_manager", "Data Manager", laui_IdleDataManager, lauidetached_IdleDataManager, 0, 0, 0,25,25);
+    laRegisterUiTemplate("LAUI_histories", "Histories", laui_UndoHistories, 0, 0, 0, 0,10,25);
+    laRegisterUiTemplate("LAUI_terminal", "Terminal", laui_Terminal, 0, 0, 0, 0,20,25);
 }

+ 7 - 6
resources/la_widgets.c

@@ -1081,8 +1081,8 @@ void la_ColorCircleDrawHCY(laUiItem *ui, int h){
 
     tnsRGB2HCY(RealColor, hcy);
 
-    PickerPos[0] = c + cos(hcy[0] * TNS_PI * 2) * hcy[1] * r;
-    PickerPos[1] = ui->U + r + sin(hcy[0] * TNS_PI * 2) * hcy[1] * r;
+    PickerPos[0] = c + cos(hcy[0] * TNS_PI * 2) * pow(hcy[1],1.0f/MAIN.ColorPickerGamma) * r;
+    PickerPos[1] = ui->U + r + sin(hcy[0] * TNS_PI * 2) * pow(hcy[1],1.0f/MAIN.ColorPickerGamma) * r;
 
     hcy[0] = 0;
     hcy[1] = 1;
@@ -1120,7 +1120,7 @@ void la_ColorCircleDrawHCY(laUiItem *ui, int h){
     tnsVertexArray2d(verts, 146);
     tnsPackAs(GL_TRIANGLE_STRIP);
 
-    tnsUniformColorMode(T->immShader,1);
+    tnsUniformColorMode(T->immShader,1); tnsUniformHCYGamma(T->immShader,MAIN.ColorPickerGamma);
     tnsFlush();
     tnsUniformColorMode(T->immShader,0);
 
@@ -2103,6 +2103,7 @@ int OPMOD_ColorHCY(laOperator *a, laEvent *e){
                 }
             }
             hcy[1] = dist / r; TNS_CLAMP(hcy[1],0,1);
+            hcy[1]=pow(hcy[1],MAIN.ColorPickerGamma);
         }else if (dist < r + LA_RH * 2 && dx > 0){
             abso = -atan((real)dy / (real)dx) / TNS_PI * 2 + 0.5;
             hcy[2] = abso; TNS_CLAMP(hcy[2],0,1);
@@ -2183,7 +2184,7 @@ int OPMOD_EnumSelector(laOperator *a, laEvent *e){
             ui->State = LA_UI_ACTIVE;
             laLocalToWindow(a, a->ToPanel, &GX, &GY);
             laLocalToWindow(a, a->ToPanel, &GR, &t);
-            laEnablePropertyPanel(a->ToPanel, a, 0, la_DefaultEnumPanel, 0, &ui->PP, GX, GR, GY, 200, 300, e);
+            laEnablePropertyPanel(a->ToPanel, a, 0, la_DefaultEnumPanel, 0, &ui->PP, GX, GR, GY, MAIN.CurrentWindow->CH-LA_2RH, 0, e);
             laRedrawCurrentPanel();
         }elif(IsCycle){
             laEnumItem* ei=laGetEnumArrayIndexed(&ui->PP, ArrTarget);
@@ -2329,7 +2330,7 @@ int OPMOD_MenuItem(laOperator *a, laEvent *e){
         int GX = ui->L, GY = ui->B;
         laLocalToWindow(a, a->ToPanel, &GX, &GY);
         ui->State = LA_UI_ACTIVE;
-        p = laEnableMenuPanel(a->ToPanel, a, ui->Subs.pFirst, &ui->PP, GX, GX + 300, GY, 600, 200, e);
+        p = laEnableMenuPanel(a->ToPanel, a, ui->Subs.pFirst, &ui->PP, GX, GX + 300, GY, MAIN.CurrentWindow->CH-LA_2RH, 0, e);
         laShowPanelWithDropDownEffect(p);
         laRedrawCurrentPanel();
         return LA_RUNNING;
@@ -2916,7 +2917,7 @@ int OPMOD_ValueMapper(laOperator *a, laEvent *e){
         return LA_RUNNING;
     }
     if (uit->Dragging && (e->Type == LA_L_MOUSE_UP || e->Type == LA_R_MOUSE_UP || e->key == LA_KEY_ESCAPE)){
-        uit->Dragging=0; laValueMapperPoint* vmp=uit->Ptr1;
+        uit->Dragging=0; laValueMapperPoint* vmp=uit->Ptr1; if(!vmp) return LA_RUNNING_PASS;
         if(vmp->x>1||vmp->x<0) {
             lstRemoveItem(&vm->Points,vmp); la_ValueMapperEnsureValidPoints(vm);
             laNotifyUsersPP(&ui->PP); laRedrawCurrentPanel(); laRecordAndPushProp(&ui->PP,0); laMarkPropChanged(&ui->PP);