*/}}
Browse Source

Reduce hightcoeff

YimingWu 1 month ago
parent
commit
6b0d08ca04
13 changed files with 141 additions and 202 deletions
  1. 1 1
      la_animation.c
  2. 1 1
      la_audio.c
  3. 3 3
      la_controllers.c
  4. 9 8
      la_interface.h
  5. 5 22
      la_kernel.c
  6. 0 1
      la_resource.c
  7. 6 7
      la_tns.h
  8. 35 25
      la_tns_kernel.c
  9. 1 1
      resources/la_nodes_basic.c
  10. 1 1
      resources/la_operators.c
  11. 1 1
      resources/la_properties.c
  12. 2 2
      resources/la_templates.c
  13. 76 129
      resources/la_widgets.c

+ 1 - 1
la_animation.c

@@ -189,7 +189,7 @@ int OPMOD_AnimationNewAction(laOperator *a, laEvent *e){
 }
 void laui_AnimationNewAction(laUiList *uil, laPropPack *This, laPropPack *OperatorProps, laColumn *UNUSED, int context){
     laColumn *c = laFirstColumn(uil);
-    laUiItem* ui=laShowItem(uil, c, OperatorProps, "holder");ui->SymbolID=3; ui->Flags|=LA_UI_FLAGS_NO_DECAL;
+    laUiItem* ui=laShowItem(uil, c, OperatorProps, "holder");ui->Extent=3; ui->Flags|=LA_UI_FLAGS_NO_DECAL;
 }
 
 int OPINV_AnimationSelectAction(laOperator *a, laEvent *e){

+ 1 - 1
la_audio.c

@@ -411,7 +411,7 @@ void laui_ScopeNode(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn
     laShowNodeSocket(uil,c,This,"in2",0)->Flags|=LA_UI_SOCKET_LABEL_W;
     laEndRow(uil,b);
 
-    laShowItem(uil,c,This,"scope")->Extra->HeightCoeff=6;
+    laShowItem(uil,c,This,"scope")->Extent=6;
 
     laShowLabel(uil,cl,"CH1",0,0)->Flags|=LA_TEXT_ALIGN_CENTER;
     laShowItem(uil,cl,This,"bright1"); laShowItem(uil,cl,This,"offset1");

+ 3 - 3
la_controllers.c

@@ -540,10 +540,10 @@ void laui_X56Throttle(laUiList *uil, laPropPack *This, laPropPack *Extra, laColu
     ui=laShowItem(uil,crl,This,"bh");ui->Expand=1;
     laEndRow(uil,b);
     b=laBeginRow(uil,crl,0,0);
-    ui=laShowItem(uil,crl,This,"thr1");ui->Expand=1;ui->Extra->HeightCoeff=10;ui->Flags|=LA_UI_FLAGS_TRANSPOSE;
+    ui=laShowItem(uil,crl,This,"thr1");ui->Expand=1;ui->Extent=15;ui->Flags|=LA_UI_FLAGS_TRANSPOSE;
     laShowCompoundValue(ui,LA_SLOT_MARKER_1,This,"thr1_min");
     laShowCompoundValue(ui,LA_SLOT_MARKER_2,This,"thr1_max");
-    ui=laShowItem(uil,crl,This,"thr2");ui->Expand=1;ui->Extra->HeightCoeff=10;ui->Flags|=LA_UI_FLAGS_TRANSPOSE;
+    ui=laShowItem(uil,crl,This,"thr2");ui->Expand=1;ui->Extent=15;ui->Flags|=LA_UI_FLAGS_TRANSPOSE;
     laShowCompoundValue(ui,LA_SLOT_MARKER_1,This,"thr2_min");
     laShowCompoundValue(ui,LA_SLOT_MARKER_2,This,"thr2_max");
     laEndRow(uil,b);
@@ -562,7 +562,7 @@ void laui_X56Throttle(laUiList *uil, laPropPack *This, laPropPack *Extra, laColu
     laShowSeparator(uil,rcl);
     laShowItem(uil,rcl,This,"be");
     laShowItem(uil,rcl,This,"bball");
-    laShowItem(uil,rcr,This,"ball");
+    laShowItem(uil,rcr,This,"ball")->Extent=0;
 
     laShowItem(uil,rc,This,"h3")->Flags|=LA_UI_FLAGS_TRANSPOSE;
     laShowItem(uil,rc,This,"h4")->Flags|=LA_UI_FLAGS_TRANSPOSE;

+ 9 - 8
la_interface.h

@@ -1009,7 +1009,6 @@ STRUCTURE(laGeneralUiExtraData){
     laStringEdit *Edit;
     void *Ptr1;
     void *Ptr2;
-    int HeightCoeff;
     laUiItem* ui;
 };
 
@@ -1170,14 +1169,15 @@ STRUCTURE(laUiItem){
     int L, R, U, B;
     int TL, TR, TU, TB;
     int AnimationDistinguish;
-
-    int State; int Flags; // expand and even (in row control ui)
+    int State;
+    
+    uint64_t Flags; // expand and even (in row control ui)
     laPropPack ExtraPP;
     laPropStep FakePs;
     laGeneralUiExtraData *Extra;
 
     short Expand;
-    short SymbolID;
+    short Extent;
     laPropPack PP;
     laListHandle CompoundPPs;
     laSafeString *Display;
@@ -1256,7 +1256,7 @@ STRUCTURE(laWidget){
 #define LA_UI_FLAGS_MOMENTARY (LA_UI_FLAGS_CYCLE|LA_UI_FLAGS_NODE_CONTAINER)
 #define LA_UI_FLAGS_KNOB LA_UI_FLAGS_NODE_CONTAINER
 
-#define LA_UI_FLAGS_VALUE_METER LA_UI_FLAGS_CYCLE
+#define LA_UI_FLAGS_VERTICAL_SLIDER LA_UI_FLAGS_CYCLE
 
 #define LA_UI_SOCKET_LABEL_N LA_TEXT_ALIGN_LEFT
 #define LA_UI_SOCKET_LABEL_S LA_TEXT_ALIGN_RIGHT
@@ -1265,6 +1265,10 @@ STRUCTURE(laWidget){
 
 #define LA_UI_COLLECTION_MANAGER_FILTER LA_TEXT_ONE_LINE
 
+#define LA_TEXT_ROTATE_N   (1ll<<30)
+#define LA_TEXT_ROTATE_W   (1ll<<31)
+#define LA_TEXT_ROTATE_S   (1ll<<32)
+
 extern laWidget* LA_WIDGET_FIXED_GROUP;
 extern laWidget* LA_WIDGET_TAB;
 extern laWidget* LA_WIDGET_COLLECTION;
@@ -1301,7 +1305,6 @@ extern laWidget* LA_WIDGET_MENU_ROOT;
 extern laWidget* LA_WIDGET_ALIGN;
 extern laWidget* LA_WIDGET_3D_VIEW;
 extern laWidget* LA_WIDGET_2D_VIEW;
-extern laWidget* LA_WIDGET_SYMBOL;
 extern laWidget *LA_WIDGET_NODE_SOCKET;
 extern laWidget *LA_WIDGET_HEIGHT_ADJUSTER;
 extern laWidget *LA_WIDGET_RAW;
@@ -2559,7 +2562,6 @@ laUiItem *laShow2DContainerItem(laUiList *uil, laColumn *c, laPropPack *Base, co
 void laDefault3DViewOverlay(laUiItem *ui);
 void laDefault2DViewOverlayRight(laUiItem *ui);
 laUiItem *laShowColumnAdjuster(laUiList *uil, laColumn *c);
-laUiItem *laShowSymbol(laUiList *uil, laColumn *c, int SymbolID, int Height);
 laPropPack* laShowCompoundValue(laUiItem* ui, int slot, laPropPack *Base, const char *Path);
 laUiItem *laShowMouseActionReporter(laUiList* uil, laColumn* c, int Height, const char* Display, const char* instructions); 
 laUiItem *laBeginRow(laUiList *uil, laColumn *c, int Expand, int Even);
@@ -2790,7 +2792,6 @@ extern laUiType *_LA_UI_STRING_MULTI;
 extern laUiType *_LA_UI_ALIGN;
 extern laUiType *_LA_UI_CANVAS;
 extern laUiType *_LA_UI_COLUMN_ADJUSTER;
-extern laUiType *_LA_UI_SYMBOL;
 extern laUiType *_LA_UI_COLUMN_VIEWER;
 extern laUiType *_LA_UI_NODE_SOCKET;
 extern laUiType *_LA_UI_HEIGHT_ADJUSTER;

+ 5 - 22
la_kernel.c

@@ -4844,7 +4844,7 @@ laUiItem *laShowImage(laUiList *uil, laColumn *c, tnsImage* Image, int Height){
     laUiItem *ui = memAcquire(sizeof(laUiItem));
     ui->C = c; memAssignRef(ui,&ui->Extra,Image);
     ui->Type=_LA_UI_IMAGE; ui->Type->Init(ui);
-    ui->SymbolID=Height;
+    ui->Extent=Height;
     lstAppendItem(&uil->UiItems, ui);
     return ui;
 }
@@ -4925,23 +4925,6 @@ laUiItem *laShowColumnAdjuster(laUiList *uil, laColumn *c){
 
     return ui;
 }
-laUiItem *laShowSymbol(laUiList *uil, laColumn *c, int SymbolID, int Height){
-    laUiItem *ui = memAcquireSimple(sizeof(laUiItem));
-
-    ui->Type = _LA_UI_SYMBOL;
-
-    ui->SymbolID = SymbolID;
-    if (Height) ui->State = Height;
-
-    ui->C = c;
-
-    if (ui->Type->Init) ui->Type->Init(ui);
-    ui->ExtraPP.EndInstance = ui->Extra;
-    
-    lstAppendItem(&uil->UiItems, ui);
-
-    return ui;
-}
 laPropPack* laShowCompoundValue(laUiItem* ui, int slot, laPropPack *Base, const char *Path){
     laPropPack PP={0}; int result;
     if (Path){
@@ -6015,7 +5998,7 @@ int la_UpdateUiListRecursive(laUiList *uil, int U, int L, int R, int B, int Fast
             if(!RowMode){
                 la_CalcUiItemInfluence(&uil->Columns, ui);
             }else{
-                H = ui->Type->GetHeight ? ui->Type->GetHeight(ui) : 1;
+                H = ui->Type->GetHeight ? ui->Type->GetHeight(ui) : (ui->Extent==0?1:ui->Extent);
                 la_AddRowNode(&ri, ui, bt, H*LA_RH,WaitAnimation);
             }
             if (ui->State == LA_UI_NORMAL){
@@ -6067,7 +6050,7 @@ int la_UpdateUiListRecursive(laUiList *uil, int U, int L, int R, int B, int Fast
         int GB=0;
         if (ui->Type == _LA_UI_FIXED_GROUP && ui->Page->HeightCoeff < 0 && ui->Flags&LA_UI_FLAGS_PREFER_BOTTOM){ GB=ui->Page->TB-ui->Page->PanY-LA_M; }
 
-        H = ui->Type->GetHeight ? ui->Type->GetHeight(ui) : 1;
+        H = ui->Type->GetHeight ? ui->Type->GetHeight(ui) : (ui->Extent==0?1:ui->Extent);
         ui->TU = ui->C->B + (NoGap?0:LA_M);
         if (H < 0){
             if(B){ H = B + (H+1) * LA_RH - ui->TU-LA_M+((H<-1)?-LA_M:0); }
@@ -6086,7 +6069,7 @@ int la_UpdateUiListRecursive(laUiList *uil, int U, int L, int R, int B, int Fast
                 ui->PP.EndInstance = TInstance;
                 laUiList *iuil = ui->Subs.pFirst; 
                 laUiList *puil = iuil;
-                int Row = 0, Col = 0, RowPriority = ui->SymbolID > 0 ? 1 : 0, ElementLimit = ui->SymbolID ? abs(ui->SymbolID) : 0;
+                int Row = 0, Col = 0, RowPriority = ui->Extent > 0 ? 1 : 0, ElementLimit = ui->Extent ? abs(ui->Extent) : 0;
                 int Spread=ui->Expand>2?ui->Expand:0; if(Spread){ RowPriority=0; ElementLimit=0; }
                 laUiDefineFunc Template = ui->Template ? ui->Template : laGetPropertyUiDefine(&ui->PP, TInstance);
 
@@ -7191,7 +7174,7 @@ int la_TestUiListMinumWidth(laUiList *uil){
             }
             ui->PP.EndInstance = Restore;
             tW = (int)((float)tW / ui->C->PreWidth + 2);
-            tW *= (ui->SymbolID > 0 ? ui->SymbolID : 1);
+            tW *= (ui->Extent > 0 ? ui->Extent : 1);
             if (W < tW) W = tW;
         }elif (ui->Type==&_LA_UI_ROW_BEGIN){
             RowMode=1; rW=0;

+ 0 - 1
la_resource.c

@@ -51,7 +51,6 @@ laUiType *_LA_UI_STRING_MULTI;
 laUiType *_LA_UI_ALIGN;
 laUiType *_LA_UI_CANVAS;
 laUiType *_LA_UI_COLUMN_ADJUSTER;
-laUiType *_LA_UI_SYMBOL;
 laUiType *_LA_UI_COLUMN_VIEWER;
 laUiType *_LA_UI_NODE_SOCKET;
 laUiType *_LA_UI_HEIGHT_ADJUSTER;

+ 6 - 7
la_tns.h

@@ -1461,14 +1461,13 @@ void tnsPopStringClip();
 int tnsStringGetDimension(char* content, uint32_t* contentU, int Count, int WLimit, int* Rows, int UseMono);
 int tnsStringGetWidth(char *content, int Count, int UseMono);
 int tnsStringGetWidthU(uint32_t *contentU, int Count, int UseMono);
-void tnsDrawStringM(char *content, uint32_t* contentU, real Color[4], int L, int R, int T, int Flags);
+void tnsDrawStringM(char *content, uint32_t* contentU, real Color[4], int L, int R, int T, uint64_t Flags);
 int tnsDrawLCD7_ProgressSystem(real x, real y, real Percent);
-void tnsDrawStringLCD(char *content, uint32_t* contentU, real Color[4], int L, int R, int T, int Flags, real Scale);
-void tnsDrawStringAutoM(char *content, uint32_t* contentU, real Color[4], int L, int R, int T, int Flags);
-void tnsDrawStringAuto(char *content, real Color[4], int L, int R, int T, int Flags);
-void tnsDrawStringWithPriority(char *Label, char *MajorContent, real Color[4], int TextAlign, int L, int R, int T, int Flags);
-void tnsDrawVectorGraphPackage(int ID, real Color[4], int L, int R, int T, int B, int Align, int Flags);
-void tnsDrawIcon(uint32_t ID, real Color[4], int L,int R, int T, int Flags);
+void tnsDrawStringLCD(char *content, uint32_t* contentU, real Color[4], int L, int R, int T, uint64_t Flags, real Scale);
+void tnsDrawStringAutoM(char *content, uint32_t* contentU, real Color[4], int L, int R, int T, uint64_t Flags);
+void tnsDrawStringAuto(char *content, real Color[4], int L, int R, int T, uint64_t Flags);
+void tnsDrawStringWithPriority(char *Label, char *MajorContent, real Color[4], int TextAlign, int L, int R, int T, uint64_t Flags);
+void tnsDrawIcon(uint32_t ID, real Color[4], int L,int R, int T, uint64_t Flags);
 
 void tnsUseFontCoord(real x, real y, real size);
 

+ 35 - 25
la_tns_kernel.c

@@ -3186,7 +3186,7 @@ int tnsMakeLCD16(real x, real y, real w, real h, real shear, int ch){
     }
     return 1;
 }
-void tnsDrawStringLCD(char *content, uint32_t* contentU, real Color[4], int L, int R, int T, int Flags, real Scale){
+void tnsDrawStringLCD(char *content, uint32_t* contentU, real Color[4], int L, int R, int T, uint64_t Flags, real Scale){
     if(Scale<1e-5) return;
     real MA=FM->UsingFont->MonoAdvance;
     real sx = L; int sy = T; real dx=MA; real hgap=LA_RH/15; real vgap=LA_RH/5;
@@ -3223,20 +3223,14 @@ void tnsDrawStringLCD(char *content, uint32_t* contentU, real Color[4], int L, i
     if(any){ tnsColor4dv(Color); tnsPackAs(GL_LINES); }
 }
 
-    //arr[0] = x1;
-    //arr[1] = y1;
-    //arr[2] = x2;
-    //arr[3] = y2;
-
-    //arr[4] = x3;
-    //arr[5] = y3;
-    //arr[6] = x2;
-    //arr[7] = y2;
-    
-    //arr[8] = x3;
-    //arr[9] = y3;
-    //arr[10] = x4;
-    //arr[11] = y4;
+void tns_RotateText(real* v, int detent,real x,real y){
+    switch(detent){
+        case 0: default: return;
+        case 1: for(int i=0;i<6;i++){ v[i*2]-=x;v[i*2+1]-=y;  LA_SWAP(real,v[i*2],v[i*2+1]); v[i*2+1]*=-1; v[i*2]+=x;v[i*2+1]+=y; } return;
+        case 2: for(int i=0;i<6;i++){ v[i*2]-=x;v[i*2+1]-=y;  v[i*2]*=-1;v[i*2+1]*=-1; v[i*2]+=x;v[i*2+1]+=y; } return;
+        case 3: for(int i=0;i<6;i++){ v[i*2]-=x;v[i*2+1]-=y;  LA_SWAP(real,v[i*2],v[i*2+1]); v[i*2]*=-1; v[i*2]+=x;v[i*2+1]+=y; } return;
+    }
+}
 int tns_ClipCharacterT2D(real* v, real* t){
     real l=v[0]; if(l>FM->R) return 0; real r=v[4]; if(r<FM->L) return 0;
     real u=v[1]; if(u>FM->B) return 0; real b=v[3]; if(b<FM->U) return 0;
@@ -3247,7 +3241,7 @@ int tns_ClipCharacterT2D(real* v, real* t){
     if(b>FM->B){ real p=(b-(real)FM->B)/(b-u); t[3]-=p*(tb-tu); t[7]=t[11]=t[3]; v[7]=v[11]=v[3]=FM->B; }
     return 1;
 }
-void tnsDrawStringM(char *content, uint32_t* contentU, real Color[4], int L, int R, int T, int Flags){
+void tnsDrawStringM(char *content, uint32_t* contentU, real Color[4], int L, int R, int T, uint64_t Flags){
     if(Flags&LA_TEXT_SHADOW){
         int offset = FM->UsingFont->height*MAIN.UiScale/16.0f;
         tnsDrawStringM(content, contentU, laAccentColor(LA_BT_SHADOW|LA_BT_TEXT), L+offset, R+offset, T+offset, Flags&(~LA_TEXT_SHADOW));
@@ -3255,13 +3249,16 @@ void tnsDrawStringM(char *content, uint32_t* contentU, real Color[4], int L, int
     if(!FM->UsingFont){return;} if(Flags&(LA_TEXT_LCD_16|LA_TEXT_LCD_7)){
         tnsDrawStringLCD(content,contentU,Color,L,R,T,Flags,1.0); return;
     }
-    real sx = L; int sy = (LA_RH!=LA_RH0)?(((((real)FM->UsingFont->height/LA_RH0-0.5)/MAIN.UiScale)+0.5)*LA_RH + T):(FM->UsingFont->height+T);
+    unsigned int fh=FM->UsingFont->height;
+    real sx = L; int sy = (LA_RH!=LA_RH0)?(((((real)fh/LA_RH0-0.5)/MAIN.UiScale)+0.5)*LA_RH + T):(fh+T);
     real MA=FM->UsingFont->MonoAdvance;
     int i,advance=1;
     int len = contentU?strlenU(contentU):(content?strlen(content):0); if(!len) return;
     real xo, yo, xl, yl;
     real TexCoord[12];
     real VertArr[12];
+    int rx=L+LA_RH0/2,ry=T+LA_RH0/2;
+    int detent = (Flags&LA_TEXT_ROTATE_N)?1:((Flags&LA_TEXT_ROTATE_W)?2:((Flags&LA_TEXT_ROTATE_S)?3:0));
     int total_width = 0;
     tnsFont *f = FM->UsingFont;
     int FscHeight, RestoreI;
@@ -3311,6 +3308,7 @@ void tnsDrawStringM(char *content, uint32_t* contentU, real Color[4], int L, int
                           cx + fsc->width, +cy);
         
         if(tns_ClipCharacterT2D(VertArr,TexCoord)){
+            tns_RotateText(VertArr,detent,rx,ry);
             tnsUseMaskTexture(&f->TexBuffer);
             tnsVertexArray2d(VertArr, 6);
             tnsTexCoordArray2d(TexCoord, 6);
@@ -3322,9 +3320,9 @@ void tnsDrawStringM(char *content, uint32_t* contentU, real Color[4], int L, int
     }
     if(any) tnsPackAs(GL_TRIANGLES);
 }
-void tnsDrawStringAutoM(char *content, uint32_t* contentU, real Color[4], int L, int R, int T, int Flags){
+void tnsDrawStringAutoM(char *content, uint32_t* contentU, real Color[4], int L, int R, int T, uint64_t Flags){
     int LL;
-    int al = Flags&LA_TEXT_ALIGN;
+    uint64_t al = Flags&LA_TEXT_ALIGN;
     
     if (!content && !contentU) return;
     switch (al){
@@ -3336,19 +3334,31 @@ void tnsDrawStringAutoM(char *content, uint32_t* contentU, real Color[4], int L,
     }
     tnsDrawStringM(content, contentU, Color, LL, R, T, Flags);
 }
-void tnsDrawStringAuto(char *content, real Color[4], int L, int R, int T, int Flags){
+void tnsDrawStringAuto(char *content, real Color[4], int L, int R, int T, uint64_t Flags){
     tnsDrawStringAutoM(content,0,Color,L,R,T,Flags);
 }
-void tnsDrawStringWithPriority(char *Label, char *MajorContent, real Color[4], int TextAlign, int L, int R, int T, int Flags){
+void tnsDrawStringWithPriority(char *Label, char *MajorContent, real Color[4], int TextAlign, int L, int R, int T, uint64_t Flags){
     int W = R - L;
     int Str1W = tnsStringGetWidth(Label, 0, Flags&LA_TEXT_MONO);
     int Str2W = tnsStringGetWidth(MajorContent, 0, Flags&LA_TEXT_MONO);
+
+    int rx=L+LA_RH0/2,ry=T+LA_RH0/2;
+    int detent = (Flags&LA_TEXT_ROTATE_N)?1:((Flags&LA_TEXT_ROTATE_W)?2:((Flags&LA_TEXT_ROTATE_S)?3:0));
+    int offx,offy;
+    int remain = TNS_MAX2(0,W-Str2W);
+    switch(detent){
+        case 0: offx=0;offy=0; break;
+        case 1: offx=remain; offy=remain; break;
+        case 2: offx=remain-LA_RH*2; offy=0; break;
+        case 3: offx=remain; offy=-remain; break;
+    }
+    
     if (Str1W + Str2W > W){
         if (Str2W < W){
-            tnsDrawStringM(MajorContent, 0, Color, R - Str2W, R, T, Flags);
+            tnsDrawStringM(MajorContent, 0, Color, R - Str2W-offx, R-offx, T-offy, Flags);
             tnsDrawStringM(Label, 0, Color, L, R - Str2W, T, Flags);
         }else
-            tnsDrawStringM(MajorContent, 0, Color, L, R, T, Flags);
+            tnsDrawStringM(MajorContent, 0, Color, L-offx, R-offx, T-offy, Flags);
     }else{
         int LL = L, ML;
         switch (Flags&LA_TEXT_ALIGN){
@@ -3366,10 +3376,10 @@ void tnsDrawStringWithPriority(char *Label, char *MajorContent, real Color[4], i
         }
 
         tnsDrawStringM(Label, 0, Color, LL, R, T, Flags);
-        tnsDrawStringM(MajorContent, 0, Color, ML, R, T, Flags);
+        tnsDrawStringM(MajorContent, 0, Color, ML-offx, R-offx, T-offy, Flags);
     }
 }
-void tnsDrawIcon(uint32_t ID, real Color[4], int L,int R, int T, int Flags){
+void tnsDrawIcon(uint32_t ID, real Color[4], int L,int R, int T, uint64_t Flags){
     char buf[5]={0}; char* next; laToUTF8(ID,buf,&next);
     tnsDrawStringAuto(buf, Color, L,R,T,Flags);
 }

+ 1 - 1
resources/la_nodes_basic.c

@@ -182,7 +182,7 @@ void laui_ControllerNode(laUiList *uil, laPropPack *This, laPropPack *Extra, laC
             sprintf(buf,"out%d.axis",i); laShowItem(uil,cr,This,buf)->Expand=1;
         }laElse(uil,b2);{
             laUiItem* b3=laOnConditionThat(uil,cr,laEqual(laPropExpression(This,buf2),laIntExpression(LA_PROP_FLOAT|LA_PROP_ARRAY)));{
-                sprintf(buf,"out%d.axis2d",i); laUiItem* aui=laShowItem(uil,cr,This,buf);aui->Expand=1;aui->Flags|=LA_UI_FLAGS_TRANSPOSE;aui->Extra->HeightCoeff=1;
+                sprintf(buf,"out%d.axis2d",i); laUiItem* aui=laShowItem(uil,cr,This,buf);aui->Expand=1;aui->Flags|=LA_UI_FLAGS_TRANSPOSE;aui->Extent=1;
             }laElse(uil,b3);{
                 sprintf(buf,"out%d.switch",i); laUiItem* sui=laShowItem(uil,cr,This,buf);sui->Expand=1;sui->Flags|=LA_UI_FLAGS_TRANSPOSE;
             }laEndCondition(uil,b3);

+ 1 - 1
resources/la_operators.c

@@ -1453,7 +1453,7 @@ laUiTemplate* laget_NewPanelGetActiveTemplate(laNewPanelData* np, laUiTemplate*
 }
 void laui_PanelTemplateSelect(laUiList *uil, laPropPack *This, laPropPack *OperatorProps, laColumn *UNUSED, int context){
     laColumn *c = laFirstColumn(uil);
-    laUiItem* ui=laShowItem(uil, c, OperatorProps, "template");ui->SymbolID=2; ui->Flags|=LA_UI_FLAGS_NO_DECAL;
+    laUiItem* ui=laShowItem(uil, c, OperatorProps, "template");ui->Extent=2; ui->Flags|=LA_UI_FLAGS_NO_DECAL;
 }
 
 int OPINV_Fullscreen(laOperator *a, laEvent *e){

+ 1 - 1
resources/la_properties.c

@@ -2101,7 +2101,7 @@ void la_RegisterInternalProps(){
         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)
+            laAddIntProperty(p, "column_layout", "Column Layout", "The ui's column layout", 0,0,0,10,-10,1, 0,0,offsetof(laUiItem, Extent), 0,0,0,0,0,0,0,0,0,0,0)
                 ->ElementBytes = sizeof(short);
             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);

+ 2 - 2
resources/la_templates.c

@@ -2075,7 +2075,7 @@ void laui_Drivers(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *
     }laEndCondition(uil,b2); \
     b2=laOnConditionThat(uil,c,laPropExpression(&rb->PP,"drivers.current_page"));{ \
         laUiItem* b3=laOnConditionThat(uil,c,laPropExpression(&rb->PP,"drivers.current_page.use_script"));{ \
-            laShowItemFull(uil,c,&rb->PP,"drivers.current_page.script",0,0,0,0)->Extra->HeightCoeff=-2; \
+            laShowItemFull(uil,c,&rb->PP,"drivers.current_page.script",0,0,0,0)->Extent=-2; \
         }laElse(uil,b3);{ \
             laShowItemFull(uil,c,&rb->PP,"drivers.current_page",LA_WIDGET_COLLECTION_SINGLE,0,laui_RackPage,0)->Flags|=LA_UI_FLAGS_NO_DECAL; \
         }laEndCondition(uil,b3); \
@@ -2130,7 +2130,7 @@ void laui_Materials(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn
     laEndRow(uil,b); \
     b2=laOnConditionThat(uil,c,laPropExpression(&rb->PP,"shader_page"));{ \
         laUiItem* b3=laOnConditionThat(uil,c,laPropExpression(&rb->PP,"shader_page.use_script"));{ \
-            laShowItemFull(uil,c,&rb->PP,"shader_page.script",0,0,0,0)->Extra->HeightCoeff=-2; \
+            laShowItemFull(uil,c,&rb->PP,"shader_page.script",0,0,0,0)->Extent=-2; \
         }laElse(uil,b3);{ \
             laShowItemFull(uil,c,&rb->PP,"shader_page",LA_WIDGET_COLLECTION_SINGLE,0,laui_RackPage,0)->Flags|=LA_UI_FLAGS_NO_DECAL; \
         }laEndCondition(uil,b3); \

+ 76 - 129
resources/la_widgets.c

@@ -57,7 +57,6 @@ laWidget _LA_WIDGET_MENU_ROOT={0};
 laWidget _LA_WIDGET_ALIGN={0};
 laWidget _LA_WIDGET_3D_VIEW={0};
 laWidget _LA_WIDGET_2D_VIEW={0};
-laWidget _LA_WIDGET_SYMBOL={0};
 laWidget _LA_WIDGET_NODE_SOCKET={0};
 laWidget _LA_WIDGET_HEIGHT_ADJUSTER={0};
 laWidget _LA_WIDGET_RAW={0};
@@ -103,7 +102,6 @@ laWidget *LA_WIDGET_MENU_ROOT=&_LA_WIDGET_MENU_ROOT;
 laWidget *LA_WIDGET_ALIGN=&_LA_WIDGET_ALIGN;
 laWidget *LA_WIDGET_3D_VIEW=&_LA_WIDGET_3D_VIEW;
 laWidget *LA_WIDGET_2D_VIEW=&_LA_WIDGET_2D_VIEW;
-laWidget *LA_WIDGET_SYMBOL=&_LA_WIDGET_SYMBOL;
 laWidget *LA_WIDGET_NODE_SOCKET=&_LA_WIDGET_NODE_SOCKET;
 laWidget *LA_WIDGET_HEIGHT_ADJUSTER=&_LA_WIDGET_HEIGHT_ADJUSTER;
 laWidget *LA_WIDGET_RAW=&_LA_WIDGET_RAW;
@@ -119,16 +117,16 @@ int la_ArrayGetHeight(laUiItem *ui){
     return laGetArrayLength(&ui->PP);
 }
 int la_ValueGetHeight(laUiItem*ui){
-    int rows = ui->Extra->HeightCoeff; TNS_CLAMP(rows,1,4);
+    int rows = ui->Extent; if(!rows){ rows=1; }
     if(ui->Flags&LA_UI_FLAGS_TRANSPOSE){ return la_ArrayGetHeight(ui)*rows; }
     return rows;
 }
 int la_ValueMeterGetHeight(laUiItem*ui){
-    if(ui->Flags&LA_UI_FLAGS_TRANSPOSE){ return ui->Extra->HeightCoeff?ui->Extra->HeightCoeff:6; }
+    if(ui->Flags&LA_UI_FLAGS_TRANSPOSE){ return ui->Extent?ui->Extent:6; }
     return laGetArrayLength(&ui->PP);
 }
 int la_ValueMeter2DGetHeight(laUiItem*ui){
-    return ui->Extra->HeightCoeff?ui->Extra->HeightCoeff:(ui->Extra->HeightCoeff=(ui->TR-ui->TL)/LA_RH);
+    return ui->Extent?ui->Extent:(ui->Extent=(ui->TR-ui->TL)/LA_RH);
 }
 int la_CanvasGetHeight(laUiItem *ui){
     return ui->Expand;
@@ -157,15 +155,8 @@ int la_EnumGetHeight(laUiItem *ui){
     }
 }
 int la_ColorPickerGetHeight(laUiItem *ui){
-    if(!ui->Extra->HeightCoeff) ui->Extra->HeightCoeff=7;
-    return ui->Extra->HeightCoeff;
-}
-int la_SymbolGetHeight(laUiItem *ui){
-    //if (!ui->State)
-    //{
-    //    ui->State = (int)_ICON_SYMBOL_SIZE[ui->SymbolID - ICON_SYMBOL_START] * 1.4 + 1;
-    //}
-    return ui->State;
+    if(!ui->Extent) ui->Extent=7;
+    return ui->Extent;
 }
 int la_GroupGetHeight(laUiItem *ui){
     if (ui->State == LA_UI_ACTIVE) return 0;
@@ -179,10 +170,6 @@ int la_StringPropGetHeight(laUiItem *ui){
     int strw=tnsStringGetDimension(buf, 0, 0, ui->TR-ui->TL, &rows, ui->Flags&LA_TEXT_MONO);
     return rows;
 }
-int la_MultiStringHeight(laUiItem *ui){
-    laGeneralUiExtraData *e = ui->Extra;
-    return e->HeightCoeff;
-}
 int la_LabelHeight(laUiItem *ui){
     int Wrap=ui->Flags&(LA_TEXT_USE_NEWLINE|LA_TEXT_LINE_WRAP);
     if(!Wrap) return 1;
@@ -205,9 +192,12 @@ int la_ImageGetHeight(laUiItem *ui){
         W/=ra; H/=ra;
         return H/LA_RH+1;
     }
-    if(ui->SymbolID) return ui->SymbolID;
+    if(ui->Extent) return ui->Extent;
     return 1;
 }
+int la_VariedGetHeight(laUiItem *ui){
+    return ui->Extent;
+}
 
 int la_ColorSelectorGetMinWidth(laUiItem *ui){
     if(ui->Flags&LA_UI_FLAGS_ICON) return LA_RH;
@@ -216,7 +206,7 @@ int la_ColorSelectorGetMinWidth(laUiItem *ui){
 int la_ValueGetMinWidth(laUiItem *ui){
     int ExtraW=0;
     if(ui->Flags&LA_UI_FLAGS_NO_LABEL){ return LA_RH; }
-    if(ui->Flags&LA_UI_FLAGS_KNOB){ return LA_RH*TNS_MAX2(1,ui->Extra->HeightCoeff); }
+    if(ui->Flags&LA_UI_FLAGS_KNOB){ return LA_RH*TNS_MAX2(1,ui->Extent); }
     if((ui->Flags&LA_UI_FLAGS_EXPAND)&&(!(ui->Flags&LA_UI_FLAGS_NO_LABEL))){
         ExtraW+=tnsStringGetWidth(transLate(ui->PP.LastPs->p->Name),0,0);
     }
@@ -350,7 +340,7 @@ int la_ImageGetMinWidth(laUiItem *ui){
     int W=im->Texture->Width, H=im->Texture->Height;
     int UseW=LA_RH;
     if(ui->Flags&LA_UI_IMAGE_FULL_W) UseW=W;
-    else UseW=(int)((real)LA_RH*ui->SymbolID/H*W);
+    else UseW=(int)((real)LA_RH*ui->Extent/H*W);
     real CW=MAIN.CurrentWindow->CW-LA_RH*4, CH=MAIN.CurrentWindow->CH-LA_RH*4;
     real ra=1;
     if(UseW>CW){ real r=UseW/CW; ra=TNS_MAX2(r,ra); }
@@ -647,57 +637,6 @@ void la_TabDraw(laUiItem *ui, int h){
     }
     tnsFlush();
 }
-void la_SymbolDraw(laUiItem *ui, int h){
-    return;
-    //char temp[128] = {0};
-    //laBoxedTheme *bt = (*ui->Type->Theme);
-    //tnsFontSingleCharacter *fsc = tfntFetchVectorGraphTextureIDW(ui->SymbolID);
-    //int VOffset = (ui->B - ui->U - (fsc->height)) / 2;
-    //int HOffset = (ui->R - ui->L - (fsc->width)) / 2;
-//
-    //if (strArgumentMatch(ui->Instructions, "mode", "invert"))
-    //{
-    //    tnsUseNoTexture();
-    //    //tnsColor4dv(laThemeColor(bt, ui->State));
-    //    //tnsVertex2d(ui->L, ui->U);
-    //    //tnsVertex2d(ui->R, ui->U);
-    //    //tnsVertex2d(ui->R, ui->B);
-    //    //tnsVertex2d(ui->L, ui->B);
-    //    //tnsPackAs(GL_TRIANGLE_FAN);
-//
-    //    tnsUseNoTexture();
-    //    tnsColor4dv(LA_THEME_GET(bt, LA_UI_NORMAL)->BorderColor->RGBA);
-    //    tnsVertex2d(ui->L, ui->U);
-    //    tnsVertex2d(ui->R, ui->U);
-    //    tnsVertex2d(ui->R, ui->B);
-    //    tnsVertex2d(ui->L, ui->B);
-    //    tnsPackAs(GL_TRIANGLE_FAN);
-//
-    //    //    tnsDrawVectorGraphPackage(ui->SymbolID, LA_THEME_GET(bt, LA_THEME_INTERPOLATING), ui->L + HOffset, ui->R, ui->U + VOffset, ui->B, 0, 0);
-    //}
-    //else
-    //{
-    //    //if (!ui->State) ui->State = LA_UI_NORMAL;
-//
-    //    /*tnsUseNoTexture();
-    //    tnsColor4dv(laThemeColor(bt, ui->State));
-    //    tnsVertex2d(ui->L, ui->U);
-    //    tnsVertex2d(ui->R, ui->U);
-    //    tnsVertex2d(ui->R, ui->B);
-    //    tnsVertex2d(ui->L, ui->B);
-    //    tnsPackAs(GL_TRIANGLE_FAN);*/
-//
-    //    //tnsUseNoTexture();
-        //tnsColor4dv(LA_THEME_GET(bt, LA_UI_NORMAL)->BorderColor->RGBA);
-        //tnsVertex2d(ui->L, ui->U);
-        //tnsVertex2d(ui->R, ui->U);
-        //tnsVertex2d(ui->R, ui->B);
-        //tnsVertex2d(ui->L, ui->B);
-        //tnsPackAs(GL_LINE_LOOP);
-//
-    //    //    tnsDrawVectorGraphPackage(ui->SymbolID, LA_THEME_GET(bt, LA_UI_NORMAL), ui->L + HOffset, ui->R, ui->U + VOffset, ui->B, 0, 0);
-    //}
-}
 
 void la_IntDraw(laUiItem *ui, int h){
     laBoxedTheme *bt = (*ui->Type->Theme);
@@ -715,8 +654,8 @@ void la_IntDraw(laUiItem *ui, int h){
     int NoDecal=ui->Flags&LA_UI_FLAGS_NO_DECAL;
     int NoLabel=ui->Flags&LA_UI_FLAGS_NO_LABEL;
     int IsKnob = ui->Flags&LA_UI_FLAGS_NODE_CONTAINER;
-    int SliderVertical = ui->Flags&LA_UI_FLAGS_VALUE_METER;
-    int sf=bt->TextShadow?LA_TEXT_SHADOW:0;
+    int SliderVertical = ui->Flags&LA_UI_FLAGS_VERTICAL_SLIDER;
+    uint64_t sf=(SliderVertical?LA_TEXT_ROTATE_N:0) | ( bt->TextShadow?LA_TEXT_SHADOW:0);
 
     if (laIsPropertyReadOnly(&ui->PP) && !NoDecal) ui->State = LA_BT_DISABLED;
 
@@ -761,10 +700,10 @@ void la_IntDraw(laUiItem *ui, int h){
             if(radius*2>(_R-_L)-LA_RH/5){ dgy = radius/1.5; }
 
             tnsColor4dv(laThemeColor(bt,LA_BT_BORDER));
-            tnsVertex2d(_L, ctry-dgy); tnsVertex2d(_L, _U); tnsVertex2d(ctrx-dgx, _U); tnsPackAs(GL_LINE_STRIP);
-            tnsVertex2d(_R, ctry-dgy); tnsVertex2d(_R, _U); tnsVertex2d(ctrx+dgx, _U); tnsPackAs(GL_LINE_STRIP);
-            tnsVertex2d(_R, ctry+dgy); tnsVertex2d(_R, _B); tnsVertex2d(ctrx+dgx, _B); tnsPackAs(GL_LINE_STRIP);
-            tnsVertex2d(_L, ctry+dgy); tnsVertex2d(_L, _B); tnsVertex2d(ctrx-dgx, _B); tnsPackAs(GL_LINE_STRIP);
+            tnsVertex2d(_L+0.5f, (int)ctry-dgy+0.5f); tnsVertex2d(_L+0.5f, _U+0.5f); tnsVertex2d(ctrx-(int)dgx+0.5f, _U+0.5f); tnsPackAs(GL_LINE_STRIP);
+            tnsVertex2d(_R-0.5f, (int)ctry-dgy+0.5f); tnsVertex2d(_R-0.5f, _U+0.5f); tnsVertex2d(ctrx+(int)dgx-0.5f, _U+0.5f); tnsPackAs(GL_LINE_STRIP);
+            tnsVertex2d(_R-0.5f, (int)ctry+dgy-0.5f); tnsVertex2d(_R-0.5f, _B-0.5f); tnsVertex2d(ctrx+(int)dgx-0.5f, _B-0.5f); tnsPackAs(GL_LINE_STRIP);
+            tnsVertex2d(_L+0.5f, (int)ctry+dgy-0.5f); tnsVertex2d(_L+0.5f, _B-0.5f); tnsVertex2d(ctrx-(int)dgx+0.5f, _B-0.5f); tnsPackAs(GL_LINE_STRIP);
                 
             real verts[52];//24*2+ctr+overlap
             tnsMakeCircle2d(&verts[2],24,ctrx,ctry,radius,0);
@@ -778,14 +717,17 @@ void la_IntDraw(laUiItem *ui, int h){
             if(Ranged){
                 real arc[52];  int arcindex[26]; // 12 slices 13 ends
                 real range = (real)(Data[i] - min) / (real)(max - min) * TNS_PI * 1.5;
+                real radius2=radius-0.2*LA_RH; if(radius2<LA_RH*0.1){ radius2=LA_RH*0.1; }
                 tnsMakeArc2d(arc,12,ctrx,ctry,radius,TNS_PI*2.75, TNS_PI*2.75 + range);
-                tnsMakeArc2d(&arc[26],12,ctrx,ctry,radius*0.6,TNS_PI*2.75, TNS_PI*2.75 + range);
+                tnsMakeArc2d(&arc[26],12,ctrx,ctry,radius2,TNS_PI*2.75, TNS_PI*2.75 + range);
                 tnsMakeBridgedIndex(arcindex, 13, 0, 0);
                 real *color = laThemeColor(bt,LA_BT_TEXT|ui->State); //tnsColor4d(LA_COLOR3(color),0.3);
                 tnsColor4dv(color);
                 tnsVertexArray2d(arc,26); tnsIndexArray(arcindex,26); tnsPackAs(GL_TRIANGLE_STRIP);
-                tnsMakeArc2d(&arc[2],12,ctrx,ctry,radius*0.6,TNS_PI*2.75, TNS_PI*4.25);
-                tnsVertexArray2d(&arc[2],13);
+                tnsMakeArc2d(&arc[2],12,ctrx,ctry,radius2,TNS_PI*2.75, TNS_PI*4.25);
+                arc[0]=ctrx+cos(TNS_PI*2.75)*radius; arc[1]=ctry+sin(TNS_PI*2.75)*radius;
+                arc[28]=ctrx+cos(TNS_PI*0.25)*radius; arc[29]=ctry+sin(TNS_PI*0.25)*radius;
+                tnsVertexArray2d(arc,15);
                 tnsColor4dv(laThemeColor(bt,LA_BT_BORDER));
                 tnsPackAs(GL_LINE_STRIP);
             }
@@ -807,15 +749,19 @@ void la_IntDraw(laUiItem *ui, int h){
 
                 la_DrawBoxAutoBorderArray(_L,_R,_U,_B,bt,ui->State,IsVertical,i==0);
             }
+            int TL, TR, TU;
+            if(!SliderVertical){ TL=_L+LA_M; TR=_R-LA_M; TU=_U; }
+            else{ TL=_L; TR=TL+(_B-_U)-LA_M*2; TU=_B-LA_M-LA_RH; }
+            TL-=sw; TR-=sw; TU-=sw;
             if (ui->Extra->On == i + 1 && ui->Extra->Edit){
                 uint32_t *buf = strGetCursorLine(ui->Extra->Edit, 0)->Buf;
                 int LL = _L + (Seg - tnsStringGetWidthU(buf, 0, ui->Flags&LA_TEXT_MONO)) / 2;
                 tnsColor4dv(laThemeColor(bt, LA_BT_TEXT));
-                la_SingleLineStringDrawSelection(ui, _L-sw, _U-sw, bt, buf, ui->Extra->Edit);
+                la_SingleLineStringDrawSelection(ui, TL,TU, bt, buf, ui->Extra->Edit);
 
-                tnsDrawStringM(0, buf, laThemeColor(bt, LA_BT_TEXT_ACTIVE), _L+LA_M-sw, _R-LA_M-sw, _U-sw, ui->Flags|sf);
+                tnsDrawStringM(0, buf, laThemeColor(bt, LA_BT_TEXT_ACTIVE), TL,TR,TU, ui->Flags|sf);
             }else{
-                tnsDrawStringWithPriority(NoLabel?0:buf2, buf, la_UiTextColor(bt,ui), 0, _L+LA_M-sw, _R-LA_M-sw, _U-sw, ui->Flags|sf);//, ui->ExtraInstructions);
+                tnsDrawStringWithPriority(NoLabel?0:buf2, buf, la_UiTextColor(bt,ui), 0, TL,TR,TU, ui->Flags|sf);//, ui->ExtraInstructions);
             }
         }
 
@@ -840,8 +786,8 @@ void la_FloatDraw(laUiItem *ui, int h){
     int IsRad=ui->PP.LastPs->p->IsRadAngle;
     int NoLabel=ui->Flags&LA_UI_FLAGS_NO_LABEL;
     int IsKnob = ui->Flags&LA_UI_FLAGS_NODE_CONTAINER;
-    int SliderVertical = ui->Flags&LA_UI_FLAGS_VALUE_METER;
-    int sf=bt->TextShadow?LA_TEXT_SHADOW:0;
+    int SliderVertical = ui->Flags&LA_UI_FLAGS_VERTICAL_SLIDER;
+    uint64_t sf=(SliderVertical?LA_TEXT_ROTATE_N:0) | ( bt->TextShadow?LA_TEXT_SHADOW:0);
 
     if (laIsPropertyReadOnly(&ui->PP) && !NoDecal) ui->State = LA_BT_DISABLED;
 
@@ -882,10 +828,10 @@ void la_FloatDraw(laUiItem *ui, int h){
             if(radius*2>(_R-_L)-LA_RH/5){ dgy = radius/1.5; }
 
             tnsColor4dv(laThemeColor(bt,LA_BT_BORDER));
-            tnsVertex2d(_L, ctry-dgy); tnsVertex2d(_L, _U); tnsVertex2d(ctrx-dgx, _U); tnsPackAs(GL_LINE_STRIP);
-            tnsVertex2d(_R, ctry-dgy); tnsVertex2d(_R, _U); tnsVertex2d(ctrx+dgx, _U); tnsPackAs(GL_LINE_STRIP);
-            tnsVertex2d(_R, ctry+dgy); tnsVertex2d(_R, _B); tnsVertex2d(ctrx+dgx, _B); tnsPackAs(GL_LINE_STRIP);
-            tnsVertex2d(_L, ctry+dgy); tnsVertex2d(_L, _B); tnsVertex2d(ctrx-dgx, _B); tnsPackAs(GL_LINE_STRIP);
+            tnsVertex2d(_L+0.5f, (int)ctry-dgy+0.5f); tnsVertex2d(_L+0.5f, _U+0.5f); tnsVertex2d(ctrx-(int)dgx+0.5f, _U+0.5f); tnsPackAs(GL_LINE_STRIP);
+            tnsVertex2d(_R-0.5f, (int)ctry-dgy+0.5f); tnsVertex2d(_R-0.5f, _U+0.5f); tnsVertex2d(ctrx+(int)dgx-0.5f, _U+0.5f); tnsPackAs(GL_LINE_STRIP);
+            tnsVertex2d(_R-0.5f, (int)ctry+dgy-0.5f); tnsVertex2d(_R-0.5f, _B-0.5f); tnsVertex2d(ctrx+(int)dgx-0.5f, _B-0.5f); tnsPackAs(GL_LINE_STRIP);
+            tnsVertex2d(_L+0.5f, (int)ctry+dgy-0.5f); tnsVertex2d(_L+0.5f, _B-0.5f); tnsVertex2d(ctrx-(int)dgx+0.5f, _B-0.5f); tnsPackAs(GL_LINE_STRIP);
             
             real verts[52];//24*2+ctr+overlap
             tnsMakeCircle2d(&verts[2],24,ctrx,ctry,radius,0);
@@ -899,17 +845,18 @@ void la_FloatDraw(laUiItem *ui, int h){
             if(Ranged){
                 real arc[52];  int arcindex[26]; // 12 slices 13 ends
                 real range,rstart;
+                real radius2=radius-0.2*LA_RH; if(radius2<LA_RH*0.1){ radius2=LA_RH*0.1; }
                 if(min<0&&max>0){ rstart=TNS_PI*3.5; range = (real)(Data[i]) / (real)(max) * TNS_PI * 1.5 * max/(max-min);}
                 else{ rstart=TNS_PI*2.75; range = (real)(Data[i] - min) / (real)(max - min) * TNS_PI * 1.5; }
                 tnsMakeArc2d(arc,12,ctrx,ctry,radius,rstart, rstart + range);
-                tnsMakeArc2d(&arc[26],12,ctrx,ctry,radius*0.6,rstart, rstart + range);
+                tnsMakeArc2d(&arc[26],12,ctrx,ctry,radius2,rstart, rstart + range);
                 tnsMakeBridgedIndex(arcindex, 13, 0, 0);
                 real *color = laThemeColor(bt,LA_BT_TEXT|ui->State); //tnsColor4d(LA_COLOR3(color),0.3);
                 tnsColor4dv(color);
                 tnsVertexArray2d(arc,26); tnsIndexArray(arcindex,26); tnsPackAs(GL_TRIANGLE_STRIP);
-                tnsMakeArc2d(&arc[2],12,ctrx,ctry,radius*0.6,TNS_PI*2.75, TNS_PI*4.25);
-                arc[0] = ctrx + cos(TNS_PI*2.75) * radius; arc[1] = ctry + sin(TNS_PI*2.75) * radius;
-                arc[28] =ctrx + cos(TNS_PI*4.25) * radius; arc[29] =ctry + sin(TNS_PI*4.25) * radius;
+                tnsMakeArc2d(&arc[2],12,ctrx,ctry,radius2,TNS_PI*2.75, TNS_PI*4.25);
+                arc[0]=ctrx+cos(TNS_PI*2.75)*radius; arc[1]=ctry+sin(TNS_PI*2.75)*radius;
+                arc[28]=ctrx+cos(TNS_PI*0.25)*radius; arc[29]=ctry+sin(TNS_PI*0.25)*radius;
                 tnsVertexArray2d(arc,15);
                 tnsColor4dv(laThemeColor(bt,LA_BT_BORDER));
                 tnsPackAs(GL_LINE_STRIP);
@@ -933,15 +880,19 @@ void la_FloatDraw(laUiItem *ui, int h){
 
                 la_DrawBoxAutoBorderArray(_L,_R,_U,_B,bt,ui->State,IsVertical,i==0);
             }
+            int TL, TR, TU;
+            if(!SliderVertical){ TL=_L+LA_M; TR=_R-LA_M; TU=_U; }
+            else{ TL=_L; TR=TL+(_B-_U)-LA_M*2; TU=_B-LA_M-LA_RH; }
+            TL-=sw; TR-=sw; TU-=sw;
             if (ui->Extra->On == i + 1 && ui->Extra->Edit){
                 uint32_t *buf = strGetCursorLine(ui->Extra->Edit,0)->Buf;
                 int LL = _L + (Seg - tnsStringGetWidthU(buf, 0, ui->Flags&LA_TEXT_MONO)) / 2;
                 tnsColor4dv(laThemeColor(bt, LA_BT_TEXT));
-                la_SingleLineStringDrawSelection(ui, _L-sw, _U-sw, bt, buf, ui->Extra->Edit);
+                la_SingleLineStringDrawSelection(ui, TL,TU, bt, buf, ui->Extra->Edit);
 
-                tnsDrawStringM(0, buf, laThemeColor(bt, LA_BT_TEXT_ACTIVE), _L + LA_M, _R - LA_M, _U, ui->Flags|sf);
+                tnsDrawStringM(0, buf, laThemeColor(bt, LA_BT_TEXT_ACTIVE), TL,TR,TU, ui->Flags|sf);
             }else{
-                tnsDrawStringWithPriority(NoLabel?0:buf2, buf,la_UiTextColor(bt,ui), 0, _L+LA_M-sw, _R-LA_M-sw, _U-sw, ui->Flags|sf);//, ui->ExtraInstructions);
+                tnsDrawStringWithPriority(NoLabel?0:buf2, buf,la_UiTextColor(bt,ui), 0, TL,TR,TU, ui->Flags|sf);
             }
         }
         if (ui->Extra && ui->Extra->On == i + 1) ui->State = Original;
@@ -1221,7 +1172,7 @@ void la_MultiStringDraw(laUiItem *ui, int h){
 
     if (ui->State!=LA_UI_ACTIVE){
         strSetEditViewRange(ui->Extra->Edit,
-            ui->Extra->HeightCoeff>0?ui->Extra->HeightCoeff:((ui->B-ui->U)/LA_RH),(ui->R-ui->L-NumberWidth-LA_M*2-LA_M)/MonoWidth);
+            ui->Extent>0?ui->Extent:((ui->B-ui->U)/LA_RH),(ui->R-ui->L-NumberWidth-LA_M*2-LA_M)/MonoWidth);
     }
 
     int sw=0;
@@ -1286,7 +1237,7 @@ void la_MultiStringDraw(laUiItem *ui, int h){
         tnsFlush();
     }
 
-    if(ui->Extra->HeightCoeff>=0)
+    if(ui->Extent>=0)
         tnsDrawStringAuto("◿",laThemeColor(bt,LA_BT_BORDER),ui->R-LA_RH-sw, ui->R-sw, ui->B-LA_M-LA_RH-sw, LA_TEXT_ALIGN_CENTER|sf);
 
     if(!NoDecal){
@@ -1437,7 +1388,7 @@ void la_ColorCircleDrawHCY(laUiItem *ui, int h){
     tnsPackAs(GL_LINE_LOOP);
     tnsLineWidth(1);
 
-    if(ui->Extra->HeightCoeff>=0) tnsDrawStringAuto("◿",laThemeColor(bt,LA_BT_BORDER),ui->R-LA_RH, ui->R, ui->B-LA_M-LA_RH, LA_TEXT_ALIGN_CENTER);
+    if(ui->Extent>=0) tnsDrawStringAuto("◿",laThemeColor(bt,LA_BT_BORDER),ui->R-LA_RH, ui->R, ui->B-LA_M-LA_RH, LA_TEXT_ALIGN_CENTER);
 
     if(IsClay) tnsDrawStringAuto("Clay",laThemeColor(bt,LA_BT_TEXT),ui->L, c-r+LA_RH, ui->U+LA_M, LA_TEXT_ALIGN_RIGHT|LA_TEXT_MONO);
     if(IsP3) tnsDrawStringAuto("D65 P3",laThemeColor(bt,LA_BT_TEXT),ui->L, c-r+LA_RH, ui->U+LA_M, LA_TEXT_ALIGN_RIGHT|LA_TEXT_MONO);
@@ -1617,7 +1568,7 @@ void la_ImageDraw(laUiItem *ui, int h){
     int W=im->Texture->Width, H=im->Texture->Height;
     int Full=ui->Flags&LA_UI_IMAGE_FULL_W;
     real r=(real)(ui->R-ui->L)/W; if(r<1){W*=r;H*=r;}
-    real UseW=Full?(W):((real)LA_RH*ui->SymbolID/H*W);
+    real UseW=Full?(W):((real)LA_RH*ui->Extent/H*W);
     real L=(ui->R-ui->L-UseW)/2,U=0,UseH=Full?H:(ui->B-ui->U);
     if(Full){ U=(ui->B-ui->U-H)/2; }
     if(ui->Flags&LA_TEXT_ALIGN_CENTER){ L=0; }
@@ -1768,9 +1719,9 @@ void la_ValueMeterType2Draw(laUiItem *ui, int h){
         sprintf(limits[0],"%lf",min); sprintf(limits[1],"%lf",max);
     }
 
-    int sl = TNS_MAX2(abs(ui->SymbolID),5);
+    int sl = TNS_MAX2(abs(ui->Extent),5);
     int ScaleLen = sl * LA_RH;
-    real seg = abs(ui->TemplateContext)/100;
+    real seg = 1;
     int times=1,times10=0;
     while((max-min)/seg > ScaleLen/10){
         seg*=10;
@@ -2112,8 +2063,7 @@ void la_MultiStringInit(laUiItem *ui){
     laGeneralUiExtraData *e = ui->Extra;
     if (!e) e = memAcquireSimple(sizeof(laGeneralUiExtraData));
     ui->Extra = e;
-
-    e->HeightCoeff = 10;
+    ui->Extent = 10;
 }
 void la_ImageUiInit(laUiItem *ui){
     tnsImage* im=ui->Extra;
@@ -2129,7 +2079,7 @@ void la_ImageUiDestroy(laUiItem *ui){
     //memAssignRef(ui, &ui->Extra, 0);
 }
 void la_MeterUiInit(laUiItem *ui){
-    la_GeneralUiInit(ui); ui->SymbolID = 20; ui->TemplateContext = 1000;
+    la_GeneralUiInit(ui); ui->Extent = 20;
 }
 
 void la_RegisterUiTypesBasic(){
@@ -2229,7 +2179,7 @@ void la_RegisterUiTypesBasic(){
 
     LA_WIDGET_STRING_MULTI->Type=
     _LA_UI_STRING_MULTI = la_RegisterUiType("LA_string_multiline", LA_PROP_STRING, "LA_string_multi",
-                        &_LA_THEME_STRING, la_MultiStringDraw, la_MultiStringHeight, la_MultiStringInit, la_GeneralUiDestroy);
+                        &_LA_THEME_STRING, la_MultiStringDraw, la_VariedGetHeight, la_MultiStringInit, la_GeneralUiDestroy);
     _LA_UI_STRING_MULTI->GetMinWidth = la_StringPropGetMinWidth;
     km=&_LA_UI_STRING_MULTI->KeyMapper;
     laAssignNewKey(km, 0, "LA_edit_string_copy", LA_KM_SEL_UI_EXTRA, LA_KEY_CTRL, LA_KEY_DOWN, 'c', 0);
@@ -2262,9 +2212,6 @@ void la_RegisterUiTypesBasic(){
     _LA_UI_CONDITION_END.Theme = &_LA_THEME_BUTTON;
     la_UDFAppendSharedTypePointer("LA_condition_end", &_LA_UI_CONDITION_END);
 
-    LA_WIDGET_SYMBOL->Type=
-    _LA_UI_SYMBOL = la_RegisterUiType("LA_symbol_default", 0, 0, &_LA_THEME_BUTTON, la_SymbolDraw, la_SymbolGetHeight, 0, 0);
-
     LA_WIDGET_NODE_SOCKET->Type=
     _LA_UI_NODE_SOCKET = la_RegisterUiType("LA_node_socket_default", 0, "LA_node_socket", &_LA_THEME_SOCKET, la_NodeSocketDraw, la_SocketGetHeight, la_GeneralUiInit, la_GeneralUiDestroy);
     _LA_UI_NODE_SOCKET->GetMinWidth=la_SocketGetMinWidth;
@@ -2288,7 +2235,7 @@ void la_RegisterUiTypesBasic(){
     _LA_UI_SCOPE = la_RegisterUiType("LA_scope_default", 0, "LA_synth_scope", &_LA_THEME_BUTTON, la_ScopeDraw, la_ColorPickerGetHeight, la_GeneralUiInit, la_GeneralUiDestroy);
 
     LA_WIDGET_MOUSE_ACTION_REPORTER->Type=
-    _LA_UI_MOUSE_ACTION_REPORTER = la_RegisterUiType("LA_mouse_action_reporter_default",0,"LA_mouse_action_reporter", &_LA_THEME_STRING,la_MouseActionReporterDraw,la_SymbolGetHeight,0,0);
+    _LA_UI_MOUSE_ACTION_REPORTER = la_RegisterUiType("LA_mouse_action_reporter_default",0,"LA_mouse_action_reporter", &_LA_THEME_STRING,la_MouseActionReporterDraw,la_VariedGetHeight,0,0);
     _LA_UI_MOUSE_ACTION_REPORTER->GetMinWidth = la_MouseActionReporterMinWidth;
 
     _LA_UI_INVISIBLE.Theme=&_LA_THEME_BUTTON;
@@ -2445,7 +2392,7 @@ int OPMOD_IntArrayHorizon(laOperator *a, laEvent *e){
     int IsVertical=(ui->Flags&LA_UI_FLAGS_TRANSPOSE)!=0;
     int NoEvent = ui->Flags&LA_UI_FLAGS_NO_EVENT;
     int NoTooltip=ui->Flags&LA_UI_FLAGS_NO_TOOLTIP;
-    int IsKnob = ui->Flags&LA_UI_FLAGS_NODE_CONTAINER || ui->Flags&LA_UI_FLAGS_VALUE_METER;
+    int IsKnob = ui->Flags&LA_UI_FLAGS_NODE_CONTAINER || ui->Flags&LA_UI_FLAGS_VERTICAL_SLIDER;
 
     if (!laIsInUiItem(ui, a, e->x, e->y) && !ui->Extra->On){
         ui->State = LA_UI_NORMAL;
@@ -2573,7 +2520,7 @@ int OPMOD_FloatArrayHorizon(laOperator *a, laEvent *e){
     int NoEvent = ui->Flags&LA_UI_FLAGS_NO_EVENT;
     int IsRad=ui->PP.LastPs->p->IsRadAngle;
     int NoTooltip=ui->Flags&LA_UI_FLAGS_NO_TOOLTIP;
-    int IsKnob = ui->Flags&LA_UI_FLAGS_NODE_CONTAINER || ui->Flags&LA_UI_FLAGS_VALUE_METER;
+    int IsKnob = ui->Flags&LA_UI_FLAGS_NODE_CONTAINER || ui->Flags&LA_UI_FLAGS_VERTICAL_SLIDER;
 
     if (!laIsInUiItem(ui, a, e->x, e->y) && !ui->Extra->On && !NoTooltip){
         ui->State = LA_UI_NORMAL;
@@ -2752,15 +2699,15 @@ int OPMOD_ColorHCY(laOperator *a, laEvent *e){
         return LA_FINISHED_PASS;
     }
 
-    if(e->type == LA_L_MOUSE_DOWN && es->HeightCoeff>=0 && e->x>ui->R-LA_M-LA_RH && e->y>ui->B-LA_M-LA_RH){
-        es->Dragging=3; es->LastX=e->x; es->LastY=e->y; es->TargetIndexVali=es->HeightCoeff; return LA_RUNNING;
+    if(e->type == LA_L_MOUSE_DOWN && ui->Extent>=0 && e->x>ui->R-LA_M-LA_RH && e->y>ui->B-LA_M-LA_RH){
+        es->Dragging=3; es->LastX=e->x; es->LastY=e->y; es->TargetIndexVali=ui->Extent; return LA_RUNNING;
     }
     if(es->Dragging==3){
-        if(e->type==LA_MOUSEMOVE){ es->HeightCoeff=es->TargetIndexVali+((real)e->y-es->LastY+0.5)/LA_RH;
-            if(es->HeightCoeff<1)es->HeightCoeff=1; laRecalcCurrentPanel();}
+        if(e->type==LA_MOUSEMOVE){ ui->Extent=es->TargetIndexVali+((real)e->y-es->LastY+0.5)/LA_RH;
+            if(ui->Extent<1)ui->Extent=1; laRecalcCurrentPanel();}
         elif(e->type==LA_L_MOUSE_UP){ es->Dragging=0; }
         elif(e->type==LA_R_MOUSE_DOWN){
-            es->Dragging=0; es->HeightCoeff=es->TargetIndexVali; laRecalcCurrentPanel(); }
+            es->Dragging=0; ui->Extent=es->TargetIndexVali; laRecalcCurrentPanel(); }
         return LA_RUNNING;
     }
 
@@ -3165,7 +3112,7 @@ void la_SetMultistringViewRange(laUiItem* ui, laStringEdit* se, laBoxedTheme* bt
     int NumberWidth=0; int MonoWidth=tnsGetMonoFontAdvance(); int Count=se->TotalLines;
     while(Count){ Count/=10; NumberWidth+=MonoWidth; }
     strSetEditViewRange(ui->Extra->Edit,
-        ui->Extra->HeightCoeff>0?ui->Extra->HeightCoeff:((ui->B-ui->U)/LA_RH),(ui->R-ui->L-NumberWidth-LA_M*2-LA_M)/MonoWidth);
+        ui->Extent>0?ui->Extent:((ui->B-ui->U)/LA_RH),(ui->R-ui->L-NumberWidth-LA_M*2-LA_M)/MonoWidth);
 }
 int OPMOD_MultiString(laOperator *a, laEvent *e){
     laUiItem *ui = a->Instance;
@@ -3203,23 +3150,23 @@ int OPMOD_MultiString(laOperator *a, laEvent *e){
                 laRecordAndPushProp(&ui->PP,0); laMarkPropChanged(&ui->PP);
                 ui->State = LA_UI_NORMAL; laRedrawCurrentPanel(); la_SetMultistringViewRange(ui,es->Edit,bt); la_DisplayKeyboard(0);
             }
-            if(es->Dragging){ es->Dragging=0; es->HeightCoeff=es->TargetIndexVali; laRecalcCurrentPanel();la_SetMultistringViewRange(ui,es->Edit,bt); }
+            if(es->Dragging){ es->Dragging=0; ui->Extent=es->TargetIndexVali; laRecalcCurrentPanel();la_SetMultistringViewRange(ui,es->Edit,bt); }
             return LA_FINISHED;
         }
     }
 
     if(laKeyMapExecuteEventEx(a, &ui->ExtraPP, &ui->Type->KeyMapper, e)) return LA_RUNNING;
     
-    if(e->type == LA_L_MOUSE_DOWN && es->HeightCoeff>=0 && e->x>ui->R-LA_M-LA_RH && e->y>ui->B-LA_M-LA_RH){
-        es->Dragging=1; es->LastX=e->x; es->LastY=e->y; es->TargetIndexVali=es->HeightCoeff;
+    if(e->type == LA_L_MOUSE_DOWN && ui->Extent>=0 && e->x>ui->R-LA_M-LA_RH && e->y>ui->B-LA_M-LA_RH){
+        es->Dragging=1; es->LastX=e->x; es->LastY=e->y; es->TargetIndexVali=ui->Extent;
         return LA_RUNNING;
     }
     if(es->Dragging){
-        if(e->type==LA_MOUSEMOVE){ es->HeightCoeff=es->TargetIndexVali+((real)e->y-es->LastY+0.5)/LA_RH;
-            if(es->HeightCoeff<1)es->HeightCoeff=1; laRecalcCurrentPanel(); la_SetMultistringViewRange(ui,es->Edit,bt);}
+        if(e->type==LA_MOUSEMOVE){ ui->Extent=es->TargetIndexVali+((real)e->y-es->LastY+0.5)/LA_RH;
+            if(ui->Extent<1)ui->Extent=1; laRecalcCurrentPanel(); la_SetMultistringViewRange(ui,es->Edit,bt);}
         elif(e->type==LA_L_MOUSE_UP){ es->Dragging=0; }
         elif(e->type==LA_R_MOUSE_DOWN){
-            es->Dragging=0; es->HeightCoeff=es->TargetIndexVali; laRecalcCurrentPanel();la_SetMultistringViewRange(ui,se,bt); }
+            es->Dragging=0; ui->Extent=es->TargetIndexVali; laRecalcCurrentPanel();la_SetMultistringViewRange(ui,se,bt); }
         return LA_RUNNING;
     }
     
@@ -3442,7 +3389,7 @@ int OPMOD_CollectionSelector(laOperator *a, laEvent *e){
             int MinWidth;
             uil = &p->UI;
             col = laFirstColumn(uil);
-            laShowItemFull(uil, col, &ui->PP, 0, LA_WIDGET_COLLECTION, 0, ui->Template, 0)->SymbolID = ui->SymbolID;
+            laShowItemFull(uil, col, &ui->PP, 0, LA_WIDGET_COLLECTION, 0, ui->Template, 0)->Extent = ui->Extent;
             laEnclosePanelContent(p, &p->UI);
         }
         return LA_RUNNING;
@@ -3581,13 +3528,13 @@ int OPMOD_HeightAdjuster(laOperator *a, laEvent *e){
     if ((!uit->Dragging) && (!laIsInUiItem(ui, a, e->x, e->y))){ return LA_FINISHED_PASS; }
 
     if (e->type == LA_L_MOUSE_DOWN || e->type==LA_R_MOUSE_DOWN){
-        uit->Dragging=1; uit->LastY=e->y; uit->On=0; uit->TargetIndexVali=e->type==LA_L_MOUSE_DOWN?(ui->State==LA_BT_ACTIVE?2:1):2; uit->HeightCoeff=1;
+        uit->Dragging=1; uit->LastY=e->y; uit->On=0; uit->TargetIndexVali=e->type==LA_L_MOUSE_DOWN?(ui->State==LA_BT_ACTIVE?2:1):2; ui->Extent=1;
         return LA_RUNNING;
     }
-    if(e->type==LA_L_MOUSE_UP && uit->HeightCoeff){ ui->State=(ui->State==LA_BT_ACTIVE)?LA_BT_NORMAL:LA_BT_ACTIVE; laRedrawCurrentPanel(); }
+    if(e->type==LA_L_MOUSE_UP && ui->Extent){ ui->State=(ui->State==LA_BT_ACTIVE)?LA_BT_NORMAL:LA_BT_ACTIVE; laRedrawCurrentPanel(); }
     if (uit->Dragging && e->type == LA_MOUSEMOVE){
         int diff=e->y-uit->LastY; diff=((real)diff+0.5)/(ui->B-ui->U); int delta=uit->TargetIndexVali;
-        if(diff!=uit->On){ uit->HeightCoeff=0; int d=diff-uit->On; uit->On=diff; while(d){ laSetInt(&ui->PP, d>0?delta:-delta); d-=(d>0?1:-1); }; laRecalcCurrentPanel(); }
+        if(diff!=uit->On){ ui->Extent=0; int d=diff-uit->On; uit->On=diff; while(d){ laSetInt(&ui->PP, d>0?delta:-delta); d-=(d>0?1:-1); }; laRecalcCurrentPanel(); }
         return LA_RUNNING;
     }
     if (uit->Dragging && (e->type == LA_L_MOUSE_UP || e->type == LA_R_MOUSE_UP || e->key == LA_KEY_ESCAPE)){