*/}}
Parcourir la source

Scrolling polishing

YimingWu il y a 3 mois
Parent
commit
08e4ca1ba4

+ 4 - 3
la_interface.h

@@ -807,7 +807,9 @@ STRUCTURE(laUiList){
     laListItem Item;
     int L, R, U, B;
     int TL, TR, TU, TB;
-    real PanX, PanY; //Pan Up/Left Is Positive
+    int FL,FR,FU,FB; // Final cropped border in panel coord
+    int LimH; // After UI calc
+    real PanX, PanY; // Pan Up/Left Is Positive
     laListHandle UiItems;
     laListHandle Columns;
     laListHandle *ShareColumns;
@@ -849,7 +851,6 @@ STRUCTURE(laUiListDrawItem){
     laListItem Item;
     laUiList *Target;
     int L, R, U, B, XP, YP, DifX, DifY;
-    int ExtraPanX;
     real Scale;
 };
 
@@ -2592,7 +2593,7 @@ void la_RefreshThemeColor(laTheme* th);
 #define LA_COLOR3_TO_HEX(c) (((int)((c)[0]*255)<<16)|((int)((c)[1]*255)<<8)|((int)((c)[2]*255)<<0))
 #define LA_COLOR3_TO_RGB(c) (RGB((int)((c)[0]*255),(int)((c)[1]*255),(int)((c)[2]*255)))
 
-int laIsInUiItem(laUiItem *ui, int x, int y);
+int laIsInUiItem(laUiItem *ui, laOperator* a, int x, int y);
 int laIsInBound(int x, int y, int l, int r, int u, int b);
 laUiItem *la_DetectUiItemRecursive(laUiList *uil, int x, int y, int LimB, laListHandle *LocalBuf, int Deep);
 laUiItem *la_DetectSocketRecursive(laUiList* uil, int x, int y, int LimB, laPropContainer* PCInOrOut);

+ 155 - 96
la_kernel.c

@@ -2340,7 +2340,7 @@ void la_RefreshProofingLut(){
 }
 
 //I FUCKING HATE THIS STUPID FUNCTION
-int la_SetUpUiListMatrix(laUiListDraw *uild, laUiList *Target, int _L, int _R, int LimH, int PanelH, int GlobalX, int GlobalY){
+int la_SetUpUiListMatrix(laUiListDraw *uild, laUiList *Target, int _L, int _R, int LimH, int PanelH){
     laUiListDrawItem *uildi = memAcquireSimple(sizeof(laUiListDrawItem));
     laUiListDrawItem *last = uild->Items.pFirst;
     int LimW=_R-_L;
@@ -2350,8 +2350,15 @@ int la_SetUpUiListMatrix(laUiListDraw *uild, laUiList *Target, int _L, int _R, i
 
     uildi->Target = Target;
 
+    // uildi->
+    //   XP,YP total pan
+    //   LRUB border after previous pan
+    //   SLRUB border after clamping
+    //   DifXY clamped distance
+    //   
+
     //if (Target__B - Target->U > LimH) Target__B = Target->U + LimH;
-    if (Target__R - Target->L > LimW) Target__R = Target->L + LimW;
+    //if (Target__R - Target->L > LimW) Target__R = Target->L + LimW;
 
     uildi->XP = last ? last->XP + Target->PanX : Target->PanX;
     uildi->YP = last ? last->YP + Target->PanY : Target->PanY;
@@ -2363,27 +2370,23 @@ int la_SetUpUiListMatrix(laUiListDraw *uild, laUiList *Target, int _L, int _R, i
 
     if (uildi->B - uildi->U > LimH) uildi->B = Target->U + LimH;
 
-    uildi->L -= GlobalX;
-    uildi->R -= GlobalX;
-    uildi->U -= GlobalY;
-    uildi->B -= GlobalY;
-
     SL = last ? (uildi->L < last->L ? last->L : uildi->L) : uildi->L;
     SR = last ? (uildi->R > last->R ? last->R : uildi->R) : uildi->R;
     SU = last ? (uildi->U < last->U ? last->U : uildi->U) : uildi->U;
     SB = last ? (uildi->B > last->B ? last->B : uildi->B) : uildi->B;
 
+    if(SL<_L) SL=_L;
+    if(SR>_R) SR=_R;
+
     uildi->DifX = SL - uildi->L;
     uildi->DifY = SU - uildi->U;
 
     uildi->L = SL;
-    uildi->R = SR+uildi->DifX;
+    uildi->R = SR;
     uildi->U = SU;
-    uildi->B = SB;//+uildi->DifY;
-    if(uildi->R>_R){ uildi->R=_R; }
-    if(uildi->B-SU>LimH){ uildi->B=SU+LimH; }
+    uildi->B = SB;
 
-    //printf("py %f %d lb %d b %d limh %d sb%d\n",Target->PanY,uildi->U,last?last->B:0,uildi->B,LimH,SB);
+    if(uildi->B-SU>LimH){ uildi->B=SU+LimH; }
 
     if(uildi->R - uildi->L<=0 || uildi->B - uildi->U<=0){
         memFree(uildi);
@@ -2503,9 +2506,9 @@ void la_ClearUiListMatrix(laUiListDraw *uild){
 }
 
 int la_UpdateUiListRecursive(laUiList *uil, int U, int L, int R, int B, int Fast, laPanel *ParentPanel);
-int la_DrawUiListRecursive(laUiListDraw *uild, laUiList *uil, int L, int R, int U, int B, int LimH, int ConditionStackLevel, int GlobalX, int GlobalY, int RegisterNodes);
+int la_DrawUiListRecursive(laUiListDraw *uild, laUiList *uil, int L, int R, int U, int B, int LimH, int ConditionStackLevel, int RegisterNodes);
 void la_DestroyUiList(laUiList *uil, int NoFree, int RemoveUsers, int OnlyRemoveUser);
-void la_DrawUiListScrollerV(laUiList *uil, int DisplayOffset, int TotalH, int DisplayH, int UiR);
+void la_DrawUiListScrollerV(laUiList *uil, int DisplayOffset, int TotalH, int DisplayedH, int UiR, int BarTop, int BarBottom);
 int la_TestUiListMinumWidth(laUiList *uil);
 
 void la_PanelValidateWidth(laPanel *p, laUiList *ui){
@@ -2781,10 +2784,6 @@ void la_PanelDefDraw(laWindow *w, laPanel *p, laBoxedTheme *bt){
         la_SetPropMathcerContext(p);
         MAIN.CurrentPanel = p;
 
-        //if(p->Refresh&(LA_TAG_REDRAW|LA_TAG_RECALC)){
-        //    printf("Draw %0xld (%s)\n", p, p->Title?p->Title->Ptr:0);
-        //}
-
         if (p->Refresh & LA_TAG_RECALC){
             laRecalcPanelImmediate(p);
         }
@@ -2794,8 +2793,14 @@ void la_PanelDefDraw(laWindow *w, laPanel *p, laBoxedTheme *bt){
                 la_PanelDrawToOffsceen(p, &p->UI);
                 la_SetupUiListLimitMatrix(&uild, 0, p->W, 0, p->H, p->H);
                 la_PanelBackgroundInit(p, bt);
+
+                tnsUseImmShader(); tnsEnableShaderv(T->immShader);
+                tnsUniformOutputColorSpace(T->immShader,0);
+                tnsUniformShowColorOverflowStripes(T->immShader,0);
+                tnsUniformColorComposing(T->immShader,0,0,0,0);
+
                 int extrap=(p->Mode && (!p->IsMenuPanel))?p->TitleBar.B:0;
-                la_DrawUiListScrollerV(&p->UI, p->UI.PanY, p->UI.B-p->UI.U, p->H-LA_M*2-extrap, p->W);
+                la_DrawUiListScrollerV(&p->UI, p->UI.PanY, p->UI.B-p->UI.U, p->H-extrap, p->W, p->UI.U+LA_M,p->H-LA_M*2);
                 tnsFlush();
 
                 if(((p->UI.B>p->H) && (!p->UI.ScrollerShownV))||
@@ -2803,8 +2808,8 @@ void la_PanelDefDraw(laWindow *w, laPanel *p, laBoxedTheme *bt){
                     p->UI.ScrollerShownV=!p->UI.ScrollerShownV;
                     DrawState_++;
                 }
-                if(p->UI.PanY && p->UI.B-p->UI.PanY<p->H-LA_M){
-                    p->UI.PanY = (p->UI.B-p->H/*-bt->BM-bt->TM*/-p->TitleBar.B);
+                if(p->UI.PanY && p->UI.B-p->UI.PanY < p->H - LA_M){
+                    p->UI.PanY = (p->UI.B-p->H+LA_M);
                     if(p->UI.PanY<0){p->UI.PanY=0;}
                     DrawState_++;
                 }
@@ -2815,9 +2820,9 @@ void la_PanelDefDraw(laWindow *w, laPanel *p, laBoxedTheme *bt){
                 else { p->Refresh = LA_TAG_ANIMATION; laRefreshWindow(); }
                 if (!la_AnimateUiListRecursive(&p->UI)){ p->Refresh = p->Refresh; if(p->Refresh){ laRefreshWindow(); } }
                 else { p->Refresh = LA_TAG_ANIMATION; laRefreshWindow(); }
-                DrawState_ += la_DrawUiListRecursive(&uild, &p->TitleBar, 0, p->W, 0, p->H, 10000, -1, 0, 0, 0);
+                DrawState_ += la_DrawUiListRecursive(&uild, &p->TitleBar, 0, p->W, 0, p->H, 10000, -1, 0);
                 if(p!=w->MaximizedUiPanel){
-                    DrawState_ += la_DrawUiListRecursive(&uild, &p->UI, 0, p->W, 0, p->H, 10000, -1, 0, 0, 0);
+                    DrawState_ += la_DrawUiListRecursive(&uild, &p->UI, 0, p->W, 0, p->H, 10000, -1, 0);
                 }else{
                     tnsViewportWithScissor(0,0,p->W,p->H); tnsOrtho(0,p->W,p->H,0,-100,100);
                     tnsDrawStringAutoM("Canvas is maximized",0,laThemeColor(bt,LA_BT_TEXT),
@@ -2832,7 +2837,7 @@ void la_PanelDefDraw(laWindow *w, laPanel *p, laBoxedTheme *bt){
                 la_SetupUiListLimitMatrix(&uild, 0, p->W, 0, p->H, p->H);
                 la_PanelBackgroundInit(p, bt);
                 la_DrawUiListScrollerV(p->MenuRefer, p->MenuRefer->PanY,
-                    p->MenuRefer->B-p->MenuRefer->U-LA_M*2, p->H-LA_M*3, p->W);
+                    p->MenuRefer->B-p->MenuRefer->U-LA_M*2, p->H-LA_M*3, p->W, p->MenuRefer->U+LA_M,p->H-LA_M*2);
                 tnsFlush();
 
                 if(((p->MenuRefer->TB>p->H-LA_M) && (!p->MenuRefer->ScrollerShownV))||
@@ -2850,7 +2855,7 @@ void la_PanelDefDraw(laWindow *w, laPanel *p, laBoxedTheme *bt){
 
                 if (!la_AnimateUiListRecursive(p->MenuRefer)) p->Refresh = 0;
                 else { p->Refresh = LA_TAG_ANIMATION; laRefreshWindow(); }
-                DrawState_ += la_DrawUiListRecursive(&uild, p->MenuRefer, 0, p->W, 0, p->H, 10000, -1, 0, 0, 0);
+                DrawState_ += la_DrawUiListRecursive(&uild, p->MenuRefer, 0, p->W, 0, p->H, 10000, -1, 0);
                 if (DrawState_){ p->Refresh = LA_TAG_RECALC; laRefreshWindow(); }
             }
         }
@@ -3246,7 +3251,7 @@ void la_WindowDefDraw(laWindow *w, laBoxedTheme *bt){
         if(!(ui->Flags&LA_UI_FLAGS_NO_OVERLAY)){
             laUiListDraw uild = {0}; for (laUiList* sub = ui->Subs.pFirst; sub; sub = sub->Item.pNext){
                 tnsFlush();
-                DrawState_+=la_DrawUiListRecursive(&uild, sub, ui->L, ui->R, ui->U, ui->B, 10000, 0, 0, 0, 0);
+                DrawState_+=la_DrawUiListRecursive(&uild, sub, ui->L, ui->R, ui->U, ui->B, 10000, 0, 0);
             }
         }
         if (DrawState_){ p->Refresh = LA_TAG_RECALC; laRefreshWindow(); }
@@ -4337,31 +4342,43 @@ int laIsTopPanel(laPanel *p){
     //}
     return 0;
 }
-void laWindowToLocal(laOperator *a, laPanel *p, int *x, int *y){
-    if(!p) return;
+void laPanelToLocal(laOperator *a, int *x, int *y){
     int ix = *x, iy = *y;
     laListItemPointer *lip;
-    laOperator *ai = a;
-    (*x) = ix - ((MAIN.CurrentWindow->MaximizedUiPanel==p)?0: p->X);
-    (*y) = iy - ((MAIN.CurrentWindow->MaximizedUiPanel==p)?0: p->Y);
     if (a){
-        for (lip = ai->LocalUiLists.pFirst; lip; lip = lip->pNext){
+    //printf("\n");
+        int SL,SR,SU,SB; int PX=0,PY=0;
+        for (lip = a->LocalUiLists.pLast; lip; lip = lip->pPrev){
             laUiList *uil = lip->p;
-            (*x) += uil->PanX;
-            (*y) += uil->PanY;
+            if(lip->pNext){
+                int PadR=(uil->AllowScale && uil->ScrollerShownV)?LA_SCROLL_W+LA_M*4:0;
+                int PadB=(uil->AllowScale && uil->ScrollerShownH)?LA_SCROLL_W+LA_M*3:0;
+                int UseB=uil->LimH?uil->U+uil->LimH:uil->B;
+                SL=TNS_MAX2(SL,uil->L); SR=TNS_MIN2(SR-PadR,uil->R);
+                SU=TNS_MAX2(SU,uil->U); SB=TNS_MIN2(SB-PadB,UseB);
+                SL+=uil->PanX; SR+=uil->PanX; SU+=uil->PanY; SB+=uil->PanY;
+            }else{
+                SL=uil->L+uil->PanX;SR=uil->R+uil->PanX;SU=uil->U+uil->PanY;SB=uil->B+uil->PanY;
+            }
+            PX += uil->PanX; PY += uil->PanY;
+            //printf("u %d %d %d %d %s\n",uil->L,uil->R,uil->U,uil->B,SSTR(uil->TabName));
+        }
+        (*x)+=PX; (*y)+=PY;
+        lip=a->LocalUiLists.pFirst; if(lip){
+            laUiList *uil = lip->p;
+            uil->FL=SL; uil->FR=SR; uil->FU=SU; uil->FB=SB;
+            //printf("uil limit %d %d | %d %d %d %d %d %d\n",*x,*y,uil->FL,uil->FR,uil->FU,uil->FB,PX,PY);
         }
     }
 }
-void laPanelToLocal(laOperator *a, int *x, int *y){
+void laWindowToLocal(laOperator *a, laPanel *p, int *x, int *y){
+    if(!p) return;
     int ix = *x, iy = *y;
     laListItemPointer *lip;
-    if (a){
-        for (lip = a->LocalUiLists.pFirst; lip; lip = lip->pNext){
-            laUiList *uil = lip->p;
-            (*x) += uil->PanX;
-            (*y) += uil->PanY;
-        }
-    }
+    laOperator *ai = a;
+    (*x) = ix - ((MAIN.CurrentWindow->MaximizedUiPanel==p)?0: p->X);
+    (*y) = iy - ((MAIN.CurrentWindow->MaximizedUiPanel==p)?0: p->Y);
+    laPanelToLocal(a,x,y);
 }
 void laLocalToWindow(laOperator *a, laPanel *p, int *x, int *y){
     if(!p) return;
@@ -6186,6 +6203,7 @@ int la_UpdateUiListRecursive(laUiList *uil, int U, int L, int R, int B, int Fast
                         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->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->U - (NoDecal?0:LA_M);
                     int subh = ui->TB-ui->TU-LA_RH-LA_M*2;
                     if((ui->Page->TR>ui->TR-(NoDecal?0:LA_M) && (!ui->Page->ScrollerShownH)) ||
                         (ui->Page->TR<=ui->TR-(NoDecal?0:LA_M) && ui->Page->ScrollerShownH)){
@@ -6371,24 +6389,28 @@ void la_DrawUiListArrows(laUiList *uil, int L, int R, int U, int B, real* color)
     if(uil->B-uil->PanY>B){ tnsDrawStringAuto("▽", color, mx-LA_RH2, mx+LA_RH2, B-LA_RH, LA_TEXT_ALIGN_CENTER); }
     tnsFlush();
 }
-void la_DrawUiListScrollerV(laUiList *uil, int DisplayOffset, int TotalH, int DisplayH, int UiR){
+void la_DrawUiListScrollerV(laUiList *uil, int DisplayOffset, int TotalH, int DisplayedH, int UiR, int BarTop, int BarBottom){
     if(!uil->ScrollerShownV) return;
     
     int W = LA_SCROLL_W, RM=LA_M;
-    int Len = (int)((real)DisplayH / (real)TotalH * (real)DisplayH);
-    int Offset = (int)((real)DisplayOffset / (real)TotalH * (real)DisplayH);
-    int U = uil->U + Offset;
+    int DrawH = (BarBottom-BarTop);
+    int Len = (int)((real)DisplayedH / (real)TotalH * (real)DrawH);
+    int Offset = (int)((real)DisplayOffset / (real)TotalH * (real)DrawH);
+
+    int U = BarTop + Offset;
     int B = U + Len;
     int L = UiR - RM*2 - W;
     int R = L + W;
 
-    if (B > U + DisplayH) B = U + DisplayH;
-    if (U < uil->U) U = uil->U;
+    if (B > BarBottom) B = BarBottom;
+    if (U < BarTop) U = BarTop;
+    Len=B-U;
 
-    if (B <= uil->U || U >= uil->B) return;
+    if(Len < LA_RH0){ int Sub=(LA_RH0-Len)/2; U-=Sub; B+=(LA_RH0-Len-Sub); }
+    if(U < BarTop){ int Sub=BarTop-U; U+=Sub; B+=Sub; }
+    if(B > BarBottom){ int Sub=B-BarBottom; B-=Sub; U-=Sub; }
 
-    if (B > uil->U + DisplayH) B = uil->U + DisplayH;
-    if (U < uil->U) U = uil->U;
+    if (U < BarTop) U = BarTop;
 
     tnsUseNoTexture();
 
@@ -6396,16 +6418,16 @@ void la_DrawUiListScrollerV(laUiList *uil, int DisplayOffset, int TotalH, int Di
     real* color=laThemeColor(bt, LA_BT_TEXT);
 
     tnsColor4d(LA_COLOR3(color), 0.2);
-    tnsVertex2d(R-RM, uil->U);
-    tnsVertex2d(L+RM, uil->U);
-    tnsVertex2d(L+RM, uil->U + DisplayH);
-    tnsVertex2d(R-RM, uil->U + DisplayH);
+    tnsVertex2d(R-RM, BarTop);
+    tnsVertex2d(L+RM, BarTop);
+    tnsVertex2d(L+RM, BarBottom);
+    tnsVertex2d(R-RM, BarBottom);
     tnsPackAs(GL_TRIANGLE_FAN);
     tnsColor4d(LA_COLOR3(color), 0.5);
-    tnsVertex2d(R-RM, uil->U);
-    tnsVertex2d(L+RM, uil->U);
-    tnsVertex2d(L+RM, uil->U + DisplayH);
-    tnsVertex2d(R-RM, uil->U + DisplayH);
+    tnsVertex2d(R-RM, BarTop);
+    tnsVertex2d(L+RM, BarTop);
+    tnsVertex2d(L+RM, BarBottom);
+    tnsVertex2d(R-RM, BarBottom);
     tnsPackAs(GL_LINE_LOOP);
 
     tnsColor4d(LA_COLOR3(color), 1);
@@ -6416,43 +6438,46 @@ void la_DrawUiListScrollerV(laUiList *uil, int DisplayOffset, int TotalH, int Di
     tnsPackAs(GL_TRIANGLE_FAN);
 
     int HU=(U+B)/2+LA_RH2;
-    tnsDrawStringAuto("",laThemeColor(bt, LA_BT_BORDER),L-100,R+100,HU,LA_TEXT_REVERT_Y|LA_TEXT_ALIGN_CENTER);
+    tnsDrawStringAuto("",laThemeColor(bt, LA_BT_BORDER),L-100,R+100,HU,LA_TEXT_REVERT_Y|LA_TEXT_ALIGN_CENTER);
     tnsFlush();
 }
-void la_DrawUiListScrollerH(laUiList *uil, int DisplayOffset, int TotalW, int DisplayW, int UiB){
+void la_DrawUiListScrollerH(laUiList *uil, int DisplayOffset, int TotalW, int DisplayW, int UiB, int BarLeft, int BarRight){
     if(!uil->ScrollerShownH) return;
     
     int W = LA_SCROLL_W,RM=LA_M;
-    int Len = (int)((real)DisplayW / (real)TotalW * (real)DisplayW);
-    int Offset = (int)((real)DisplayOffset / (real)TotalW * (real)DisplayW);
-    int L = uil->L + Offset;
+    int DrawW = (BarRight-BarLeft);
+    int Len = (int)((real)DisplayW / (real)TotalW * (real)DrawW);
+    int Offset = (int)((real)DisplayOffset / (real)TotalW * (real)DrawW);
+    int L = BarLeft + Offset;
     int R = L + Len;
     int U = UiB - RM - W;
     int B = U + W;
 
-    if (B > U + DisplayW) B = U + DisplayW;
-    if (U < uil->U) U = uil->U;
+    if (R > BarRight) R = BarRight;
+    if (L < BarLeft) L = BarLeft;
+    Len=R-L;
 
-    if (R <= uil->L || L >= uil->R) return;
+    if(Len < LA_RH0){ int Sub=(LA_RH0-Len)/2; L-=Sub; R+=(LA_RH0-Len-Sub); }
+    if(L < BarLeft){ int Sub=BarLeft-L; L+=Sub; R+=Sub; }
+    if(R > BarRight){ int Sub=R-BarRight; R-=Sub; L-=Sub; }
 
-    if (R > uil->L + DisplayW) R = uil->L + DisplayW;
-    if (L < uil->L) L = uil->L;
+    if (L < BarLeft) L = BarLeft;
 
     tnsUseNoTexture();
 
     laBoxedTheme* bt=_LA_THEME_PANEL;
     real* color=laThemeColor(bt, LA_BT_TEXT);
     tnsColor4d(LA_COLOR3(color), 0.2);
-    tnsVertex2d(uil->L,U+RM);
-    tnsVertex2d(uil->L,B-RM);
-    tnsVertex2d(uil->L + DisplayW,B-RM);
-    tnsVertex2d(uil->L + DisplayW,U+RM);
+    tnsVertex2d(BarLeft,U+RM);
+    tnsVertex2d(BarLeft,B-RM);
+    tnsVertex2d(BarRight,B-RM);
+    tnsVertex2d(BarRight,U+RM);
     tnsPackAs(GL_TRIANGLE_FAN);
     tnsColor4d(LA_COLOR3(color), 0.5);
-    tnsVertex2d(uil->L,U+RM);
-    tnsVertex2d(uil->L,B-RM);
-    tnsVertex2d(uil->L + DisplayW,B-RM);
-    tnsVertex2d(uil->L + DisplayW,U+RM);
+    tnsVertex2d(BarLeft,U+RM);
+    tnsVertex2d(BarLeft,B-RM);
+    tnsVertex2d(BarRight,B-RM);
+    tnsVertex2d(BarRight,U+RM);
     tnsPackAs(GL_LINE_LOOP);
 
     tnsColor4d(LA_COLOR3(color), 1);
@@ -6463,7 +6488,7 @@ void la_DrawUiListScrollerH(laUiList *uil, int DisplayOffset, int TotalW, int Di
     tnsPackAs(GL_TRIANGLE_FAN);
 
     int HU=(U+B)/2+LA_RH2;
-    tnsDrawStringAuto("",laThemeColor(bt, LA_BT_BORDER),L-100,R+100,HU,LA_TEXT_REVERT_Y|LA_TEXT_ALIGN_CENTER);
+    tnsDrawStringAuto("⠶⠶",laThemeColor(bt, LA_BT_BORDER),L-100,R+100,HU,LA_TEXT_REVERT_Y|LA_TEXT_ALIGN_CENTER);
     tnsFlush();
 }
 void la_DrawInstanceBkg(laUiList *uil, real* color, int LP, int RP){
@@ -6595,7 +6620,7 @@ void la_SwitchThemeQuick(laTheme* t, laTheme* DefaultTheme){
     if(!DefaultTheme){return;} MAIN.CurrentTheme = t?t:DefaultTheme; t=MAIN.CurrentTheme;
     for(laBoxedTheme* bt = t->BoxedThemes.pFirst;bt;bt=bt->Item.pNext){ (*bt->BackRef) = bt; }
 }
-int la_DrawUiListRecursive(laUiListDraw *uild, laUiList *uil, int L, int R, int U, int B, int LimH, int ConditionStackLevel, int GlobalX, int GlobalY, int RegisterNodes){
+int la_DrawUiListRecursive(laUiListDraw *uild, laUiList *uil, int L, int R, int U, int B, int LimH, int ConditionStackLevel, int RegisterNodes){
     laUiItem *ui;
     laBoxedTheme *bt;
     laUiList *sub;
@@ -6608,7 +6633,7 @@ 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, GlobalX, GlobalY)) return 0;
+    if (!la_SetUpUiListMatrix(uild, uil, L, R, LimH, B - U)) return 0;
 
     uil->SaveScale=MAIN.UiScale;
     MAIN.UiScale*=uil->Scale;
@@ -6680,15 +6705,33 @@ int la_DrawUiListRecursive(laUiListDraw *uild, laUiList *uil, int L, int R, int
                 ui->Type == _LA_UI_COLLECTION_SINGLE ||
                 ui->Type == _LA_UI_COLLECTION_SELECTOR && (ui->Subs.pFirst || ui->Page)){
                 if (!ui->Page){ ui = ui->Item.pNext; continue; }
-                tnsFlush(); int DoNodes=RegisterNodes; int NoDecal=ui->Flags&LA_UI_FLAGS_NO_DECAL; int SidePad=NoDecal?-LA_M:LA_M;
+                tnsFlush(); int DoNodes=RegisterNodes; int NoDecal=ui->Flags&LA_UI_FLAGS_NO_DECAL;
+                int SidePad=NoDecal?-LA_M:LA_M;
+                int RightPad=(ui->Page->ScrollerShownV?LA_SCROLL_W+LA_M*2:0);
+                int BottomPad=(ui->Page->ScrollerShownH?LA_SCROLL_W+LA_M:0);
+
                 if(ui->Flags&LA_UI_FLAGS_NODE_CONTAINER){ la_InitSocketRecord(uild, ui->Page); DoNodes=1; }
-                Ret += la_DrawUiListRecursive(uild, ui->Page, ui->L+SidePad, ui->R-SidePad, U, B,
-                    (ui->Page->HeightCoeff ? ui->B - ui->Page->U : 10000) -(NoDecal?0:LA_M), ConditionStackLevel, GlobalX, GlobalY, DoNodes);
-                if (ui->Page->ScrollerShownH){ la_DrawUiListScrollerH(ui->Page, ui->Page->PanX,
-                    ui->Page->R-ui->Page->L-LA_M*2, ui->R-ui->Page->L-LA_M*2-(ui->Page->ScrollerShownV?LA_SCROLL_W:0),ui->B); }
-                if (ui->Page->HeightCoeff) la_DrawUiListScrollerV(ui->Page, ui->Page->PanY,
-                    ui->Page->B-ui->Page->U-(NoDecal?0:LA_M-LA_M), ui->B-ui->Page->U-(NoDecal?0:LA_M-LA_M)-(ui->Page->ScrollerShownH?LA_SCROLL_W+LA_M:0),ui->R);
+
+                int LimH=(ui->Page->HeightCoeff ? ui->B - ui->Page->U : 10000);
+
+                Ret += la_DrawUiListRecursive(uild, ui->Page, ui->L+SidePad, ui->R-SidePad-RightPad,
+                    U, B, LimH-(NoDecal?0:LA_M)-BottomPad, ConditionStackLevel, DoNodes);
+                
+                if (ui->Page->ScrollerShownH){
+                    int PadBottom=(ui->Page->ScrollerShownH?LA_SCROLL_W+LA_M:0);
+                    int PadRight=(ui->Page->ScrollerShownV?LA_SCROLL_W+LA_M:0);
+                    la_DrawUiListScrollerH(ui->Page, ui->Page->PanX,
+                        ui->Page->R-ui->Page->L, ui->R-ui->L-PadRight,ui->B,
+                        ui->L+LA_M, ui->R-LA_M-PadRight);
+                }
+                if (ui->Page->HeightCoeff){
+                    int PadBottom=(ui->Page->ScrollerShownH?LA_SCROLL_W:0);
+                    la_DrawUiListScrollerV(ui->Page, ui->Page->PanY,
+                        ui->Page->B-ui->Page->U, ui->B-ui->Page->U-PadBottom,ui->R,
+                        ui->Page->U+LA_M,ui->B-LA_M-PadBottom);
+                }
                 if (ui->Page->AllowScale){ la_DrawUiListArrows(ui->Page,ui->L, ui->R, ui->Page->U, ui->B-LA_SCROLL_W-LA_M*2, laThemeColor(bt, LA_BT_BORDER)); }
+            
             }elif (ui->Type == _LA_UI_COLLECTION){
                 int CanGetState = laCanGetState(ui->PP.LastPs->p);
                 int CanGetTheme = laCanGetTheme(ui->PP.LastPs->p);laTheme* OriginalTheme=MAIN.CurrentTheme;
@@ -6727,17 +6770,18 @@ int la_DrawUiListRecursive(laUiListDraw *uild, laUiList *uil, int L, int R, int
                     }
 
                     tnsFlush();
-                    Ret += la_DrawUiListRecursive(uild, sub, L, R, U, B, 10000, ConditionStackLevel, GlobalX, GlobalY, RegisterNodes);
+                    Ret += la_DrawUiListRecursive(uild, sub, L, R, U, B, 10000, ConditionStackLevel, RegisterNodes);
                     
                     if(CanGetTheme){ la_SwitchThemeQuick(0, OriginalTheme); }
                 }
                 //ui->PP.EndInstance = Active;
                 ui->PP.EndInstance = SaveInstance;
+            
             }elif (ui->Type == _LA_UI_CANVAS){
                 if(!(ui->Flags&LA_UI_FLAGS_NO_OVERLAY)){
                     for (sub = ui->Subs.pFirst; sub; sub = sub->Item.pNext){
                         tnsFlush();
-                        Ret += la_DrawUiListRecursive(uild, sub, L-1, R+1, U-1, B+1, ui->B-LA_M*2-LA_M*2, ConditionStackLevel, GlobalX, GlobalY, RegisterNodes);
+                        Ret += la_DrawUiListRecursive(uild, sub, L-1, R+1, U-1, B+1, ui->B-LA_M*2-LA_M*2, ConditionStackLevel, RegisterNodes);
                     }
                 }
             }
@@ -6772,8 +6816,20 @@ int la_DrawPanelScrollBarV(int L, int R, int U, int B, real Total, real Range, r
     tnsVertex2d(L + 3, End);
     tnsPackAs(GL_LINE_LOOP);
 }
-int laIsInUiItem(laUiItem *ui, int x, int y){
+
+int la_RejectByUiList(laOperator* a, int x, int y){
+    laListItemPointer* lip=a->LocalUiLists.pFirst;
+    if(lip){ laUiList* uil=lip->p;
+        if(uil->FL!=uil->FR && (x < uil->FL || y < uil->FU || x > uil->FR || y > uil->FB)){
+            //printf("rejected %d %d | %d %d %d %d\n",x,y,uil->FL,uil->FR,uil->FU,uil->FB);
+            return 1;
+        }
+    }
+    return 0;
+}
+int laIsInUiItem(laUiItem *ui, laOperator* a, int x, int y){
     if (x < ui->L || x > ui->R || y < ui->U || y > ui->B) return 0;
+    if (a && la_RejectByUiList(a,x,y)) return 0;
     return 1;
 }
 int laIsInBound(int x, int y, int l, int r, int u, int b){
@@ -6817,7 +6873,7 @@ laUiItem *la_DetectUiItemRecursive(laUiList *uil, int x, int y, int LimB, laList
             continue;
         }else if (ui->Type == _LA_UI_CONDITION_TOGGLE){
             laConditionUiExtraData *cued = ui->Extra;
-            if (laIsInUiItem(ui, x, y)){
+            if (laIsInUiItem(ui, 0, x, y)){
                 lstAppendPointer(LocalBuf, uil);
                 return ui;
             }
@@ -6834,7 +6890,7 @@ laUiItem *la_DetectUiItemRecursive(laUiList *uil, int x, int y, int LimB, laList
         //printf("%s > ",ui->Type->Identifier?ui->Type->Identifier:"-");
 
         if (ui->Type != _LA_UI_COLLECTION && ui->Type != _LA_UI_COLLECTION_SINGLE &&
-            ui->Type != _LA_UI_FIXED_GROUP && ui->Type != _LA_UI_TAB && ui->Type != _LA_UI_CANVAS && laIsInUiItem(ui, x, y)){
+            ui->Type != _LA_UI_FIXED_GROUP && ui->Type != _LA_UI_TAB && ui->Type != _LA_UI_CANVAS && laIsInUiItem(ui, 0, x, y)){
             int Add=1; if(ui->Type==_LA_UI_COLUMN_ADJUSTER){
                 if(!la_DetectSplit(ui->C, x)) Add=0;
             }
@@ -6849,24 +6905,25 @@ laUiItem *la_DetectUiItemRecursive(laUiList *uil, int x, int y, int LimB, laList
                     lstAppendPointer(LocalBuf, uil);
                     return tui;
                 }
-            }else if (laIsInUiItem(ui, x, y)){
+            }else if (laIsInUiItem(ui, 0, x, y)){
                 lstAppendPointer(LocalBuf, uil);return ui;
             }
         }
         if (ui->Type == _LA_UI_COLLECTION || ui->Type==_LA_UI_COLLECTION_SINGLE){
-            if (laIsInUiItem(ui, x, y)){
-                lstAppendPointer(LocalBuf, uil);
+            if (laIsInUiItem(ui, 0, x, y)){
                 if (ui->Subs.pFirst) ((laUiList *)ui->Subs.pFirst)->HeightCoeff = LimB;
                 if(Deep){
                     for(laUiList* iuil=ui->Subs.pFirst;iuil;iuil=iuil->Item.pNext){
                         if (laIsInBound(x, y, iuil->L, iuil->R, iuil->U, iuil->B)){
                             if (tui = la_DetectUiItemRecursive(iuil, x , y , iuil->B, LocalBuf, Deep)){
                                 lstAppendPointer(LocalBuf, iuil);
+                                lstAppendPointer(LocalBuf, uil);
                                 return tui;
                             }
                         }
                     }
                 }
+                lstAppendPointer(LocalBuf, uil);
                 return ui;
             }
         }
@@ -6879,7 +6936,7 @@ laUiItem *la_DetectUiItemRecursive(laUiList *uil, int x, int y, int LimB, laList
                     }
                 }
             }
-            if (laIsInUiItem(ui, x, y)){
+            if (laIsInUiItem(ui, 0, x, y)){
                 lstAppendPointer(LocalBuf, uil);
                 return ui;
             }
@@ -7990,6 +8047,8 @@ int la_HandleSingleEvent(laEvent *e, laListHandle *Operators){
 
     la_DestroyConfirmData(&MAIN.InvokeConfirmData);
 
+    //la_PrintOperatorStack();
+
     while (1){
         if (!a) break;
         

+ 2 - 2
la_util.c

@@ -905,14 +905,14 @@ void lstClearPointer(laListHandle *h){
     }
 }
 void lstGeneratePointerList(laListHandle *from1, laListHandle *from2, laListHandle *to){
-    laListItemPointer *lip = from2 ? from2->pLast : 0;
+    laListItemPointer *lip = from1 ? from1->pLast : 0;
 
     while (lip){
         lstPushPointer(to, lip->p);
         lip = lip->pPrev;
     }
 
-    lip = from1 ? from1->pLast : 0;
+    lip = from2 ? from2->pLast : 0;
 
     while (lip){
         lstPushPointer(to, lip->p);

+ 5 - 2
resources/la_operators.c

@@ -2080,7 +2080,10 @@ int la_ScrollPanel(laGeneralUiExtraData*ex, laPanel*p, laEvent* e){
                                 uuil->U, upui->B-LA_M-(uuil->ScrollerShownH?(LA_SCROLL_W+LA_M):0)))) break; }
                     lip=lip->Item.pPrev; uuil=lip->uil;  upui=lip->Item.pPrev?((laUiListRecord*)lip->Item.pPrev)->pui:0; 
                 }
-                if(!ran) laPanUiListAuto(p->MenuRefer?p->MenuRefer:&p->UI, 0, dir*MAIN.ScrollingSpeed*LA_RH, 0, p->W, p->TitleBar.B+LA_M, p->H-LA_M);
+                if(!ran){
+                    laUiList* pan_uil=p->MenuRefer?p->MenuRefer:&p->UI;
+                    laPanUiListAuto(pan_uil, 0, dir*MAIN.ScrollingSpeed*LA_RH, 0, p->W, pan_uil->U, p->H-LA_M);
+                }
                 laRedrawCurrentPanel();
                 ret= 1;
             }
@@ -2151,7 +2154,7 @@ int OPMOD_Panel(laOperator *a, laEvent *e){
     if(la_ScrollPanel(uid,p,e))return LA_RUNNING;
 
     if (!p->Mode || (IsTop && !uid->TargetIndexVali)){
-        if(y<p->TitleBar.B){ ui = la_DetectUiItemRecursive(&p->TitleBar, x, y, 10000, &Locals, 0); }
+        if(y<p->UI.U){ ui = la_DetectUiItemRecursive(&p->TitleBar, x, y, 10000, &Locals, 0); }
         elif (!ui && (!NoPrimaryUI)){
             lstClearPointer(&Locals);
             ui = la_DetectUiItemRecursive(&p->UI, x, y, 10000, &Locals, 0);

+ 1 - 1
resources/la_properties.c

@@ -1822,7 +1822,7 @@ void la_RegisterInternalProps(){
             }
             ep = laAddEnumProperty(p, "save_preferences_on_exit", "Save On Exit", "Save user preferences before exiting the program", 0,0,0,0,0,offsetof(LA, SavePreferenceOnExit), 0,0,0,0,0,0,0,0,0,0);{
                 laAddEnumItemAs(ep, "NONE", "Don't save", "Not saving user preferences on exit", 0,0);
-                laAddEnumItemAs(ep, "SAVE", "Save", "Saving user preferences on exit", 1, 0);
+                laAddEnumItemAs(ep, "SAVE", "Save", "Saving user preferences on exit", 1, U'✓');
             }
         
             laAddIntProperty(p, "wacom_device_stylus", "Stylus Device", "Wacom stylus device ID", LA_WIDGET_INT_PLAIN, 0,0,0,0,0,0,0,offsetof(LA, WacomDeviceStylus), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY|LA_UDF_IGNORE);

+ 2 - 2
resources/la_templates.c

@@ -1242,7 +1242,7 @@ void laui_RackPage(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn
     laUiItem* b=laOnConditionThat(uil,c,laPropExpression(This,"has_rack"));{
         laUiItem* g=laMakeGroup(uil,c,"Racks",0);{ g->Flags|=/*LA_UI_FLAGS_NO_GAP|LA_UI_FLAGS_NO_DECAL|*/LA_UI_FLAGS_NODE_CONTAINER;
             laUiList* gu=g->Page; laColumn* gc=laFirstColumn(gu); gu->AllowScale=1; g->State=LA_UI_ACTIVE; gu->HeightCoeff=-1; 
-            laUiItem* hui=laShowItemFull(gu,gc,This,"racks",0,0,laui_NodeRack,r?r->RackType:0); hui->Expand=15; //hui->Flags|=LA_UI_FLAGS_NO_DECAL;
+            laUiItem* hui=laShowItemFull(gu,gc,This,"racks",0,0,laui_NodeRack,r?r->RackType:0); hui->Expand=15; hui->Flags|=LA_UI_FLAGS_NO_DECAL;
         }
     }laElse(uil,b);{
         laShowItemFull(uil,c,This,"add_rack",0,0,0,0);
@@ -1282,7 +1282,7 @@ void laui_UserPreference(laUiList *uil, laPropPack *Base, laPropPack *OperatorIn
     muil = laMakeMenuPage(uil, cr, "☰ Menu"); mc = laFirstColumn(muil);
     laShowItem(muil, mc, 0, "LA_restore_factory");
     laUiItem* ui=laShowLabel(uil,cl,"Save on exit:",0,0); ui->Expand=1; ui->Flags|=LA_TEXT_ALIGN_RIGHT;
-    laShowItemFull(uil,cl,0,"la.user_preferences.save_preferences_on_exit",LA_WIDGET_ENUM_HIGHLIGHT,"text=🞆",0,0);
+    laShowItemFull(uil,cl,0,"la.user_preferences.save_preferences_on_exit",LA_WIDGET_ENUM_HIGHLIGHT,0,0,0)->Flags|=LA_UI_FLAGS_ICON;
     laEndRow(uil,b);
     laShowItem(uil, cr, 0, "LA_save_user_preferences")->Expand = 1;
 

+ 25 - 29
resources/la_widgets.c

@@ -2260,11 +2260,6 @@ int la_DetectColumn(laUiItem *ui, int LocalX, int Total){
     return (int)((real)(LocalX - ui->L) / (real)(ui->R - ui->L) * (real)Total);
 }
 
-int la_RejectByUiList(laUiItem*ui, laOperator* a, laEvent* e){
-    laListItemPointer* lip=a->LocalUiLists.pLast; if(!lip) return 0;
-    laUiList* uil=lip->p;
-}
-
 laColumn *la_DetectSplit(laColumn *Root, int LocalX){
     laColumn *result = 0;
     if (!Root->LS) return 0;
@@ -2390,7 +2385,7 @@ int OPMOD_IntArrayHorizon(laOperator *a, laEvent *e){
     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;
 
-    if (!laIsInUiItem(ui, e->x, e->y) && !ui->Extra->On){
+    if (!laIsInUiItem(ui, a, e->x, e->y) && !ui->Extra->On){
         ui->State = LA_UI_NORMAL;
         if (ui->Extra) ui->Extra->On = 0;
         laRedrawCurrentPanel();
@@ -2408,7 +2403,7 @@ int OPMOD_IntArrayHorizon(laOperator *a, laEvent *e){
     if (e->type == LA_L_MOUSE_DOWN){
         if (laIsPropertyReadOnly(&ui->PP)) return LA_RUNNING_PASS;
         if (uit->Edit){
-            if (!laIsInUiItem(ui, e->x, e->y)){
+            if (!laIsInUiItem(ui, a, e->x, e->y)){
                 strEndEdit(&uit->Edit, 1);
                 uit->On = 0;
                 laRedrawCurrentPanel(); la_DisplayKeyboard(0);
@@ -2513,7 +2508,7 @@ int OPMOD_FloatArrayHorizon(laOperator *a, laEvent *e){
     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;
 
-    if (!laIsInUiItem(ui, e->x, e->y) && !ui->Extra->On && !NoTooltip){
+    if (!laIsInUiItem(ui, a, e->x, e->y) && !ui->Extra->On && !NoTooltip){
         ui->State = LA_UI_NORMAL;
         ui->Extra->On = 0;
         laRedrawCurrentPanel();
@@ -2530,7 +2525,7 @@ int OPMOD_FloatArrayHorizon(laOperator *a, laEvent *e){
 
     if (e->type == LA_L_MOUSE_DOWN){
         if (uit->Edit){
-            if (!laIsInUiItem(ui, e->x, e->y)){
+            if (!laIsInUiItem(ui, a, e->x, e->y)){
                 strEndEdit(&uit->Edit, 1);
                 uit->On = 0;
                 laRedrawCurrentPanel(); la_DisplayKeyboard(0);
@@ -2631,7 +2626,7 @@ int OPMOD_FloatColor(laOperator *a, laEvent *e){
     int NoEvent = ui->Flags&LA_UI_FLAGS_NO_EVENT;
     int NoTooltip=ui->Flags&LA_UI_FLAGS_NO_TOOLTIP;
 
-    if (!laIsInUiItem(ui, e->x, e->y)){
+    if (!laIsInUiItem(ui, a, e->x, e->y)){
         return LA_FINISHED_PASS;
     }
 
@@ -2679,7 +2674,7 @@ int OPMOD_ColorHCY(laOperator *a, laEvent *e){
     real PickerPos[2];
     real abso;
 
-    if (!laIsInUiItem(ui, e->x, e->y) && !es->Dragging){
+    if (!laIsInUiItem(ui, a, e->x, e->y) && !es->Dragging){
         return LA_FINISHED_PASS;
     }
 
@@ -2766,7 +2761,7 @@ int OPMOD_EnumSelector(laOperator *a, laEvent *e){
         return LA_RUNNING;
     }
 
-    if (!laIsInUiItem(ui, e->x, e->y) && !uit->On){ return LA_FINISHED_PASS; }
+    if (!laIsInUiItem(ui, a, e->x, e->y) && !uit->On){ return LA_FINISHED_PASS; }
     
     if (e->type == LA_TIME_IDLE && !NoTooltip && !uit->On){
         int GX = e->x, GY = e->y; laLocalToWindow(a, a->ToPanel, &GX, &GY);
@@ -2855,7 +2850,7 @@ int OPMOD_Button(laOperator *a, laEvent *e){
 
     if ((e->type == LA_KEY_DOWN && e->key==LA_KEY_ESCAPE) || e->type == LA_INPUT) return LA_FINISHED; //debug
 
-    if (!laIsInUiItem(ui, e->x, e->y) /*&& ui->State!= LA_UI_ACTIVE*/){
+    if (!laIsInUiItem(ui, a, e->x, e->y) /*&& ui->State!= LA_UI_ACTIVE*/){
         ui->State = LA_UI_NORMAL;
         laRedrawCurrentPanel();
         return LA_FINISHED_PASS;
@@ -2950,7 +2945,7 @@ int OPMOD_MenuItem(laOperator *a, laEvent *e){
         return LA_RUNNING_PASS;
     }
 
-    if (!laIsInUiItem(ui, e->x, e->y) && ui->State != LA_UI_ACTIVE){
+    if (!laIsInUiItem(ui, a, e->x, e->y) && ui->State != LA_UI_ACTIVE){
         ui->State = LA_UI_NORMAL;
         laRedrawCurrentPanel();
         return LA_FINISHED_PASS;
@@ -2975,7 +2970,7 @@ int OPMOD_ConditionToggle(laOperator *a, laEvent *e){
     laGeneralUiExtraData *uit = a->CustomData;
     int Away = 0;
 
-    if (!laIsInUiItem(ui, e->x, e->y) /*&& ui->State!= LA_UI_ACTIVE*/){
+    if (!laIsInUiItem(ui, a, e->x, e->y) /*&& ui->State!= LA_UI_ACTIVE*/){
         return LA_FINISHED_PASS;
     }
 
@@ -2999,7 +2994,7 @@ int OPMOD_SingleLineString(laOperator *a, laEvent *e){
     int IsTerminal=ui->Flags&LA_UI_FLAGS_TERMINAL_INPUT;
     int ImmediateInput=ui->Flags&LA_UI_FLAGS_IMMEDIATE_INPUT;
 
-    if (!laIsInUiItem(ui, e->x, e->y)){
+    if (!laIsInUiItem(ui, a, e->x, e->y)){
         if (ui->State != LA_UI_EDITING){
             ui->State = LA_UI_NORMAL;
             laRedrawCurrentPanel();
@@ -3102,7 +3097,7 @@ int OPMOD_MultiString(laOperator *a, laEvent *e){
     int NoEvent = ui->Flags&LA_UI_FLAGS_NO_EVENT;
     int NoTooltip=ui->Flags&LA_UI_FLAGS_NO_TOOLTIP;
 
-    if (!laIsInUiItem(ui, e->x, e->y) && !es->Dragging){
+    if (!laIsInUiItem(ui, a, e->x, e->y) && !es->Dragging){
         if ((e->type & LA_MOUSEDOWN) == LA_MOUSEDOWN){
             buf=strGetEditString(es->Edit, 0); laSetString(&ui->PP, buf); free(buf);
             laRecordAndPushProp(&ui->PP,0); laMarkPropChanged(&ui->PP);
@@ -3218,7 +3213,7 @@ int OPMOD_Collection(laOperator *a, laEvent *e) {
   laUiList *ToUil =
       a->ToPanel->MenuRefer ? a->ToPanel->MenuRefer : &a->ToPanel->UI;
 
-  if (!laIsInUiItem(ui, e->x, e->y) /* || e->y>(ui->Subs.pFirst?((laUiList*)ui->Subs.pFirst)->HeightCoeff:10000)*/){
+  if (!laIsInUiItem(ui, a, e->x, e->y) /* || e->y>(ui->Subs.pFirst?((laUiList*)ui->Subs.pFirst)->HeightCoeff:10000)*/){
     return LA_FINISHED_PASS;
   }
 
@@ -3227,11 +3222,12 @@ int OPMOD_Collection(laOperator *a, laEvent *e) {
     return LA_FINISHED_PASS;
   }
   uil = la_DetectUiListRecursive(ToUil, lx, ly, 10000, 0, 0, 0, 0, 0);
-  if (uil != ((laUiListDrawItem *)a->LocalUiLists.pFirst)->Target) {
-    //printf("%d %d EXITC\n",((laUiListDrawItem *)a->LocalUiLists.pFirst)->Target, uil);
-    return LA_FINISHED;
-  }
-
+  //if (uil != ((laUiListDrawItem *)a->LocalUiLists.pFirst)->Target) {
+  //  printf("%d %d EXITC\n",((laUiListDrawItem *)a->LocalUiLists.pFirst)->Target->U, uil->U);
+  //  uil = la_DetectUiListRecursive(ToUil, lx, ly, 10000, 0, 0, 0, 0, 0);
+  //  return LA_FINISHED;
+  //}
+//
   if (e->type & LA_MOUSE_EVENT) {
     laUiList *sub;
     laUiItem *tui;
@@ -3315,7 +3311,7 @@ int OPMOD_CollectionSelector(laOperator *a, laEvent *e){
         return LA_RUNNING_PASS;
     }
 
-    if (!laIsInUiItem(ui, e->x, e->y)){
+    if (!laIsInUiItem(ui, a, e->x, e->y)){
         return LA_FINISHED;
     }
 
@@ -3372,7 +3368,7 @@ int OPMOD_ColumnAdjuster(laOperator *a, laEvent *e){
 
     c = uit->Ptr1 ? uit->Ptr1 : la_DetectSplit(ui->C, e->x);
     if(c){ laSetWindowCursor(LA_LEFT_AND_RIGHT); }else{ laSetWindowCursor(LA_ARROW); }
-    if ((!uit->Dragging) && (!laIsInUiItem(ui, e->x, e->y)||!c)){
+    if ((!uit->Dragging) && (!laIsInUiItem(ui, a, e->x, e->y)||!c)){
         //printf("done\n");
         laSetWindowCursor(LA_ARROW);
         return LA_FINISHED_PASS;
@@ -3417,7 +3413,7 @@ int OPMOD_NodeSocket(laOperator *a, laEvent *e){
     if(pc==LA_PC_SOCKET_IN)   { PCFind=LA_PC_SOCKET_OUT; }
     elif(pc==LA_PC_SOCKET_OUT){ PCFind=LA_PC_SOCKET_IN; }
 
-    if ((!uit->Dragging) && (!laIsInUiItem(ui, e->x, e->y))){ return LA_FINISHED_PASS; }
+    if ((!uit->Dragging) && (!laIsInUiItem(ui, a, e->x, e->y))){ return LA_FINISHED_PASS; }
 
     if (e->type==LA_TIME_IDLE){ return LA_RUNNING; }
     if (e->type == LA_L_MOUSE_DOWN){
@@ -3493,7 +3489,7 @@ int OPMOD_HeightAdjuster(laOperator *a, laEvent *e){
     int lx=e->x,ly=e->y;
     int ClickedVal=0;
 
-    if ((!uit->Dragging) && (!laIsInUiItem(ui, e->x, e->y))){ return LA_FINISHED_PASS; }
+    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;
@@ -3515,7 +3511,7 @@ int OPMOD_MouseActionReporter(laOperator *a, laEvent *e){
     laUiItem *ui = a->Instance;
     laBoxedTheme *bt = (*ui->Type->Theme);
 
-    if (!laIsInUiItem(ui, e->x, e->y)){ return LA_FINISHED_PASS; }
+    if (!laIsInUiItem(ui, a, e->x, e->y)){ return LA_FINISHED_PASS; }
 
     if (!(e->type&LA_MOUSE_EVENT)){ return LA_RUNNING_PASS; }
     if (e->type==LA_MOUSEMOVE){ return LA_RUNNING_PASS; }
@@ -3615,7 +3611,7 @@ int OPMOD_ValueMapper(laOperator *a, laEvent *e){
     real x=(real)(e->x-ui->L)/w,y=(real)(ui->B-e->y)/h;
     int ClickedVal=0;
 
-    if ((!uit->Dragging) && (!laIsInUiItem(ui, e->x, e->y))){ return LA_FINISHED_PASS; }
+    if ((!uit->Dragging) && (!laIsInUiItem(ui, a, e->x, e->y))){ return LA_FINISHED_PASS; }
 
     laValueMapper* vm=ui->PP.EndInstance;
 

+ 1 - 1
resources/la_widgets_viewers.c

@@ -803,7 +803,7 @@ int OPMOD_Canvas(laOperator *a, laEvent *e){
     laListHandle Locals = {0};
     int px = e->x, py = e->y;
 
-    if (!laIsInUiItem(ui, e->x, e->y) && !ex->Dragging){
+    if (!laIsInUiItem(ui, a, e->x, e->y) && !ex->Dragging){
         ex->OnX = INT_MAX; ex->OnY = INT_MAX; if(ui->State!=LA_UI_NORMAL){ ui->State=LA_UI_NORMAL; laRedrawCurrentPanel(); }
         return LA_FINISHED_PASS;
     }