*/}}
Browse Source

Checkbox style

YimingWu 17 giờ trước cách đây
mục cha
commit
50bf572a1a
3 tập tin đã thay đổi với 41 bổ sung11 xóa
  1. 3 0
      la_interface.h
  2. 16 3
      la_kernel.c
  3. 22 8
      resources/la_widgets.c

+ 3 - 0
la_interface.h

@@ -1258,6 +1258,7 @@ STRUCTURE(laWidget){
 
 #define LA_UI_FLAGS_MOMENTARY (LA_UI_FLAGS_CYCLE|LA_UI_FLAGS_NODE_CONTAINER)
 #define LA_UI_FLAGS_KNOB LA_UI_FLAGS_NODE_CONTAINER
+#define LA_UI_FLAGS_CHECKBOX (LA_TEXT_ONE_LINE|LA_UI_FLAGS_CYCLE|LA_TEXT_ALIGN_LEFT)
 
 #define LA_UI_FLAGS_VERTICAL_SLIDER LA_UI_FLAGS_CYCLE
 
@@ -2555,6 +2556,8 @@ laUiItem *laShowIcon(laUiList *uil, laColumn *c, laPropPack *Base, const char *P
 laUiItem *laShowInvisibleItem(laUiList *uil, laColumn *c, laPropPack *Base, const char *Path);
 laUiItem *laShowItem(laUiList *uil, laColumn *c, laPropPack *Base, const char *Path);
 laUiItem *laShowItemFull(laUiList *uil, laColumn *c, laPropPack *Base, const char *Path, laWidget* Widget, char* instructions, laUiDefineFunc Template, int TemplateContext);
+laUiItem *laShowItemWithLabel(laUiList *uil, laColumn *clabel, laColumn *cmain, laPropPack *Base, const char *Path, laWidget* Widget, char* instructions, laUiDefineFunc Template, int TemplateContext,
+                              char* Label, int LabelFlags, laColumn* AlignAt);
 laUiItem *laShowImage(laUiList *uil, laColumn *c, tnsImage* Image, int Height);
 laUiItem *laShowNodeSocket(laUiList *uil, laColumn *c, laPropPack *Base, const char *Path, char* instructions);
 laUiItem *laShowHeightAdjuster(laUiList *uil, laColumn *c, laPropPack *Base, const char *Path, char* instructions);

+ 16 - 3
la_kernel.c

@@ -2340,7 +2340,7 @@ void la_RefreshBoxedThemeColor(laBoxedTheme* bt){
     hcy[2]=bt->BorderY; tnsHCY2RGB(hcy, bt->Border); bt->Border[3]=1;
     hcy[2]=bt->TextY;   tnsHCY2RGB(hcy, bt->Text); bt->Text[3]=1;
     hcy[2]=bt->TextActiveY; tnsHCY2RGB(hcy, bt->TextActive); bt->TextActive[3]=1;
-    if(bt->NoDecalInvert){ hcy[2]=1.0f-bt->TextY; tnsHCY2RGB(hcy, bt->TextInvert); bt->TextInvert[3]=1.0f; }
+    if(bt->NoDecalInvert){ hcy[2]=bt->NormalY/(bt->TextY/bt->NormalY);TNS_CLAMP(hcy[2],0,1); tnsHCY2RGB(hcy, bt->TextInvert); bt->TextInvert[3]=1.0f; }
     else{ tnsVectorSet4v(bt->TextInvert,bt->Text); }
 }
 void la_RefreshThemeColorSelf(laTheme* th){
@@ -4842,6 +4842,15 @@ laUiItem *laShowItemFull(laUiList *uil, laColumn *c, laPropPack *Base, const cha
 
     return ui;
 }
+laUiItem *laShowItemWithLabel(laUiList *uil, laColumn *clabel, laColumn *cmain, laPropPack *Base, const char *Path, laWidget* Widget, char* instructions, laUiDefineFunc Template, int TemplateContext,
+                              char* Label, int LabelFlags, laColumn* AlignAt){
+    if(AlignAt){ laShowSeparator(uil,AlignAt)->Flags|=LA_UI_FLAGS_NO_DECAL; }
+    laUiItem* ui=laShowItemFull(uil,cmain,Base,Path,Widget,instructions,Template,TemplateContext);
+    if(!Label && ui && ui->PP.LastPs && ui->PP.LastPs->p){ laProp* p=ui->PP.LastPs->p; Label=p->Name; }
+    laUiItem* labelui=laShowLabel(uil,clabel,Label,0,0); if(!LabelFlags){ labelui->Flags|= LA_TEXT_ALIGN_RIGHT; }else{ labelui->Flags|=LabelFlags; }
+    lstRemoveItem(&uil->UiItems,ui); lstAppendItem(&uil->UiItems,ui);
+    return ui;
+}
 laUiItem *laShowImage(laUiList *uil, laColumn *c, tnsImage* Image, int Height){
     laUiItem *ui = memAcquire(sizeof(laUiItem));
     ui->C = c; memAssignRef(ui,&ui->Extra,Image);
@@ -6017,7 +6026,11 @@ 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 + LA_M; ui->TB = ui->TU+LA_RH/5;
+            if(ui->Flags&LA_UI_FLAGS_NO_DECAL){
+                ui->TU = ui->C->B - LA_M; ui->TB = ui->TU;
+            }else{
+                ui->TU = ui->C->B + LA_M; 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){
@@ -6640,7 +6653,7 @@ void la_DrawNodeWires(laUiListDraw* uild){
 #undef _RSLICES
     tnsFlush();
 
-    int ww=MAIN.WireThickness*TNS_MIN2(uild->WiresContainer->Scale,1);
+    real ww=MAIN.WireThickness*TNS_MIN2(uild->WiresContainer->Scale,1);
     for(laSocketRecord*sr=uild->SocketRecord.pFirst;sr;sr=sr->Item.pNext){
         int cid=sr->In->ColorId%MAIN.WireColorSlices*4;
         real inx=sr->In->RuntimeX+sr->In->RuntimePX, iny=sr->In->RuntimeY+sr->In->RuntimePY;

+ 22 - 8
resources/la_widgets.c

@@ -241,9 +241,10 @@ int la_EnumGetMinWidth(laUiItem *ui){
     int IsIcon = ui->Flags&LA_UI_FLAGS_ICON;
     int Highlight=ui->Flags&LA_UI_FLAGS_HIGHLIGHT;
     int NoDecal=ui->Flags&LA_UI_FLAGS_NO_DECAL;
+    int IsCheckbox=ui->Flags&LA_TEXT_ONE_LINE;
     int SharedWidth;
     if(!IsIcon){
-        SharedWidth = LA_M + LA_M + ((IsCycle||IsExpand||NoDecal)?0:LA_RH); int HasIcon=0;
+        SharedWidth = LA_M + LA_M + ((IsCycle||IsExpand||NoDecal||IsCheckbox)?0:LA_RH); int HasIcon=0;
         if(Highlight){ int ico=0;
             if (ui->ExtraInstructions){
                 if (ui->Type->OperatorType->ParseArgs){
@@ -256,7 +257,7 @@ int la_EnumGetMinWidth(laUiItem *ui){
                 tW = tnsStringGetWidth(transLate(ep->Base.Name), 0, ui->Flags&LA_TEXT_MONO) + SharedWidth;
             }
             if (tW > W) W = tW;
-            if(HasIcon||ico) W+=LA_M+LA_RH;
+            if(HasIcon||ico||IsCheckbox) W+=LA_M+LA_RH;
         }else{
             for (i = ep->Items.pFirst; i; i = i->Item.pNext){
                 tW = tnsStringGetWidth(transLate(i->Name), 0, ui->Flags&LA_TEXT_MONO) + SharedWidth;
@@ -506,6 +507,12 @@ real* la_UiTextColorState(laBoxedTheme* bt, laUiItem* ui, int State){
     if(flags&LA_UI_FLAGS_NO_DECAL){ return laThemeColor(bt, LA_BT_NO_DECAL|LA_BT_TEXT); }
     return laThemeColor(bt,LA_BT_TEXT|State);
 }
+real* la_UiTextColorEnumState(laBoxedTheme* bt, laUiItem* ui, int State, int IsCheckbox){
+    int flags = ui->Flags;
+    if(flags&LA_UI_FLAGS_DISABLED){ return laThemeColor(bt, LA_BT_DISABLED|LA_BT_TEXT); }
+    if(IsCheckbox || (flags&LA_UI_FLAGS_NO_DECAL)){ return laThemeColor(bt, LA_BT_NO_DECAL|LA_BT_TEXT); }
+    return laThemeColor(bt,LA_BT_TEXT|State);
+}
 real* la_UiTextColor(laBoxedTheme* bt, laUiItem* ui){
     return la_UiTextColorState(bt,ui,ui->State);
 }
@@ -954,6 +961,7 @@ void la_EnumSelectorDraw(laUiItem *ui, int h){
     int NoEvent=ui->Flags&LA_UI_FLAGS_NO_EVENT;
     int Highlight=ui->Flags&LA_UI_FLAGS_HIGHLIGHT;
     int IsDisabled=ui->Flags&LA_UI_FLAGS_DISABLED;
+    int IsCheckbox=ui->Flags&LA_TEXT_ONE_LINE;
     int sf=bt->TextShadow?LA_TEXT_SHADOW:0;
     // norm      e1
     // expand    e1 e2 e3
@@ -1013,21 +1021,26 @@ void la_EnumSelectorDraw(laUiItem *ui, int h){
             if(IsExpand&&!IsCycle){ use_ei = ei; ei=ei->Item.pNext; ExtraState=(use_ei==Data[i])?LA_BT_ACTIVE:ExtraState; }
             else{ use_ei = Data[i]; if(Highlight && Data[i]->Index!=0){ ExtraState=LA_BT_ACTIVE; } }
 
-            int sw=0;
+            int sw=0; int tl=_L,boxr=_R;
+            if(IsCheckbox){
+                tl=_L+LA_M+LA_RH; boxr=_L+LA_RH;
+            }
             if(!NoDecal){
                 sw=la_GetBoxOffset(bt, ExtraState);
                 tnsUseNoTexture();
-                la_DrawBoxAutoArray(_L,_R,_U,_B,bt, ExtraState, laThemeColor(bt,ExtraState),IsVertical,j==0);
+                la_DrawBoxAutoArray(_L,boxr,_U,_B,bt, ExtraState, laThemeColor(bt,ExtraState),IsVertical,j==0);
             }
 
             if(Highlight){ if(!HasText && ArrLen==1) strcpy(buf, transLate(ui->PP.LastPs->p->Name)); else{ if(i<8)strcat(buf, &prefix[i]); } }
             if((!HasText) && (!buf[0])) strcpy(buf, transLate(use_ei->Name));
-            int iconR; if(IconOnly)iconR=TNS_MAX2(_L+LA_RH,_R);else{ iconR=TNS_MIN2(_L+LA_RH,_R); }
+            int iconR; if(IconOnly)iconR=TNS_MAX2(_L+LA_RH,_R);else{ iconR=TNS_MIN2(_L+LA_RH,boxr); }
             if (use_ei->IconID && !ico){ ico=use_ei->IconID; }
-            if (ico) tnsDrawIcon(ico, la_UiTextColorState(bt,ui,ExtraState), _L-sw,iconR-sw, _U-sw, LA_TEXT_ALIGN_CENTER|ui->Flags|sf);
-            if(!IconOnly){
+            if (IsCheckbox && ExtraState==LA_BT_ACTIVE && (!ico)){ ico=U'✓'; }
+            if (ico) tnsDrawIcon(ico, la_UiTextColorState(bt,ui,ExtraState), _L-sw,iconR-sw, _U-sw, LA_TEXT_ALIGN_CENTER|sf);
+            if (IsCheckbox){ sw=0; ExtraState=ExtraState==LA_BT_ACTIVE?LA_BT_NORMAL:ExtraState; }
+            if (!IconOnly){
                 int UseFlags=ui->Flags; if(!HasIcon && IsExpand){ if(!(UseFlags&LA_TEXT_ALIGN)); UseFlags|=LA_TEXT_ALIGN_CENTER; }
-                tnsDrawStringAuto(buf, la_UiTextColorState(bt,ui,ExtraState), _L+LA_M+(HasIcon?LA_RH:0)-sw, _R-LA_M-sw, _U-sw, UseFlags|sf);
+                tnsDrawStringAuto(buf, la_UiTextColorEnumState(bt,ui,ExtraState,IsCheckbox), tl+LA_M+(HasIcon?LA_RH:0)-sw, _R-LA_M-sw, _U-sw, UseFlags|sf);
             }
             if (!IsExpand && !IsVertical && !IconOnly && !IsCycle && !NoEvent){
                 tnsDrawIcon(U'🔻', la_UiTextColorState(bt,ui,ExtraState), _R-LA_RH-sw, _R-sw, _U-sw, ui->Flags|sf);
@@ -1250,6 +1263,7 @@ void la_MultiStringDraw(laUiItem *ui, int h){
     tnsFlush();
 }
 void la_UiSeperatorDraw(laUiItem *ui, int h){
+    int NoDecal=ui->Flags&LA_UI_FLAGS_NO_DECAL; if(NoDecal) return;
     laBoxedTheme *bt = (*ui->Type->Theme);
     if (!bt) return;