*/}}
Parcourir la source

Ui cleanups, better slider and node wire drawing

YimingWu il y a 1 semaine
Parent
commit
c1466e0434
6 fichiers modifiés avec 169 ajouts et 136 suppressions
  1. 8 8
      la_animation.c
  2. 5 5
      la_interface.h
  3. 72 39
      la_kernel.c
  4. 36 36
      resources/la_operators.c
  5. 45 45
      resources/la_widgets.c
  6. 3 3
      resources/la_widgets_viewers.c

+ 8 - 8
la_animation.c

@@ -576,7 +576,7 @@ int LAMOD_AnimationActionsCanvas(laOperator *a, laEvent *e){
     if(e->type==LA_M_MOUSE_DOWN){
         ex->UiMode=1; ex->ClickedX=e->x; ex->ClickedY=e->y; Modal=1; ex->Dragging=10;
     }elif(e->type==LA_M_MOUSE_UP || e->type==LA_L_MOUSE_UP){
-        ex->UiMode=0; Modal=1; ex->Dragging=0; ex->TargetIndexVali=0;
+        ex->UiMode=0; Modal=1; ex->Dragging=0; ex->TargetVali=0;
     }
     if(ex->UiMode==1){
         if(e->type&LA_MOUSE_EVENT){
@@ -611,16 +611,16 @@ int LAMOD_AnimationActionsCanvas(laOperator *a, laEvent *e){
         if(e->x<=lr){
             if(e->type==LA_MOUSE_WHEEL_DOWN){ ex->PanY+=LA_RH*MAIN.ScrollingSpeed; Modal=1; }
             if(e->type==LA_MOUSE_WHEEL_UP){ ex->PanY-=LA_RH*MAIN.ScrollingSpeed; Modal=1; }
-            if(e->x>=lr-LA_SEAM_W*2){ if(!ex->TargetIndexVali){ ex->TargetIndexVali=1; Modal=1; }
+            if(e->x>=lr-LA_SEAM_W*2){ if(!ex->TargetVali){ ex->TargetVali=1; Modal=1; }
                 if(e->type==LA_L_MOUSE_DOWN){
                     ex->UiMode=2; ex->ClickedX=e->x; ex->ClickedY=e->y; Modal=1; ex->Dragging=10; Modal=1;
                 }
-            }else{ if(ex->TargetIndexVali){ ex->TargetIndexVali=0; Modal=1; } }
+            }else{ if(ex->TargetVali){ ex->TargetVali=0; Modal=1; } }
         }elif(aa){
             if((!ex->ShowLegend)&&e->x<=ll+LA_SEAM_W*2){
-                if(!ex->TargetIndexVali){ ex->TargetIndexVali=1; Modal=1; }
-                if(e->type==LA_L_MOUSE_DOWN){ ex->LW=LA_RH*4; ex->Dragging=12; ex->ShowLegend=1; Modal=1; ex->UiMode=2; ex->TargetIndexVali=1; }
-            }else{ if(ex->TargetIndexVali){ ex->TargetIndexVali=0; Modal=1; } }
+                if(!ex->TargetVali){ ex->TargetVali=1; Modal=1; }
+                if(e->type==LA_L_MOUSE_DOWN){ ex->LW=LA_RH*4; ex->Dragging=12; ex->ShowLegend=1; Modal=1; ex->UiMode=2; ex->TargetVali=1; }
+            }else{ if(ex->TargetVali){ ex->TargetVali=0; Modal=1; } }
             if(e->type==LA_MOUSE_WHEEL_DOWN){ ex->ZoomX*=0.9; ex->PanX+=mid; ex->PanX*=0.9; ex->PanX-=mid; Modal=1; }
             elif(e->type==LA_MOUSE_WHEEL_UP){ ex->ZoomX*=1.1; ex->PanX+=mid; ex->PanX*=1.1; ex->PanX-=mid; Modal=1; }
             elif(e->type==LA_L_MOUSE_DOWN){
@@ -647,7 +647,7 @@ int LAMOD_AnimationActionsCanvas(laOperator *a, laEvent *e){
     if(ex->PanY>MaxDN){ ex->PanY=MaxDN; } if(ex->PanY<0){ ex->PanY=0; }
     //if(ex->PanX<0){ ex->PanX=0; }
 
-    if(ex->TargetIndexVali){ laSetWindowCursor(LA_LEFT_AND_RIGHT); }else{ laSetWindowCursor(LA_ARROW); }
+    if(ex->TargetVali){ laSetWindowCursor(LA_LEFT_AND_RIGHT); }else{ laSetWindowCursor(LA_ARROW); }
 
     if(Modal){ laRedrawCurrentPanel(); return LA_RUNNING; }
 
@@ -758,7 +758,7 @@ void la_AnimationActionDrawCanvas(laBoxedTheme *bt, laAction *aa, laUiItem* ui){
             }
         }
     }
-    if(ex->TargetIndexVali==1){
+    if(ex->TargetVali==1){
         int LR=TNS_MAX2(lr,ui->L+LA_SEAM_W*2);
         tnsColor4dv(act);tnsUseNoTexture();
         tnsVertex2d(LR, ui->B); tnsVertex2d(LR-LA_SEAM_W*2, ui->B);

+ 5 - 5
la_interface.h

@@ -288,14 +288,14 @@ STRUCTURE(laNodeOutSocket){
     void* Parent;
     laSafeString* Label;
     int DataType, ArrLen;
-    int RuntimeX, RuntimeY, RuntimePX, RuntimePY;
+    real RuntimeX, RuntimeY, RuntimePX, RuntimePY;
     void* Duplicated;
 };
 STRUCTURE(laNodeInSocket){
     laNodeOutSocket* Source;
     laSafeString* Label;
     int DataType, ArrLen; int ColorId;
-    int RuntimeX, RuntimeY, RuntimePX, RuntimePY;
+    real RuntimeX, RuntimeY, RuntimePX, RuntimePY;
 };
 
 NEED_STRUCTURE(laBaseNodeType);
@@ -1002,8 +1002,8 @@ STRUCTURE(laUiType){
 NEED_STRUCTURE(laUiItem);
 STRUCTURE(laGeneralUiExtraData){
     int LastX, LastY;
-    int TargetIndexVali;
-    real TargetIndexValf;
+    int TargetVali;
+    real TargetValf;
     int On; //On:Modifying
     int Dragging;
     laStringEdit *Edit;
@@ -1114,7 +1114,7 @@ STRUCTURE(laCanvasExtra){
     real BL, BR, BU, BB;
 
     int Dragging;
-    int TargetIndexVali;
+    int TargetVali;
 
     //3d==========
 

+ 72 - 39
la_kernel.c

@@ -3014,6 +3014,7 @@ void la_BlockDrawDropLocations(laBlock *b, int CH, real *BorderColor4dV, real *F
     };
 
     tnsUseNoTexture();
+    tnsLineWidth(LA_SEAM_W);
 
     if (MAIN.CurrentWindow->CurrentLayout->DropToBlock == b){
         int Index[4];
@@ -3050,9 +3051,8 @@ void la_BlockDrawDropLocations(laBlock *b, int CH, real *BorderColor4dV, real *F
     tnsColor4dv(BorderColor4dV);
     tnsPackAs(GL_LINE_LOOP);
 
-    glLineWidth(LA_SEAM_W);
     tnsFlush();
-    glLineWidth(1);
+    tnsLineWidth(1);
 }
 void la_BlockDefDrawSelf(laBlock *b, int CH){
     laBoxedTheme *bt = _LA_THEME_TAB;
@@ -5876,16 +5876,16 @@ void la_CalculateRowExpand(laRowInfo* ri, laUiItem* ui_end){
 }
 void la_RecordSocketRuntimePosition(laUiItem* ui){
     laProp* p=ui->PP.LastPs->p; laPropContainer* pc=la_EnsureSubTarget(p,0);
-    int sl,sr,su,sb;
+    real sl,sr,su,sb;
     if(ui->Flags&LA_UI_SOCKET_LABEL_N){ sl=ui->TL; sr=ui->TR; su=ui->TU+LA_RH; }
     elif(ui->Flags&LA_UI_SOCKET_LABEL_S){ sl=ui->TL; sr=ui->TR; su=ui->TU; }
     elif(ui->Flags&LA_UI_SOCKET_LABEL_W){ sl=ui->TL+LA_2RH; sr=ui->TR; su=ui->TU; }
     elif(ui->Flags&LA_UI_SOCKET_LABEL_E){ sl=ui->TL; sr=ui->TR-LA_2RH; su=ui->TU; }
     else{ sl=ui->TL; su=ui->TU; sr=ui->TR; } sb=su+LA_RH; 
     if(pc==LA_PC_SOCKET_OUT){
-        laNodeOutSocket* s=ui->PP.EndInstance; s->RuntimeX=(sl+sr)/2; s->RuntimeY=(su+sb)/2;
+        laNodeOutSocket* s=ui->PP.EndInstance; s->RuntimeX=(sl+sr)/2.0f; s->RuntimeY=(su+sb)/2.0f;
     }else{
-        laNodeInSocket* s=ui->PP.EndInstance;  s->RuntimeX=(sl+sr)/2; s->RuntimeY=(su+sb)/2;
+        laNodeInSocket* s=ui->PP.EndInstance;  s->RuntimeX=(sl+sr)/2.0f; s->RuntimeY=(su+sb)/2.0f;
         laUseDataBlock(s, LA_PROP_SOCKET_SOURCE, MAIN.PropMatcherContextP->FrameDistinguish, MAIN.PropMatcherContextP, la_PropPanelUserRemover, 0);
     }
 }
@@ -6084,6 +6084,9 @@ int la_UpdateUiListRecursive(laUiList *uil, int U, int L, int R, int B, int Fast
                 int CanGetTheme = laCanGetTheme(ui->PP.LastPs->p);laTheme* OriginalTheme=MAIN.CurrentTheme;
                 int CanGetGap= laCanGetGap(ui->PP.LastPs->p); int Gap=0;
                 int CanGetCategory= laCanGetCategory(ui->PP.LastPs->p); char _cat[256]; char* cat=_cat; int GotCategory=0,FirstIn=1;
+                int BoxStyle=(*ui->Type->Theme)->BoxStyle; if(NoDecal) BoxStyle=0;
+                int MainDropOffset=BoxStyle>0?-LA_M:(BoxStyle<0?LA_M:0); Begin+=MainDropOffset;
+                int DropOffset=MainDropOffset;
 
                 if (!ElementLimit) RowPriority = 0;
 
@@ -6141,12 +6144,12 @@ int la_UpdateUiListRecursive(laUiList *uil, int U, int L, int R, int B, int Fast
                             la_AddInstancePage(ui, TInstance, 0); if(GotCategory){ strSafeSet(&ui->Page->TabName,cat); }
                             la_CalcUiTopInfluence(&uil->Columns, ui);
                             if (Template) laMakeUiListFromTemplate(ui->Page, Template, &ParentPanel->PP, &ParentPanel->PropLinkPP, &ui->PP, 0, &uil->Columns, ui->TemplateContext);
-                            SubB = la_UpdateUiListRecursive(ui->Page, Gap+Begin, EL+(NoDecal?0:LA_M), ER-(NoDecal?0:LA_M), B, Fast, ParentPanel);
+                            SubB = la_UpdateUiListRecursive(ui->Page, Gap+Begin, EL+(NoDecal?0:LA_M)+DropOffset, ER-(NoDecal?0:LA_M), B, Fast, ParentPanel);
                             ElementB = RowPriority ? (SubB > ElementB ? SubB : ElementB) : SubB;
                             iuil = ui->Page->Item.pNext;
                     }else{
                         la_CalcUiTopInfluence(&uil->Columns, ui); if(GotCategory){ strSafeSet(&iuil->TabName,cat); }
-                        SubB = la_UpdateUiListRecursive(iuil, Gap+Begin, EL+(NoDecal?0:LA_M), ER-(NoDecal?0:LA_M), B, Fast, ParentPanel);
+                        SubB = la_UpdateUiListRecursive(iuil, Gap+Begin, EL+(NoDecal?0:LA_M)+DropOffset, ER-(NoDecal?0:LA_M), B, Fast, ParentPanel);
                         ElementB = RowPriority ? (SubB > ElementB ? SubB : ElementB) : SubB;
                         la_CalcUiItemInfluence(&uil->Columns, ui);
                         iuil = iuil->Item.pNext;
@@ -6159,7 +6162,7 @@ int la_UpdateUiListRecursive(laUiList *uil, int U, int L, int R, int B, int Fast
                     if(CanGetTheme){ la_SwitchThemeQuick(0, OriginalTheme); }
 
                     if (RowPriority){
-                        Col += 1;
+                        Col += 1; DropOffset=0;
                         if (Col >= ElementLimit){
                             Col = 0;
                             Row += 1;
@@ -6179,7 +6182,7 @@ int la_UpdateUiListRecursive(laUiList *uil, int U, int L, int R, int B, int Fast
                         if (ElementLimit && Row >= ElementLimit){
                             Row = 0;
                             Col += 1;
-                            Begin = ui->TU;
+                            Begin = ui->TU+MainDropOffset;
                         }
                     }
                     ui->TB = ElementB;
@@ -6201,8 +6204,10 @@ int la_UpdateUiListRecursive(laUiList *uil, int U, int L, int R, int B, int Fast
                     if(!Template) Template=laui_SubPropInfoDefault;
                     //ui->Template = Template;
                     int EraseWidth=(ui->Type == _LA_UI_COLLECTION_SELECTOR)?LA_RH:0;
-                    int TopPad = (ui->Type == _LA_UI_COLLECTION_SINGLE)?(NoDecal?0:LA_M):-LA_M;
-                    int SidePad = NoDecal?0:LA_M;
+                    int BoxStyle=(*ui->Type->Theme)->BoxStyle;
+                    int DropOffset=BoxStyle>0?-LA_M:(BoxStyle<0?LA_M:0);
+                    int TopPad = (ui->Type == _LA_UI_COLLECTION_SINGLE)?(NoDecal?0:(LA_M+DropOffset)):(-LA_M+DropOffset);
+                    int SidePad = NoDecal?0:(LA_M+DropOffset);
                     if (!ui->Subs.pFirst && TInstance){
                         la_AddInstancePage(ui, TInstance, 0);
                         la_CalcUiTopInfluence(&uil->Columns, ui);
@@ -6244,10 +6249,13 @@ int la_UpdateUiListRecursive(laUiList *uil, int U, int L, int R, int B, int Fast
         }else{
             if (ui->Type != _LA_UI_COLLECTION && (ui->Subs.pFirst || ui->Page) && ui->Type != _LA_UI_MENU_ROOT){
                 if (ui->Type != _LA_UI_CANVAS){
+                    int BoxStyle=(*ui->Type->Theme)->BoxStyle;
+                    int DropOffset=BoxStyle>0?-LA_M:(BoxStyle<0?LA_M:0);
                     int scrollw=ui->Page->ScrollerShownV?LA_M*2+LA_SCROLL_W:0;
                     la_CalcUiTopInfluence(&uil->Columns, ui); int first_in=((ui->Flags&LA_UI_FLAGS_PREFER_BOTTOM) && ui->Page->B==0);
                     SubB = la_UpdateUiListRecursive(ui->Page,
-                        ui->TB + (ui->State == LA_UI_ACTIVE ? 0 : LA_RH)+(NoDecal?0:LA_M), ui->TL+(NoDecal?0:LA_M), ui->TR-(NoDecal?0:LA_M)-scrollw, B, Fast, ParentPanel);
+                        ui->TB + (ui->State == LA_UI_ACTIVE ? 0 : LA_RH)+(NoDecal?0:(LA_M+DropOffset)),
+                        ui->TL+(NoDecal?0:(LA_M+DropOffset)), ui->TR-(NoDecal?0:LA_M)-scrollw, B, Fast, ParentPanel);
                     ui->TB = (ui->Page->HeightCoeff > 0 ? ui->TU + ui->Page->HeightCoeff * LA_RH :
                             (ui->Page->HeightCoeff < 0 ? B + (ui->Page->HeightCoeff+1) * LA_RH - (LA_M*2)+(ui->Page->HeightCoeff==-2?-LA_M:0) : SubB)) + (NoDecal?0:LA_M);
                     ui->Page->LimH = ui->TB-ui->Page->TU - (NoDecal?0:LA_M);
@@ -6515,14 +6523,14 @@ void la_DrawUiListScrollerH(laUiList *uil, int DisplayOffset, int TotalW, int Di
 }
 void la_DrawInstanceBkg(laUiList *uil, real* color, int LP, int RP){
     tnsUseNoTexture(); tnsColor4dv(color);
-    la_DrawBox(uil->L-LP,uil->R+RP,uil->U,uil->B);
+    la_DrawBox(uil->L-LP,uil->R+RP-1,uil->U,uil->B-1);
 }
 void la_InitSocketRecord(laUiListDraw* uild, laUiList* container){
     laSocketRecord* sr;
     while(sr=lstPopItem(&uild->SocketRecord)){ memFree(sr); }
     uild->WiresContainer=container;
 }
-void la_GetUiListOffsetUntil(laUiListDraw* uild, int* X, int* Y){
+void la_GetUiListOffsetUntil(laUiListDraw* uild, real* X, real* Y){
     *X=*Y=0; for(laUiListDrawItem* lip=uild->Items.pLast;lip&&lip->Target;lip=lip->Item.pPrev){
         if(lip->Target==uild->WiresContainer) break;
         laUiList* uil=lip->Target; *X+=uil->PanX; *Y+=uil->PanY;
@@ -6530,7 +6538,6 @@ void la_GetUiListOffsetUntil(laUiListDraw* uild, int* X, int* Y){
 }
 void la_RecordSocket(laUiListDraw* uild, laUiList* uil, laUiItem* ui){
     laProp* p=ui->PP.LastPs->p; laPropContainer* pc=la_EnsureSubTarget(p,0);
-    int PanX, PanY;
     if(pc==LA_PC_SOCKET_OUT){
         laNodeOutSocket* s=ui->PP.EndInstance;
         la_GetUiListOffsetUntil(uild, &s->RuntimePX, &s->RuntimePY); 
@@ -6550,7 +6557,7 @@ void la_RegenerateWireColors(){
         tnsHSL2RGB(hsl, &MAIN.WireColorCache[i*4]); MAIN.WireColorCache[i*4+3]=t->WireTransparency;
     }
 }
-void la_SendWireVerts(real x1, real y1, real x2, real y2, real circle_r){
+void la_SendWireVerts(real x1, real y1, real x2, real y2, real circle_r, real line_width){
     tnsVector2d v1,vi,v2,v1s,v2s; real dist=0;
     v1[0]=x1; v1[1]=y1; v2[0]=x2; v2[1]=y2;
     tnsInterpolate2dv(v1,v2,0.5,vi);
@@ -6559,15 +6566,39 @@ void la_SendWireVerts(real x1, real y1, real x2, real y2, real circle_r){
     tnsVectorMinus2d(v2s,vi,v2); if(tnsLength2d(v2s)<1e-3){ v2s[0]=1; v2s[1]=0; }else{ tnsNormalizeSelf2d(v2s); } tnsVectorMultiSelf2d(v2s,circle_r);
     tnsVectorAccum2d(v1, v1s); tnsVectorAccum2d(v2, v2s);
 
-    if(MAIN.WireSaggyness<0.01){ tnsVertex2d(v1[0],v1[1]); tnsVertex2d(v2[0],v2[1]); return; }
+    //if(MAIN.WireSaggyness<0.01){ tnsVertex2d(v1[0],v1[1]); tnsVertex2d(v2[0],v2[1]); return; }
 
     int seglen=3, steps=dist/seglen+1; real step=1.0f/steps;
-    tnsVertex2d(v1[0],v1[1]);
+    real* middle=malloc(sizeof(real)*2*(steps+1));
+    real* normal=malloc(sizeof(real)*2*(steps+1));
+    real* final=malloc(sizeof(real)*4*(steps+1));
+    real tangent[2];
+
+    tnsVectorSet2v(&middle[0],v1);
     for(int i=1;i<=steps;i++){
         real ratio=i==steps?1.0f:step*i;
         tnsInterpolateTripple2d(v1,vi,v2,ratio, v1s);
-        tnsVertex2d(v1s[0],v1s[1]);
-    }
+        tnsVectorSet2v(&middle[i*2],v1s);
+    }
+    for(int i=1;i<steps;i++){
+        tnsVectorMinus2d(tangent,&middle[(i+1)*2],&middle[(i-1)*2]);
+        LA_SWAP(real,tangent[0],tangent[1]); tangent[1]*=-1; tnsNormalizeSelf2d(tangent);
+        tnsVectorSet2v(&normal[i*2],tangent);
+    }
+    tnsVectorMinus2d(tangent,&middle[2],&middle[0]);
+    LA_SWAP(real,tangent[0],tangent[1]); tangent[1]*=-1; tnsNormalizeSelf2d(tangent);
+    tnsVectorSet2v(&normal[0],tangent);
+    tnsVectorMinus2d(tangent,&middle[steps*2],&middle[(steps-1)*2]);
+    LA_SWAP(real,tangent[0],tangent[1]); tangent[1]*=-1; tnsNormalizeSelf2d(tangent);
+    tnsVectorSet2v(&normal[steps*2],tangent);
+    real th=line_width;
+    for(int i=0;i<=steps;i++){
+        final[i*4]=  middle[i*2]  +normal[i*2]  *th;
+        final[i*4+1]=middle[i*2+1]+normal[i*2+1]*th;
+        final[i*4+2]=middle[i*2]  -normal[i*2]  *th;
+        final[i*4+3]=middle[i*2+1]-normal[i*2+1]*th;
+    }
+    tnsVertexArray2d(final,(steps+1)*2); tnsPackAs(GL_TRIANGLE_STRIP);
 }
 void la_DrawNodeWires(laUiListDraw* uild){
     if(!uild->SocketRecord.pFirst && !MAIN.tNodeIn->Source){ return; }
@@ -6575,12 +6606,12 @@ void la_DrawNodeWires(laUiListDraw* uild){
 
     tnsUseNoTexture();
 #define _RSLICES 16
-    real v[_RSLICES*4]; int idx[_RSLICES*2+2]; real r=LA_RH2/TNS_MAX2(uild->WiresContainer->Scale,1);
+    real v[_RSLICES*4]; int idx[_RSLICES*2+2]; real r=LA_RH/2.0f/TNS_MAX2(uild->WiresContainer->Scale,1);
     for(laSocketRecord*sr=uild->SocketRecord.pFirst;sr;sr=sr->Item.pNext){
         int cid=sr->In->ColorId%MAIN.WireColorSlices*4;
 
-        int inx=sr->In->RuntimeX+sr->In->RuntimePX, iny=sr->In->RuntimeY+sr->In->RuntimePY;
-        int outx=sr->Out->RuntimeX+sr->Out->RuntimePX, outy=sr->Out->RuntimeY+sr->Out->RuntimePY;
+        real inx=sr->In->RuntimeX+sr->In->RuntimePX, iny=sr->In->RuntimeY+sr->In->RuntimePY;
+        real outx=sr->Out->RuntimeX+sr->Out->RuntimePX, outy=sr->Out->RuntimeY+sr->Out->RuntimePY;
         if(sr->Out==MAIN.tNodeOut){ outx=inx+MAIN.tNodeOut->RuntimeX+MAIN.tNodeOut->RuntimePX; outy=iny+MAIN.tNodeOut->RuntimeY+MAIN.tNodeOut->RuntimePY; }
 
         tnsMakeRing2d(v,idx,_RSLICES, inx, iny, r, r*0.6);
@@ -6595,8 +6626,8 @@ void la_DrawNodeWires(laUiListDraw* uild){
         laNodeInSocket* ins=MAIN.tNodeIn; laNodeOutSocket* outs=ins->Source;
         int cid=ins->ColorId%MAIN.WireColorSlices*4;
 
-        int outx=outs->RuntimeX+outs->RuntimePX, outy=outs->RuntimeY+outs->RuntimePY;
-        int inx=ins->RuntimeX+ins->RuntimePX+outx, iny=ins->RuntimeY+ins->RuntimePY+outy;
+        real outx=outs->RuntimeX+outs->RuntimePX, outy=outs->RuntimeY+outs->RuntimePY;
+        real inx=ins->RuntimeX+ins->RuntimePX+outx, iny=ins->RuntimeY+ins->RuntimePY+outy;
 
         tnsMakeRing2d(v,idx,_RSLICES, inx, iny, r, r*0.6);
         tnsVertexArray2d(v,_RSLICES*2); tnsIndexArray(idx, _RSLICES*2+2);
@@ -6610,28 +6641,26 @@ void la_DrawNodeWires(laUiListDraw* uild){
     tnsFlush();
 
     int ww=MAIN.WireThickness*TNS_MIN2(uild->WiresContainer->Scale,1);
-    glLineWidth(ww);
     for(laSocketRecord*sr=uild->SocketRecord.pFirst;sr;sr=sr->Item.pNext){
         int cid=sr->In->ColorId%MAIN.WireColorSlices*4;
-        int inx=sr->In->RuntimeX+sr->In->RuntimePX, iny=sr->In->RuntimeY+sr->In->RuntimePY;
-        int outx=sr->Out->RuntimeX+sr->Out->RuntimePX, outy=sr->Out->RuntimeY+sr->Out->RuntimePY;
+        real inx=sr->In->RuntimeX+sr->In->RuntimePX, iny=sr->In->RuntimeY+sr->In->RuntimePY;
+        real outx=sr->Out->RuntimeX+sr->Out->RuntimePX, outy=sr->Out->RuntimeY+sr->Out->RuntimePY;
         if(sr->Out==MAIN.tNodeOut){ outx=inx+MAIN.tNodeOut->RuntimeX+MAIN.tNodeOut->RuntimePX; outy=iny+MAIN.tNodeOut->RuntimeY+MAIN.tNodeOut->RuntimePY; }
 
-        la_SendWireVerts(inx, iny, outx, outy, r*0.9);
-        tnsColor4dv(&MAIN.WireColorCache[cid]); tnsPackAs(GL_LINE_STRIP);
+        tnsColor4dv(&MAIN.WireColorCache[cid]); 
+        la_SendWireVerts(inx, iny, outx, outy, r*0.9, ww);
     }
     if(MAIN.tNodeIn->Source){
         laNodeInSocket* ins=MAIN.tNodeIn; laNodeOutSocket* outs=ins->Source;
         int cid=ins->ColorId%MAIN.WireColorSlices*4;
 
-        int outx=outs->RuntimeX+outs->RuntimePX, outy=outs->RuntimeY+outs->RuntimePY;
-        int inx=ins->RuntimeX+ins->RuntimePX+outx, iny=ins->RuntimeY+ins->RuntimePY+outy;
+        real outx=outs->RuntimeX+outs->RuntimePX, outy=outs->RuntimeY+outs->RuntimePY;
+        real inx=ins->RuntimeX+ins->RuntimePX+outx, iny=ins->RuntimeY+ins->RuntimePY+outy;
         
-        la_SendWireVerts(inx, iny, outx, outy, r*0.9);
-        tnsColor4dv(&MAIN.WireColorCache[cid]); tnsPackAs(GL_LINE_STRIP);
+        tnsColor4dv(&MAIN.WireColorCache[cid]);
+        la_SendWireVerts(inx, iny, outx, outy, r*0.9, ww);
     }
     tnsFlush();
-    glLineWidth(1);
 
     la_InitSocketRecord(uild,0);
 }
@@ -6644,7 +6673,7 @@ int la_DrawUiListRecursive(laUiListDraw *uild, laUiList *uil, int L, int R, int
     laBoxedTheme *bt;
     laUiList *sub;
     laUiListDrawItem *uildi;
-    int Ret = 0;
+    int Ret = 0, failed_matrix=0;
 
     if (!uil) return 0;
 
@@ -6652,7 +6681,9 @@ int la_DrawUiListRecursive(laUiListDraw *uild, laUiList *uil, int L, int R, int
 
     ui = uil->UiItems.pFirst;
     if(uil->PanY<0){uil->PanY=0;}
-    if (!la_SetUpUiListMatrix(uild, uil, L, R, LimH, B - U)) return 0;
+    if (!la_SetUpUiListMatrix(uild, uil, L, R-1, LimH, B - U)){
+        if(RegisterNodes){ failed_matrix=1; }else{ return 0; }
+    }
 
     uil->SaveScale=MAIN.UiScale;
     MAIN.UiScale*=uil->Scale;
@@ -6697,7 +6728,7 @@ int la_DrawUiListRecursive(laUiListDraw *uild, laUiList *uil, int L, int R, int
         if (ui->AnimationDistinguish != MAIN.CurrentPanel->FrameDistinguish) Ret = 1;
 
         int NeedDraw=0;
-        if (la_UiInBoundEx(ui, uild)){ NeedDraw=1; }
+        if (la_UiInBoundEx(ui, uild) && !failed_matrix){ NeedDraw=1; }
 
         if(NeedDraw){
             if (!ui->Type->Draw){ la_DrawEmptyUiItem(ui); tnsFlush();
@@ -6816,7 +6847,9 @@ int la_DrawUiListRecursive(laUiListDraw *uild, laUiList *uil, int L, int R, int
 
     if(uild->WiresContainer == uil){ la_DrawNodeWires(uild); }
 
-    la_RestoreLastUiListMatrix(uild, B - U);
+    if(!failed_matrix){
+        la_RestoreLastUiListMatrix(uild, B - U);
+    }
 
     MAIN.UiScale=uil->SaveScale;
     MAIN.ScaledUiRowHeight=MAIN.UiRowHeight*MAIN.UiScale;

+ 36 - 36
resources/la_operators.c

@@ -2163,7 +2163,7 @@ void OPEXT_Panel(laOperator *a, int ExitCode){
 }
 int la_ScrollPanel(laGeneralUiExtraData*ex, laPanel*p, laEvent* e){
     int ret=0;
-    if(ex->TargetIndexVali==4 && e->type==LA_MOUSEMOVE){
+    if(ex->TargetVali==4 && e->type==LA_MOUSEMOVE){
         laUiList* uuil=ex->Ptr1; laUiItem* upui=ex->Ptr2;
         if(upui){ laPanUiListFree(uuil, ex->LastX-e->x, ex->LastY-e->y);
             //if(uuil->HeightCoeff){
@@ -2177,14 +2177,14 @@ int la_ScrollPanel(laGeneralUiExtraData*ex, laPanel*p, laEvent* e){
         laRedrawCurrentPanel();
         ret= 1;
     }
-    if(ex->TargetIndexVali==5 && e->type==LA_MOUSEMOVE){
+    if(ex->TargetVali==5 && e->type==LA_MOUSEMOVE){
         laUiList* uuil=ex->Ptr1; laUiItem* upui=ex->Ptr2;
         if(upui)laScaleUiList(uuil, -(ex->LastY-e->y)*0.005+1, upui->L, upui->R, upui->U, upui->B);
         ex->LastX=e->x; ex->LastY=e->y;
         laRecalcCurrentPanel();
         ret= 1;
     }
-    if(e->type==LA_M_MOUSE_UP){ ex->TargetIndexVali=0; }
+    if(e->type==LA_M_MOUSE_UP){ ex->TargetVali=0; }
     if (e->type & LA_KEY_MOUSE_SCROLL || (e->type==LA_M_MOUSE_DOWN) || (e->key&LA_KEY_PANNING)){
         laUiItem *pui = 0; laListHandle levels={0}; int dir=0;
         if(e->key&LA_KEY_PANNING){
@@ -2199,13 +2199,13 @@ int la_ScrollPanel(laGeneralUiExtraData*ex, laPanel*p, laEvent* e){
         if(e->SpecialKeyBit == LA_KEY_CTRL){
             if(e->type==LA_M_MOUSE_DOWN){
                 while (lip && upui && (!uuil->AllowScale)) { lip=lip->Item.pPrev; uuil=lip->uil;  upui=lip->Item.pPrev?((laUiListRecord*)lip->Item.pPrev)->pui:0; } 
-                if(uuil) { ex->TargetIndexVali=5; ex->Ptr1=uuil; ex->Ptr2=upui; ex->LastX=e->x; ex->LastY=e->y; ret= 1;}
+                if(uuil) { ex->TargetVali=5; ex->Ptr1=uuil; ex->Ptr2=upui; ex->LastX=e->x; ex->LastY=e->y; ret= 1;}
             }else{
             }
         }else{
             if(e->type==LA_M_MOUSE_DOWN){
                 while (lip && upui && (!uuil->AllowScale)) { lip=lip->Item.pPrev; uuil=lip->uil;  upui=lip->Item.pPrev?((laUiListRecord*)lip->Item.pPrev)->pui:0; } 
-                if(uuil) { ex->TargetIndexVali=4; ex->Ptr1=uuil; ex->Ptr2=upui; ex->LastX=e->x; ex->LastY=e->y; ret= 1;}
+                if(uuil) { ex->TargetVali=4; ex->Ptr1=uuil; ex->Ptr2=upui; ex->LastX=e->x; ex->LastY=e->y; ret= 1;}
             }else{
                 while (lip && upui){
                     if(uuil->AllowScale){ if((ran=laScaleUiList(uuil, 1.0f-dir*0.1, upui->L, upui->R, upui->U, upui->B))){ laRecalcCurrentPanel(); break;} }
@@ -2237,7 +2237,7 @@ int OPMOD_Panel(laOperator *a, laEvent *e){
 
     if(MAIN.DockingPanel){ return LA_FINISHED; }
 
-    if (!p->Show || (!laIsInPanel(p, x, y) && !uid->TargetIndexVali)){
+    if (!p->Show || (!laIsInPanel(p, x, y) && !uid->TargetVali)){
         if(p->CloseWhenMovedOut==2){
             if(e->type&LA_STATE_DOWN){
                 la_StopUiOperatorService(p); laDestroySinglePanel(p,0); return LA_FINISHED;
@@ -2261,7 +2261,7 @@ int OPMOD_Panel(laOperator *a, laEvent *e){
     if(p->PanelTemplate && laKeyMapExecuteEvent(a, &p->PanelTemplate->KeyMap, e)) return RET;
 
     int IsTop=laIsTopPanel(p);
-    if ((!IsTop) && (!uid->TargetIndexVali)){
+    if ((!IsTop) && (!uid->TargetVali)){
         laLocalToWindow(0, p, &x, &y);
         dp = laDetectPanel(x, y);
         if (dp && dp->Mode && dp != p){
@@ -2278,7 +2278,7 @@ int OPMOD_Panel(laOperator *a, laEvent *e){
         while(duil=lstPopPointer(&levels));
         if (suil){
             uid->Ptr1 = suil; uid->Ptr2 = pui;
-            uid->TargetIndexVali = 3;
+            uid->TargetVali = 3;
             uid->LastX = e->x; uid->LastY = e->y;
             uid->On=(!pui || e->x>pui->R-LA_SCROLL_W-2*LA_M)?1:0;
             return LA_RUNNING;
@@ -2287,7 +2287,7 @@ int OPMOD_Panel(laOperator *a, laEvent *e){
 
     if(la_ScrollPanel(uid,p,e))return LA_RUNNING;
 
-    if ((!p->Mode) || (!uid->TargetIndexVali)){
+    if ((!p->Mode) || (!uid->TargetVali)){
         if(y<p->UI.U){ ui = la_DetectUiItemRecursive(&p->TitleBar, x, y, 10000, &Locals, 0); }
         elif (!ui && (!NoPrimaryUI)){
             lstClearPointer(&Locals);
@@ -2305,19 +2305,19 @@ int OPMOD_Panel(laOperator *a, laEvent *e){
     }
     lstClearPointer(&Locals);
     
-    if (p->Mode && e->type&LA_MOUSE_EVENT && !uid->TargetIndexVali && !p->IsMenuPanel){
+    if (p->Mode && e->type&LA_MOUSE_EVENT && !uid->TargetVali && !p->IsMenuPanel){
         if (e->x + e->y > p->W + p->H - LA_SCROLL_W*2){
             if((!a->Item.pPrev) && (!p->ShowCorner)){ p->ShowCorner=1; laSetWindowCursor(LA_CORNER);  laRefreshWindow(); }
-            if(e->type==LA_L_MOUSE_DOWN){ uid->TargetIndexVali = 2; uid->LastX=e->x;uid->LastY=e->y; }
+            if(e->type==LA_L_MOUSE_DOWN){ uid->TargetVali = 2; uid->LastX=e->x;uid->LastY=e->y; }
             return LA_RUNNING;
         }else{
             if(p->ShowCorner){ p->ShowCorner=0; laSetWindowCursor(LA_ARROW); laRefreshWindow(); }
-            if(e->type==LA_L_MOUSE_DOWN){  uid->TargetIndexVali = 1; uid->LastX=e->x;uid->LastY=e->y; return LA_RUNNING; }
+            if(e->type==LA_L_MOUSE_DOWN){  uid->TargetVali = 1; uid->LastX=e->x;uid->LastY=e->y; return LA_RUNNING; }
         }
     }
 
     if (e->type == LA_MOUSEMOVE){
-        if (uid->TargetIndexVali == 1){
+        if (uid->TargetVali == 1){
             if (!p->SL && !p->SR) p->TX = p->X + e->x - uid->LastX;
             if (!p->ST && !p->SB) p->TY = p->Y + e->y - uid->LastY;
             laPopPanel(p); laRedrawCurrentWindow(); IsTop=1;
@@ -2325,7 +2325,7 @@ int OPMOD_Panel(laOperator *a, laEvent *e){
             la_EnsurePanelSnapping(p, MAIN.CurrentWindow->CW, MAIN.CurrentWindow->CH);
             laRecalcCurrentPanel();
             return LA_RUNNING;
-        }elif (uid->TargetIndexVali == 2){
+        }elif (uid->TargetVali == 2){
             p->TW += e->x - uid->LastX; p->TH += e->y - uid->LastY;
             uid->LastX = e->x; uid->LastY = e->y;
             p->BoundUi=0;
@@ -2333,12 +2333,12 @@ int OPMOD_Panel(laOperator *a, laEvent *e){
             la_EnsurePanelSnapping(p, MAIN.CurrentWindow->CW, MAIN.CurrentWindow->CH);
             laRecalcCurrentPanel();
             return LA_RUNNING;
-        }elif (uid->TargetIndexVali == 3){
+        }elif (uid->TargetVali == 3){
             laUiList *suil = uid->Ptr1; laUiItem *pui = uid->Ptr2;
             int IsVertical=uid->On;
-            uid->TargetIndexValf+=IsVertical?la_ScrollerVerticalPan(e->y - uid->LastY, p, uid->Ptr1, uid->Ptr2):
+            uid->TargetValf+=IsVertical?la_ScrollerVerticalPan(e->y - uid->LastY, p, uid->Ptr1, uid->Ptr2):
                                         (pui?la_ScrollerHorizontalPan(e->x - uid->LastX, p, uid->Ptr1, uid->Ptr2):0);
-            uid->Dragging = (int)uid->TargetIndexValf; uid->TargetIndexValf-=uid->Dragging;
+            uid->Dragging = (int)uid->TargetValf; uid->TargetValf-=uid->Dragging;
             int pV=uid->Dragging*IsVertical, pH=uid->Dragging*(!IsVertical);
             if (!pui) laPanUiList(suil, pH, pV,0, p->W, suil->U, p->H-LA_M);
             else laPanUiList(suil, pH, pV, suil->L, pui->R-(suil->ScrollerShownV?(LA_SCROLL_W+LA_M):0),
@@ -2350,7 +2350,7 @@ int OPMOD_Panel(laOperator *a, laEvent *e){
     }
 
     if (e->type == LA_L_MOUSE_UP){
-        uid->TargetIndexVali = 0; laSetWindowCursor(LA_ARROW);
+        uid->TargetVali = 0; laSetWindowCursor(LA_ARROW);
         return LA_RUNNING;
     }
 
@@ -2391,26 +2391,26 @@ int OPMOD_MenuPanel(laOperator *a, laEvent *e){
         while(duil=lstPopPointer(&levels));
         if (suil){
             uid->Ptr1 = suil; uid->Ptr2 = pui;
-            uid->TargetIndexVali = 3;
+            uid->TargetVali = 3;
             uid->LastX = e->x; uid->LastY = e->y;
             uid->On=(!pui || e->x>pui->R-LA_SCROLL_W-2*LA_M)?1:0;
             return LA_RUNNING;
         }
     }
-    if (e->type == LA_L_MOUSE_UP && uid->TargetIndexVali == 3){
-        uid->TargetIndexVali = 0;
+    if (e->type == LA_L_MOUSE_UP && uid->TargetVali == 3){
+        uid->TargetVali = 0;
         return LA_RUNNING;
     }
 
     if(la_ScrollPanel(uid,p,e))return LA_RUNNING;
 
     if (e->type == LA_MOUSEMOVE){
-        if (uid->TargetIndexVali == 3){
+        if (uid->TargetVali == 3){
             laUiList *suil = uid->Ptr1; laUiItem *pui = uid->Ptr2;
             int IsVertical=uid->On;
-            uid->TargetIndexValf+=IsVertical?la_ScrollerVerticalPan(e->y - uid->LastY, p, uid->Ptr1, uid->Ptr2):
+            uid->TargetValf+=IsVertical?la_ScrollerVerticalPan(e->y - uid->LastY, p, uid->Ptr1, uid->Ptr2):
                                         (pui?la_ScrollerHorizontalPan(e->x - uid->LastX, p, uid->Ptr1, uid->Ptr2):0);
-            uid->Dragging = (int)uid->TargetIndexValf; uid->TargetIndexValf-=uid->Dragging;
+            uid->Dragging = (int)uid->TargetValf; uid->TargetValf-=uid->Dragging;
             int pV=uid->Dragging*IsVertical, pH=uid->Dragging*(!IsVertical);
             if (!pui) laPanUiList(suil, pH, pV,0, p->W, suil->U, p->H-LA_M);
             else laPanUiList(suil, pH, pV, suil->L, pui->R-(suil->ScrollerShownV?(LA_SCROLL_W+LA_M):0),
@@ -2473,7 +2473,7 @@ int OPMOD_ModalPanel(laOperator *a, laEvent *e){
         return LA_RUNNING_PASS;
     }
 
-    if (!laIsInPanel(p, e->x, e->y) && !uid->TargetIndexVali){ 
+    if (!laIsInPanel(p, e->x, e->y) && !uid->TargetVali){ 
         if(e->type&LA_STATE_DOWN){
             p->AnimationRatio=0; p->AnimationMode=LA_PANEL_ANIMATION_FLASH; laRedrawCurrentPanel();
         }
@@ -2488,7 +2488,7 @@ int OPMOD_ModalPanel(laOperator *a, laEvent *e){
         while(duil=lstPopPointer(&levels));
         if (suil){
             uid->Ptr1 = suil; uid->Ptr2 = pui;
-            uid->TargetIndexVali = 3;
+            uid->TargetVali = 3;
             uid->LastX = e->x; uid->LastY = e->y;
             uid->On=(!pui || e->x>pui->R-LA_SCROLL_W-2*LA_M)?1:0;
             return LA_RUNNING;
@@ -2497,7 +2497,7 @@ int OPMOD_ModalPanel(laOperator *a, laEvent *e){
 
     if(la_ScrollPanel(uid,p,e))return LA_RUNNING;
 
-    if (!uid->TargetIndexVali){
+    if (!uid->TargetVali){
         ui = la_DetectUiItemRecursive(&p->TitleBar, x, y, 10000, &Locals, 0);
         if (!ui){
             lstClearPointer(&Locals);
@@ -2517,19 +2517,19 @@ int OPMOD_ModalPanel(laOperator *a, laEvent *e){
     if (e->type == LA_L_MOUSE_DOWN){
         uid->LastX = e->x;
         uid->LastY = e->y;
-        if(insize){ uid->TargetIndexVali = 2; laSetWindowCursor(LA_CORNER); }
-        else uid->TargetIndexVali = 1;
+        if(insize){ uid->TargetVali = 2; laSetWindowCursor(LA_CORNER); }
+        else uid->TargetVali = 1;
         return LA_RUNNING;
     }
     if (e->type == LA_MOUSEMOVE){
-        if (uid->TargetIndexVali == 1){
+        if (uid->TargetVali == 1){
             if (!p->SL && !p->SR) p->TX = p->X + e->x - uid->LastX;
             if (!p->ST && !p->SB) p->TY = p->Y + e->y - uid->LastY;
             laNotifyUsersPPPath(&p->PP, "position");
             la_EnsurePanelSnapping(p, MAIN.CurrentWindow->CW, MAIN.CurrentWindow->CH);
             laRecalcCurrentPanel();
             return LA_RUNNING;
-        }elif (uid->TargetIndexVali == 2){
+        }elif (uid->TargetVali == 2){
             p->TW += e->x - uid->LastX; p->TH += e->y - uid->LastY;
             uid->LastX = e->x; uid->LastY = e->y;
             p->BoundUi=0;
@@ -2537,12 +2537,12 @@ int OPMOD_ModalPanel(laOperator *a, laEvent *e){
             la_EnsurePanelSnapping(p, MAIN.CurrentWindow->CW, MAIN.CurrentWindow->CH);
             laRecalcCurrentPanel();
             return LA_RUNNING;
-        }elif (uid->TargetIndexVali == 3){
+        }elif (uid->TargetVali == 3){
             laUiList *suil = uid->Ptr1; laUiItem *pui = uid->Ptr2;
             int IsVertical=uid->On;
-            uid->TargetIndexValf+=IsVertical?la_ScrollerVerticalPan(e->y - uid->LastY, p, uid->Ptr1, uid->Ptr2):
+            uid->TargetValf+=IsVertical?la_ScrollerVerticalPan(e->y - uid->LastY, p, uid->Ptr1, uid->Ptr2):
                                         (pui?la_ScrollerHorizontalPan(e->x - uid->LastX, p, uid->Ptr1, uid->Ptr2):0);
-            uid->Dragging = (int)uid->TargetIndexValf; uid->TargetIndexValf-=uid->Dragging;
+            uid->Dragging = (int)uid->TargetValf; uid->TargetValf-=uid->Dragging;
             int pV=uid->Dragging*IsVertical, pH=uid->Dragging*(!IsVertical);
             if (!pui) laPanUiList(suil, pH, pV,0, p->W, suil->U, p->H-LA_M);
             else laPanUiList(suil, pH, pV, suil->L, pui->R-(suil->ScrollerShownV?(LA_SCROLL_W+LA_M):0),
@@ -2551,10 +2551,10 @@ int OPMOD_ModalPanel(laOperator *a, laEvent *e){
             laRedrawCurrentPanel();
             return LA_RUNNING;
         }
-        if(uid->TargetIndexVali==2){laSetWindowCursor(LA_CORNER);}
+        if(uid->TargetVali==2){laSetWindowCursor(LA_CORNER);}
     }
     if (e->type == LA_L_MOUSE_UP){
-        uid->TargetIndexVali = 0; laSetWindowCursor(LA_ARROW);
+        uid->TargetVali = 0; laSetWindowCursor(LA_ARROW);
         return LA_RUNNING;
     }
 

+ 45 - 45
resources/la_widgets.c

@@ -839,9 +839,7 @@ void la_FloatDraw(laUiItem *ui, int h){
             verts[0]=ctrx; verts[1]=ctry;
             tnsColor4dv(laThemeColor(bt,ui->State));
             tnsVertexArray2d(verts,26); tnsPackAs(GL_TRIANGLE_FAN);
-            tnsMakeCircle2d(verts,24,ctrx,ctry,radius,0);
-            tnsColor4dv(laThemeColor(bt,LA_BT_BORDER));
-            tnsVertexArray2d(verts,24); tnsPackAs(GL_LINE_LOOP);
+
             if(Ranged){
                 real arc[52];  int arcindex[26]; // 12 slices 13 ends
                 real range,rstart;
@@ -861,6 +859,10 @@ void la_FloatDraw(laUiItem *ui, int h){
                 tnsColor4dv(laThemeColor(bt,LA_BT_BORDER));
                 tnsPackAs(GL_LINE_STRIP);
             }
+
+            tnsMakeCircle2d(verts,24,ctrx,ctry,radius,0);
+            tnsColor4dv(laThemeColor(bt,LA_BT_BORDER));
+            tnsVertexArray2d(verts,24); tnsPackAs(GL_LINE_LOOP);
         }else{
             if(!NoDecal){
                 sw=la_GetBoxOffset(bt,ui->State);
@@ -1499,7 +1501,7 @@ void la_NodeSocketDraw(laUiItem *ui, int h){
         la_DrawBoxAuto(ui->L,ui->R,ui->U,ui->B,bt,LA_BT_NORMAL,ColorBkg);
     }
 
-    int tl,tr,tu,sl,sr,su;
+    real tl,tr,tu,sl,sr,su;
     if(ui->Flags&LA_UI_SOCKET_LABEL_N){ tl=ui->L; tu=ui->U; tr=ui->R; sl=ui->L; sr=ui->R; su=ui->U+LA_RH; }
     elif(ui->Flags&LA_UI_SOCKET_LABEL_S){ tl=ui->L; tu=ui->U+LA_RH; tr=ui->R; sl=ui->L; sr=ui->R; su=ui->U; }
     elif(ui->Flags&LA_UI_SOCKET_LABEL_W){ tl=ui->L; tu=ui->U; tr=tl+LA_2RH; sl=ui->L+LA_2RH; sr=ui->R; su=ui->U; }
@@ -2371,7 +2373,7 @@ int OPINV_Tab(laOperator *a, laEvent *e){
     a->CustomData = ui->Extra;
 
     uit = a->CustomData;
-    uit->TargetIndexVali = count;
+    uit->TargetVali = count;
 
     return LA_RUNNING;
 }
@@ -2392,7 +2394,8 @@ 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_VERTICAL_SLIDER;
+    int IsKnob = ui->Flags&LA_UI_FLAGS_NODE_CONTAINER;
+    int SliderVertical = ui->Flags&LA_UI_FLAGS_VERTICAL_SLIDER;
 
     if (!laIsInUiItem(ui, a, e->x, e->y) && !ui->Extra->On){
         ui->State = LA_UI_NORMAL;
@@ -2427,7 +2430,7 @@ int OPMOD_IntArrayHorizon(laOperator *a, laEvent *e){
         ui->Extra->On = (IsVertical ? la_DetectRow(ui, e->y) : la_DetectColumn(ui, e->x, Len)) + 1;
         if (ui->Extra->On > Len) return LA_RUNNING;
         laGetIntArray(&ui->PP, TmpArr);
-        uit->TargetIndexValf = TmpArr[ui->Extra->On - 1];
+        uit->TargetValf = TmpArr[ui->Extra->On - 1];
         laRedrawCurrentPanel();
         return LA_RUNNING;
     }
@@ -2435,16 +2438,15 @@ int OPMOD_IntArrayHorizon(laOperator *a, laEvent *e){
         if(ui->Extra->Edit){ return LA_RUNNING; }
         int dist=abs(e->x - uit->LastX + uit->LastY - e->y);
         if (dist > MAIN.ValuatorThreshold || uit->Dragging){
-            int min,max,Ranged = laGetIntRange(&ui->PP, &min, &max); 
-            int UseRange = (Ranged&&!IsKnob); real step=ip->Step; if(UseRange){ step=(real)(max-min)/(ui->R-ui->L); }
-            if(Ranged){ TNS_CLAMP(step,(max-min)/500,INT_MAX); }
-            int delta=e->x-uit->LastX; if(IsKnob){ int dy=uit->LastY-e->y; delta=delta+dy; }
-            if(UseRange || (abs(delta) > MAIN.ValuatorThreshold)){
-                if((!uit->Dragging ) || !(UseRange)) delta=delta>0?1:-1;
-                uit->TargetIndexValf += delta*step;
-                laSetIntArraySingle(&ui->PP, ui->Extra->On - 1, uit->TargetIndexValf);
-                uit->LastX = e->x;
-                uit->LastY = e->y;
+            int min,max; int Ranged = laGetIntRange(&ui->PP, &min, &max);
+            int sliderlen=SliderVertical?(ui->B-ui->U):((ui->R-ui->L)); if(IsKnob){ sliderlen=LA_RH*5; }
+            real step=ip->Step; if(Ranged){ step=(real)(max-min)/sliderlen; } if(e->SpecialKeyBit&LA_KEY_SHIFT){ step/=10; }
+            laGetIntArray(&ui->PP, TmpArr);
+            if(!uit->Dragging) { uit->TargetValf = TmpArr[ui->Extra->On - 1]; }
+            int delta=(SliderVertical?uit->LastY-e->y:e->x-uit->LastX)+(IsKnob?uit->LastY-e->y:0);
+            if(delta!=0){
+                if((!uit->Dragging ) && (!Ranged)) delta=delta>0?1:-1;
+                laSetIntArraySingle(&ui->PP, ui->Extra->On-1, round(uit->TargetValf+delta*step));
             }
             uit->Dragging = 1;
             laRedrawCurrentPanel();
@@ -2456,7 +2458,7 @@ int OPMOD_IntArrayHorizon(laOperator *a, laEvent *e){
         if (uit->Dragging){
             if (ui->Extra->On){
                 ui->Extra->On = 0;
-                laConfirmInt(a, uit->TargetIndexVali, LA_CONFIRM_DATA);
+                laConfirmInt(a, uit->TargetVali, LA_CONFIRM_DATA);
                 laRecordAndPushProp(&ui->PP,0); laMarkPropChanged(&ui->PP);
             }
         }else if(ui->Extra->On){
@@ -2465,8 +2467,8 @@ int OPMOD_IntArrayHorizon(laOperator *a, laEvent *e){
                 char buf[32] = {0};
                 uit->On=SelectOn;
                 laGetIntArray(&ui->PP, TmpArr);
-                uit->TargetIndexVali = TmpArr[ui->Extra->On - 1];
-                strPrintIntAfter(buf, 32, uit->TargetIndexVali);
+                uit->TargetVali = TmpArr[ui->Extra->On - 1];
+                strPrintIntAfter(buf, 32, uit->TargetVali);
                 strBeginEdit(&uit->Edit,buf);
                 strSelectLineAll(uit->Edit); la_DisplayKeyboard(1);
             }
@@ -2539,7 +2541,8 @@ 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_VERTICAL_SLIDER;
+    int IsKnob = ui->Flags&LA_UI_FLAGS_NODE_CONTAINER;
+    int SliderVertical = ui->Flags&LA_UI_FLAGS_VERTICAL_SLIDER;
 
     if (!laIsInUiItem(ui, a, e->x, e->y) && !ui->Extra->On && !NoTooltip){
         ui->State = LA_UI_NORMAL;
@@ -2574,7 +2577,7 @@ int OPMOD_FloatArrayHorizon(laOperator *a, laEvent *e){
         ui->Extra->On = (IsVertical ? la_DetectRow(ui, e->y) : la_DetectColumn(ui, e->x, Len)) + 1;
         if (ui->Extra->On > Len) return LA_RUNNING;
         laGetFloatArray(&ui->PP, TmpArr);
-        uit->TargetIndexValf = TmpArr[ui->Extra->On - 1];
+        uit->TargetValf = TmpArr[ui->Extra->On - 1];
         laRedrawCurrentPanel();
 
         return LA_RUNNING;
@@ -2583,18 +2586,15 @@ int OPMOD_FloatArrayHorizon(laOperator *a, laEvent *e){
         if(uit->Edit){ return LA_RUNNING; }
         int dist=abs(e->x - uit->LastX - e->y + uit->LastY);
         if (dist > MAIN.ValuatorThreshold || uit->Dragging){
-            real min,max; int Ranged = laGetFloatRange(&ui->PP, &min, &max); 
-            int UseRange = (Ranged&&!IsKnob); real step=fp->Step; if(UseRange){ step=(max-min)/(ui->R-ui->L); }
-            if(Ranged){ TNS_CLAMP(step,(max-min)/500,INT_MAX); }
+            real min,max; int Ranged = laGetFloatRange(&ui->PP, &min, &max);
+            int sliderlen=SliderVertical?(ui->B-ui->U):((ui->R-ui->L)); if(IsKnob){ sliderlen=LA_RH*5; }
+            real step=fp->Step; if(Ranged){ step=(max-min)/sliderlen; } if(e->SpecialKeyBit&LA_KEY_SHIFT){ step/=10; }
             laGetFloatArray(&ui->PP, TmpArr);
-            uit->TargetIndexValf = TmpArr[ui->Extra->On - 1];
-            int delta=e->x-uit->LastX; if(IsKnob){ int dy=uit->LastY-e->y; delta=delta+dy; }
-            if(UseRange || (abs(delta) > MAIN.ValuatorThreshold)){
-                if((!uit->Dragging ) || !(UseRange)) delta=delta>0?1:-1;
-                uit->TargetIndexValf +=  delta*step;
-                laSetFloatArraySingle(&ui->PP, ui->Extra->On - 1, uit->TargetIndexValf);
-                uit->LastX = e->x;
-                uit->LastY = e->y;
+            if(!uit->Dragging) { uit->TargetValf = TmpArr[ui->Extra->On - 1]; }
+            int delta=(SliderVertical?uit->LastY-e->y:e->x-uit->LastX)+(IsKnob?uit->LastY-e->y:0);
+            if(delta!=0){
+                if((!uit->Dragging ) && (!Ranged)) delta=delta>0?1:-1;
+                laSetFloatArraySingle(&ui->PP, ui->Extra->On-1, uit->TargetValf+delta*step);
             }
             uit->Dragging = 1;
             laRedrawCurrentPanel();
@@ -2606,7 +2606,7 @@ int OPMOD_FloatArrayHorizon(laOperator *a, laEvent *e){
         if (uit->Dragging){
             if (ui->Extra->On){
                 ui->Extra->On = 0;
-                laConfirmFloat(a, uit->TargetIndexValf, LA_CONFIRM_DATA);
+                laConfirmFloat(a, uit->TargetValf, LA_CONFIRM_DATA);
                 laRecordAndPushProp(&ui->PP,0); laMarkPropChanged(&ui->PP);
             }
         }else if(ui->Extra->On){
@@ -2615,8 +2615,8 @@ int OPMOD_FloatArrayHorizon(laOperator *a, laEvent *e){
                 char buf[32] = {0};
                 uit->On=SelectOn;
                 laGetFloatArray(&ui->PP, TmpArr);
-                uit->TargetIndexValf = TmpArr[ui->Extra->On - 1];
-                strPrintFloatAfter(buf, 32, 5, IsRad?deg(uit->TargetIndexValf):uit->TargetIndexValf);
+                uit->TargetValf = TmpArr[ui->Extra->On - 1];
+                strPrintFloatAfter(buf, 32, 5, IsRad?deg(uit->TargetValf):uit->TargetValf);
                 strBeginEdit(&uit->Edit,buf);
                 strSelectLineAll(uit->Edit); la_DisplayKeyboard(1);
             }
@@ -2738,14 +2738,14 @@ int OPMOD_ColorHCY(laOperator *a, laEvent *e){
     }
 
     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;
+        es->Dragging=3; es->LastX=e->x; es->LastY=e->y; es->TargetVali=ui->Extent; return LA_RUNNING;
     }
     if(es->Dragging==3){
-        if(e->type==LA_MOUSEMOVE){ ui->Extent=es->TargetIndexVali+((real)e->y-es->LastY+0.5)/LA_RH;
+        if(e->type==LA_MOUSEMOVE){ ui->Extent=es->TargetVali+((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; ui->Extent=es->TargetIndexVali; laRecalcCurrentPanel(); }
+            es->Dragging=0; ui->Extent=es->TargetVali; laRecalcCurrentPanel(); }
         return LA_RUNNING;
     }
 
@@ -3188,7 +3188,7 @@ 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; ui->Extent=es->TargetIndexVali; laRecalcCurrentPanel();la_SetMultistringViewRange(ui,es->Edit,bt); }
+            if(es->Dragging){ es->Dragging=0; ui->Extent=es->TargetVali; laRecalcCurrentPanel();la_SetMultistringViewRange(ui,es->Edit,bt); }
             return LA_FINISHED;
         }
     }
@@ -3196,15 +3196,15 @@ int OPMOD_MultiString(laOperator *a, laEvent *e){
     if(laKeyMapExecuteEventEx(a, &ui->ExtraPP, &ui->Type->KeyMapper, e)) 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=1; es->LastX=e->x; es->LastY=e->y; es->TargetIndexVali=ui->Extent;
+        es->Dragging=1; es->LastX=e->x; es->LastY=e->y; es->TargetVali=ui->Extent;
         return LA_RUNNING;
     }
     if(es->Dragging){
-        if(e->type==LA_MOUSEMOVE){ ui->Extent=es->TargetIndexVali+((real)e->y-es->LastY+0.5)/LA_RH;
+        if(e->type==LA_MOUSEMOVE){ ui->Extent=es->TargetVali+((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; ui->Extent=es->TargetIndexVali; laRecalcCurrentPanel();la_SetMultistringViewRange(ui,se,bt); }
+            es->Dragging=0; ui->Extent=es->TargetVali; laRecalcCurrentPanel();la_SetMultistringViewRange(ui,se,bt); }
         return LA_RUNNING;
     }
     
@@ -3566,12 +3566,12 @@ 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; ui->Extent=1;
+        uit->Dragging=1; uit->LastY=e->y; uit->On=0; uit->TargetVali=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 && 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;
+        int diff=e->y-uit->LastY; diff=((real)diff+0.5)/(ui->B-ui->U); int delta=uit->TargetVali;
         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;
     }

+ 3 - 3
resources/la_widgets_viewers.c

@@ -814,14 +814,14 @@ int OPMOD_Canvas(laOperator *a, laEvent *e){
 
     if(e->type&LA_MOUSE_EVENT){
         if(e->type == LA_L_MOUSE_DOWN && ui->Expand>=0 && e->x>ui->R-LA_M-LA_RH && e->y>ui->B-LA_M-LA_RH){
-            ex->Dragging=1; ex->ClickedX=e->x; ex->ClickedY=e->y; ex->TargetIndexVali=ui->Expand;
+            ex->Dragging=1; ex->ClickedX=e->x; ex->ClickedY=e->y; ex->TargetVali=ui->Expand;
             return LA_RUNNING;
         }
         if(ex->Dragging==1){
-            if(e->type==LA_MOUSEMOVE){ ui->Expand=ex->TargetIndexVali+((real)e->y-ex->ClickedY+0.5)/LA_RH;
+            if(e->type==LA_MOUSEMOVE){ ui->Expand=ex->TargetVali+((real)e->y-ex->ClickedY+0.5)/LA_RH;
                 if(ex->HeightCoeff<1) ex->HeightCoeff=1; laRecalcCurrentPanel(); }
             elif(e->type==LA_L_MOUSE_UP){ ex->Dragging=0; }
-            elif(e->type==LA_R_MOUSE_DOWN){ ex->Dragging=0; ui->Expand=ex->TargetIndexVali; laRecalcCurrentPanel(); }
+            elif(e->type==LA_R_MOUSE_DOWN){ ex->Dragging=0; ui->Expand=ex->TargetVali; laRecalcCurrentPanel(); }
             return LA_RUNNING;
         }