*/}}
Bläddra i källkod

Panel drawing and misc optimizations

YimingWu 1 år sedan
förälder
incheckning
1ec248ea5a
5 ändrade filer med 67 tillägg och 39 borttagningar
  1. 45 21
      la_kernel.c
  2. 2 1
      la_tns_kernel.c
  3. 15 13
      resources/la_operators.c
  4. 3 1
      resources/la_templates.c
  5. 2 3
      resources/la_widgets.c

+ 45 - 21
la_kernel.c

@@ -1722,8 +1722,6 @@ void laEnsurePanelInBound(laPanel *p, laUiList *uil){
 
     p->TX = p->X; p->TY = p->Y;
     p->TW = p->W; p->TH = p->H;
-
-    if (p->OffScr){ tnsEnsureOffscreenStatus(p->OffScr, p->W,p->H); }
 }
 void laPlacePanelForCreation(laPanel *p){
     int cw = MAIN.CurrentWindow->CW; int ch = MAIN.CurrentWindow->CH; int PH = p->TH;
@@ -1757,15 +1755,26 @@ void la_PanelDrawToWindow(laPanel *p, laWindow *w){
     real Color[] = {1, 1, 1, 1};
     real L, W, U, H;
 
-    tnsUseImmShader(); tnsEnableShaderv(T->immShader); tnsUniformOutputColorSpace(T->immShader,w->OutputColorSpace);
-    tnsUniformShowColorOverflowStripes(T->immShader,w->OutputShowStripes);
+    tnsUseImmShader(); tnsEnableShaderv(T->immShader);
+    if(MAIN.EnableColorManagement){
+        tnsUniformOutputColorSpace(T->immShader,w->OutputColorSpace);
+        tnsUniformShowColorOverflowStripes(T->immShader,w->OutputShowStripes);
+    }else{
+        tnsUniformOutputColorSpace(T->immShader,0);
+        tnsUniformShowColorOverflowStripes(T->immShader,0);
+    }
 
     switch (p->AnimationMode){
     case 0:
         tnsDraw2DTextureDirectly(p->OffScr->pColor[0], p->X, p->Y, p->W, p->H);
-        if(p->ShowCorner && ((!p->SR) && (!p->SB))){ tnsDrawStringAuto("◢",laThemeColor(_LA_THEME_PANEL,LA_BT_TEXT),p->X+p->W-LA_RH,p->X+p->W,p->Y+p->H-LA_RH,0); }
-        //if(p->Mode==LA_PANEL_FLOATING_TOP)
-        //    tnsDrawStringAuto("◿",laThemeColor(*p->BT,LA_BT_BORDER),p->X+p->W-LA_RH, p->X+p->W, p->H+p->Y-LA_RH, LA_TEXT_ALIGN_CENTER);
+        if(!(p->SR || p->SB || p->Parent || p->Block || p->IsMenuPanel)){
+            real* color=laThemeColor(_LA_THEME_PANEL,LA_BT_TEXT); tnsColor4d(LA_COLOR3(color),color[3]*(p->ShowCorner?1:0.8));
+            int len=LA_RH/(p->ShowCorner?1:2); tnsUseNoTexture(); int px=p->X+p->W,py=p->Y+p->H;
+            tnsVertex2d(px,py); tnsVertex2d(px-len,py); tnsVertex2d(px,py-len);
+            tnsPackAs(GL_TRIANGLES);
+            tnsColor4dv(laThemeColor(_LA_THEME_PANEL,LA_BT_NORMAL)); tnsVertex2d(px-len,py); tnsVertex2d(px,py-len);
+            tnsLineWidth(2); tnsPackAs(GL_LINES); tnsLineWidth(1);
+        }
         break;
 
     case LA_PANEL_ANIMATION_DROP_DOWN:
@@ -1850,8 +1859,8 @@ void la_PanelDrawToWindow(laPanel *p, laWindow *w){
     tnsUniformShowColorOverflowStripes(T->immShader,0);
 }
 void la_PanelDrawToOffsceen(laPanel *p, laUiList *uil){
-    laEnsurePanelInBound(p,p->MenuRefer?p->MenuRefer:&p->UI);
-    if (!p->OffScr){
+    if (p->OffScr){ tnsEnsureOffscreenStatus(p->OffScr, p->W,p->H); }
+    else{
         int GLFormat=(p->PanelTemplate&&p->PanelTemplate->DefaultGLFormat)?p->PanelTemplate->DefaultGLFormat:GL_RGBA8;
         p->OffScr = tnsCreate2DOffscreen(GLFormat, p->W, p->H, MAIN.PanelMultisample, 0,0);
     }
@@ -2123,7 +2132,12 @@ void la_BlockDefDrawSelf(laBlock *b, int CH){
     int tw = 0;
     int L = LA_RH+LA_SEAM_W;
 
-    tnsUseImmShader(); tnsEnableShaderv(T->immShader); tnsUniformOutputColorSpace(T->immShader,MAIN.CurrentWindow->OutputColorSpace);
+    tnsUseImmShader(); tnsEnableShaderv(T->immShader);
+    if(MAIN.EnableColorManagement){
+        tnsUniformOutputColorSpace(T->immShader,MAIN.CurrentWindow->OutputColorSpace);
+    }else{
+        tnsUniformOutputColorSpace(T->immShader,0);
+    }
 
     for (p = b->Panels.pFirst; p; p = p->Item.pNext){
         tw += p->TitleWidth + LA_SEAM_W*2;
@@ -2191,7 +2205,13 @@ void la_BlockDefDrawSelfEmpty(laBlock *b, int CH){
     laBoxedTheme *bt = _LA_THEME_PANEL;
     real tv[8];
 
-    tnsUseImmShader(); tnsEnableShaderv(T->immShader); tnsUniformOutputColorSpace(T->immShader,MAIN.CurrentWindow->OutputColorSpace);
+    tnsUseImmShader(); tnsEnableShaderv(T->immShader);
+    if(MAIN.EnableColorManagement){
+        tnsUniformOutputColorSpace(T->immShader,MAIN.CurrentWindow->OutputColorSpace);
+    }else{
+        tnsUniformOutputColorSpace(T->immShader,0);
+    }
+    
     tnsUseNoTexture();
     tnsMakeQuad2d(tv, b->X, (CH - b->Y),
                       b->X + b->W, (CH - b->Y),
@@ -2308,7 +2328,11 @@ void la_WindowDefDraw(laWindow *w, laBoxedTheme *bt){
         la_SetPropMathcerContext(p);
         if(p->Refresh){
             tnsUseShader(T->immShader);tnsEnableShaderv(T->immShader);
-            tnsUniformOutputColorSpace(T->immShader,w->OutputColorSpace);
+            if(MAIN.EnableColorManagement){
+                tnsUniformOutputColorSpace(T->immShader,MAIN.CurrentWindow->OutputColorSpace);
+            }else{
+                tnsUniformOutputColorSpace(T->immShader,0);
+            }
             if(p->Refresh&LA_TAG_RECALC){
                 laRecalcPanelImmediate(p);
             }
@@ -2579,23 +2603,23 @@ laPanel* laTearOffPanel(laBlock* b, laPanel* p_if_set){
     laPanel* p = p_if_set?p_if_set:b->CurrentPanel;
     b->CurrentPanel = p->Item.pNext?p->Item.pNext:p->Item.pPrev;
     lstRemoveItem(&b->Panels, p);
-    if(!b->CurrentPanel && b->parent){
-        b=b->parent;
-        laCombineChildBlocks(b);
-    }
+    if(!b->CurrentPanel && b->parent){ b=b->parent; laCombineChildBlocks(b); }
 
     if(!p->TitleBar.UiItems.pFirst){
         laui_DefaultPanelTitleBar(&p->TitleBar, &p->PP, &p->PropLinkPP, p->PanelTemplate?p->PanelTemplate->Header:0);
     }
 
     p->Mode = LA_PANEL_FLOATING_TOP;
-    p->TY-=LA_RH;
-    p->TH+=LA_RH;
+    p->TY-=LA_RH; p->TH+=LA_RH;
+    p->W=p->TW=p->PanelTemplate->DefaultW_RH*LA_RH;
+    p->W=p->TH=p->PanelTemplate->DefaultH_RH*LA_RH;
+    p->Block = 0;
+
+    laEnsurePanelInBound(p,&p->UI); laPlacePanelForCreation(p);
 
     laRecalcPanel(p);
     la_RecalcBlockRecursive(b, b->X,b->Y,b->W,b->H);
     p->BT = &_LA_THEME_FLOATING_PANEL;
-    p->Block = 0;
     lstPushItem(&MAIN.CurrentWindow->Panels, p);
 
     laNotifyUsers("la.windows.panels");
@@ -3303,7 +3327,7 @@ void laRecalcPanelImmediate(laPanel* p){
     }
     if(!enclosed){
         la_PanelValidateWidth(p,&p->UI);
-        //laEnsurePanelInBound(p,&p->UI);
+        laEnsurePanelInBound(p,p->MenuRefer?p->MenuRefer:&p->UI);
         la_UpdateUiListRecursive(&p->TitleBar, bt->TM, bt->LM, p->TW-bt->RM, p->TH-bt->BM, 0, p);
         int UseB=p->TitleBar.TB; if((!p->Mode)||(p->Mode==LA_PANEL_FLOATING_PASSIVE)){ UseB=0; }
         la_UpdateUiListRecursive(&p->UI, UseB+bt->TM, bt->LM, p->TW-bt->RM-scrollw, p->TH-bt->BM, 0, p);
@@ -4985,7 +5009,7 @@ int la_UpdateUiListRecursive(laUiList *uil, int U, int L, int R, int B, int Fast
         }
 
         if (ui->Type == _LA_UI_ALIGN){
-            ui->TU = ui->C->B + bt->TP; ui->TB = ui->TU;
+            ui->TU = ui->C->B + bt->TP; ui->TB = ui->TU+LA_RH/5;
             ui->TL = ui->C->IL; ui->TR = ui->C->IR;
             if (ui->TB > Lowest) Lowest = ui->TB;
             if (!WaitAnimation){

+ 2 - 1
la_tns_kernel.c

@@ -3030,6 +3030,8 @@ void tnsDrawStringM(char *content, uint32_t* contentU, real Color[4], int L, int
     int UseMono=(Flags&LA_TEXT_MONO);
     int OneLine=(Flags&LA_TEXT_ONE_LINE);
 
+    if(Color) tnsColor4dv(Color);
+
     int any=0, UC=1; int BreakNow=0;
     for (i = 0; i < len && UC; i+=advance){
         UC = contentU?contentU[i]:laToUnicode(&content[i], &advance);
@@ -3070,7 +3072,6 @@ void tnsDrawStringM(char *content, uint32_t* contentU, real Color[4], int L, int
                           cx + fsc->width, +cy);
 
         tnsUseMaskTexture(&f->TexBuffer);
-        tnsColor4dv(Color);
         tnsVertexArray2d(VertArr, 6);
         tnsTexCoordArray2d(TexCoord, 6);
         any=1;

+ 15 - 13
resources/la_operators.c

@@ -1171,7 +1171,7 @@ int OPINV_DockPanel(laOperator* a, laEvent* e){
 int OPINV_NewWindow(laOperator* a, laEvent* e){
     laWindow* w = a->This?a->This->EndInstance:MAIN.CurrentWindow;
     
-    laWindow* nw =laDesignWindow(w->X,w->Y,w->CW,w->CH);
+    laWindow* nw =laDesignWindow(w->X,w->Y,w->W,w->H);
     laLayout* l=(w->Layouts.pFirst!=w->Layouts.pLast)?w->CurrentLayout:0;
 
     if (l && !strSame(strGetArgumentString(a->ExtraInstructionsP, "clean"), "true")){
@@ -1261,7 +1261,15 @@ int laui_BlockMenu(laOperator *WindowAct, laWindow* w, laLayout *l, laBlock *b,
         laShowLabel(uil, c, "Panel properties:", 0, 0);
         forp->PanelTemplate->Header(uil, &forp->PP, &forp->PropLinkPP, c, 0);
     }else{
-        laShowLabel(uil, c, "Panel doesn't have configurable property.", 0, 0);
+        if(forp->PropLinkPP.LastPs->p->SubProp->Props.pFirst){
+            for(laProp* p = forp->PropLinkPP.LastPs->p->SubProp->Props.pFirst;p;p=p->Item.pNext){
+                if(p->PropertyType&LA_PROP_SUB){
+                    laShowItemFull(uil, c, &forp->PropLinkPP, p->Identifier, LA_WIDGET_COLLECTION_SELECTOR,0,laui_IdentifierOnly,0);
+                }else{ laShowItem(uil, c, &forp->PropLinkPP, p->Identifier); }
+            }
+        }else{
+            laShowLabel(uil, c, "Panel doesn't have configurable property.", 0, 0);
+        }
     }
 
     //laShowItem(uil, c, 0, "LA_new_panel");
@@ -1283,18 +1291,14 @@ int la_ProcessBlockEvent(laOperator *a, laBlock *b, laEvent *e){
 
         if (b->CurrentPanel){
             if (e->Type == LA_MOUSE_WHEEL_DOWN && b->CurrentPanel->Item.pNext){
-                b->CurrentPanel = b->CurrentPanel->Item.pNext;
-                Executed = 1;
+                b->CurrentPanel = b->CurrentPanel->Item.pNext; Executed = 1;
             }elif (e->Type == LA_MOUSE_WHEEL_UP && b->CurrentPanel->Item.pPrev){
-                b->CurrentPanel = b->CurrentPanel->Item.pPrev;
-                Executed = 1;
+                b->CurrentPanel = b->CurrentPanel->Item.pPrev; Executed = 1;
             }
         }
 
         if(!b->Folded){
-            for (p = b->Panels.pFirst; p; p = p->Item.pNext){
-                tw += (p->TitleWidth + LA_SEAM_W*2);
-            }
+            for (p = b->Panels.pFirst; p; p = p->Item.pNext){ tw += (p->TitleWidth + LA_SEAM_W*2); }
             if (tw > b->W - LA_SEAM_W*2 - LA_RH) ratio = (real)(b->W - LA_SEAM_W*2 - LA_RH) / tw;
 
             if ((e->Type == LA_L_MOUSE_DOWN)){
@@ -1304,14 +1308,12 @@ int la_ProcessBlockEvent(laOperator *a, laBlock *b, laEvent *e){
                 for (p = b->Panels.pFirst; p; p = p->Item.pNext){
                     RT = LT + p->TitleWidth+LA_SEAM_W*2;
                     if (e->x >= b->X + L+LT * ratio && e->x < b->X + L+RT * ratio){
-                        MAIN.CurrentWindow->CurrentLayout->ClickedPanel = p;
-                        b->CurrentPanel = p;
-                        Executed = 1;
+                        MAIN.CurrentWindow->CurrentLayout->ClickedPanel = p; b->CurrentPanel = p; Executed = 1;
                     }
                     LT = RT;
                 }
             }elif (e->Type == LA_MOUSEMOVE){
-                if (abs(e->x - uid->LastX) > LA_RH || abs(e->y - uid->LastY) > LA_RH){
+                if (abs(e->x - uid->LastX) > LA_RH*3 || abs(e->y - uid->LastY) > LA_RH*3){
                     if (MAIN.CurrentWindow->CurrentLayout->ClickedPanel){
                         l = MAIN.CurrentWindow->CurrentLayout;
                         l->DropToBlock = b;

+ 3 - 1
resources/la_templates.c

@@ -375,7 +375,9 @@ void laui_DefaultPanelTitleBar(laUiList *uil, laPropPack *Base, laPropPack *Extr
                 header(uil, Base, Extra, cr, 0);
             }else{
                 for(laProp* p = Extra->LastPs->p->SubProp->Props.pFirst;p;p=p->Item.pNext){
-                    laShowItem(uil, cr, Extra, p->Identifier);
+                    if(p->PropertyType&LA_PROP_SUB){
+                        laShowItemFull(uil, cr, Extra, p->Identifier, LA_WIDGET_COLLECTION_SELECTOR,0,laui_IdentifierOnly,0);
+                    }else{ laShowItem(uil, cr, Extra, p->Identifier); }
                 }
             }
         }

+ 2 - 3
resources/la_widgets.c

@@ -1085,8 +1085,7 @@ void la_UiSeperatorDraw(laUiItem *ui, int h){
     }else{
         tnsUseNoTexture();
         tnsColor4dv(laThemeColor(bt,LA_BT_BORDER));
-        tnsVertex2d(ui->L, ui->U);
-        tnsVertex2d(ui->R, ui->U);
+        real u=(ui->U+ui->B)/2; tnsVertex2d(ui->L, u); tnsVertex2d(ui->R, (ui->U+ui->B)/2);
         tnsPackAs(GL_LINES);
     }
 }
@@ -2720,7 +2719,7 @@ int OPMOD_Collection(laOperator *a, laEvent *e) {
   }
 
   laLocalToPanel(a, &lx, &ly);
-  if (a->ToPanel && ly < a->ToPanel->TitleBar.B) {
+  if (a->ToPanel && ui->U>=a->ToPanel->TitleBar.B && ly < a->ToPanel->TitleBar.B) {
     return LA_FINISHED_PASS;
   }
   uil = la_DetectUiListRecursive(ToUil, lx, ly, 10000, 0, 0, 0, 0, 0);