|
@@ -36,7 +36,8 @@ laWidget _LA_WIDGET_LABEL={0};
|
|
|
laWidget _LA_WIDGET_INT={0};
|
|
|
laWidget _LA_WIDGET_INT_PLAIN={0, LA_UI_FLAGS_PLAIN};
|
|
|
laWidget _LA_WIDGET_INT_PLAIN_ICON={0, LA_UI_FLAGS_INT_ICON};
|
|
|
-laWidget _LA_WIDGET_VALUE_METER={0,LA_TEXT_ALIGN_CENTER};
|
|
|
+laWidget _LA_WIDGET_METER_TYPE1={0,LA_TEXT_ALIGN_CENTER};
|
|
|
+laWidget _LA_WIDGET_METER_TYPE2={0,LA_TEXT_ALIGN_CENTER};
|
|
|
laWidget _LA_WIDGET_VALUE_METER_2D={0,LA_TEXT_ALIGN_CENTER};
|
|
|
laWidget _LA_WIDGET_FLOAT={0};
|
|
|
laWidget _LA_WIDGET_FLOAT_PLAIN={0, LA_UI_FLAGS_PLAIN};
|
|
@@ -79,7 +80,8 @@ laWidget *LA_WIDGET_LABEL=&_LA_WIDGET_LABEL;
|
|
|
laWidget *LA_WIDGET_INT=&_LA_WIDGET_INT;
|
|
|
laWidget *LA_WIDGET_INT_PLAIN=&_LA_WIDGET_INT_PLAIN;
|
|
|
laWidget *LA_WIDGET_INT_PLAIN_ICON=&_LA_WIDGET_INT_PLAIN_ICON;
|
|
|
-laWidget *LA_WIDGET_VALUE_METER=&_LA_WIDGET_VALUE_METER;
|
|
|
+laWidget *LA_WIDGET_METER_TYPE1=&_LA_WIDGET_METER_TYPE1;
|
|
|
+laWidget *LA_WIDGET_METER_TYPE2=&_LA_WIDGET_METER_TYPE2;
|
|
|
laWidget *LA_WIDGET_VALUE_METER_2D=&_LA_WIDGET_VALUE_METER_2D;
|
|
|
laWidget *LA_WIDGET_FLOAT=&_LA_WIDGET_FLOAT;
|
|
|
laWidget *LA_WIDGET_FLOAT_PLAIN=&_LA_WIDGET_FLOAT_PLAIN;
|
|
@@ -1482,7 +1484,7 @@ void la_ImageDraw(laUiItem *ui, int h){
|
|
|
tnsFlush();
|
|
|
}
|
|
|
|
|
|
-void la_ValueMeterDraw(laUiItem *ui, int h){
|
|
|
+void la_ValueMeterType1Draw(laUiItem *ui, int h){
|
|
|
laBoxedTheme *bt = (*ui->Type->Theme);
|
|
|
int DataI[8]; real Data[8];
|
|
|
int Len, i, W; real Seg;
|
|
@@ -1599,6 +1601,185 @@ void la_ValueMeterDraw(laUiItem *ui, int h){
|
|
|
|
|
|
tnsFlush();
|
|
|
}
|
|
|
+void la_ValueMeterType2Draw(laUiItem *ui, int h){
|
|
|
+ laBoxedTheme *bt = (*ui->Type->Theme);
|
|
|
+ int DataI[8]; real Data[8]; int SDataI[8]; real SData[8]; int Len, i, W; real Seg;
|
|
|
+ char buf[48] = {0}; char buf2[48] = {0};char prefix[16][64] = {0};char limits[2][64]={0};
|
|
|
+ int Original;
|
|
|
+ int Imin=-100, Imax=100; real min=-100, max=100;
|
|
|
+ int s, State; int IsVertical=ui->Flags&LA_UI_FLAGS_TRANSPOSE;
|
|
|
+ int NoLabel=ui->Flags&LA_UI_FLAGS_NO_LABEL;
|
|
|
+
|
|
|
+ int IsInt=(ui->PP.LastPs->p->PropertyType&LA_PROP_INT)?1:0;
|
|
|
+ Len = laGetArrayLength(&ui->PP);
|
|
|
+ laGetPrefixP(&ui->PP, prefix);
|
|
|
+ if(IsInt){
|
|
|
+ laGetIntArray(&ui->PP, DataI); for(int i=0;i<Len;i++){ Data[i]=DataI[i]; }
|
|
|
+ laGetIntRange(&ui->PP, &Imin, &Imax); min=Imin; max=Imax;
|
|
|
+ sprintf(limits[0],"%d",Imin); sprintf(limits[1],"%d",Imax);
|
|
|
+ }else{
|
|
|
+ laGetFloatArray(&ui->PP, Data);
|
|
|
+ laGetFloatRange(&ui->PP,&min,&max);
|
|
|
+ sprintf(limits[0],"%lf",min); sprintf(limits[1],"%lf",max);
|
|
|
+ }
|
|
|
+
|
|
|
+ int sl = TNS_MAX2(abs(ui->SymbolID),5);
|
|
|
+ int ScaleLen = sl * LA_RH;
|
|
|
+ real seg = abs(ui->TemplateContext)/100;
|
|
|
+ int times=1,times10=0;
|
|
|
+ while((max-min)/seg > ScaleLen/10){
|
|
|
+ seg*=10;
|
|
|
+ }
|
|
|
+ if(seg>100){ int sseg=seg; while(sseg>=100){ sseg/=10; times*=10; times10++; } }
|
|
|
+
|
|
|
+ for (i = 0; i < Len; i++){
|
|
|
+ int _L=ui->L, _R=ui->R, _U=ui->U, _B=ui->B;
|
|
|
+ if(IsVertical){
|
|
|
+ Seg = (real)(ui->R-ui->L)/Len;
|
|
|
+ _L = ui->L + i * Seg; _R=ui->L + (i+1) * Seg;
|
|
|
+ }else{
|
|
|
+ Seg = (real)(ui->B-ui->U)/Len;
|
|
|
+ _U = ui->U + i * Seg; _B=_U+Seg;
|
|
|
+ }
|
|
|
+
|
|
|
+ real cx=(_L+_R)/2,cy=(_U+_B)/2,cw=(_R-_L),ch=(_B-_U);
|
|
|
+
|
|
|
+ tnsPushStringClip(_L,_R,_U,_B);
|
|
|
+
|
|
|
+ tnsUseNoTexture();
|
|
|
+ tnsColor4dv(laThemeColor(bt,ui->State));
|
|
|
+ tnsVertex2d(_L, _U); tnsVertex2d(_R, _U);
|
|
|
+ tnsVertex2d(_R, _B); tnsVertex2d(_L, _B);
|
|
|
+ tnsPackAs(GL_TRIANGLE_FAN);
|
|
|
+
|
|
|
+ int oflow=0,ofhigh=0;
|
|
|
+ if(Data[i]<min){ oflow=1; Data[i]=min; }
|
|
|
+ if(Data[i]>max){ ofhigh=1; Data[i]=max; }
|
|
|
+
|
|
|
+ real fac = (real)(Data[i]-min) / (real)(max - min);
|
|
|
+ int SL,SR,SU,SB,_SL,_SR,_SU,_SB,Move = fac*ScaleLen;
|
|
|
+ if(IsVertical){ SL=_L; SR=_R; SB=_SB=cy+Move; SU=_SU=SB-ScaleLen; TNS_CLAMP(SB,_U,_B); TNS_CLAMP(SU,_U,_B); }
|
|
|
+ else{ SL=_SL=cx-Move; SR=_SR=SL+ScaleLen; SB=_B; SU=_U; TNS_CLAMP(SL,_L,_R); TNS_CLAMP(SR,_L,_R); }
|
|
|
+ tnsUseNoTexture(); real* color=laThemeColor(bt,LA_BT_TEXT);
|
|
|
+ tnsColor4d(LA_COLOR3(color),0.3);
|
|
|
+ tnsVertex2d(SL, SU); tnsVertex2d(SR, SU);
|
|
|
+ tnsVertex2d(SR, SB); tnsVertex2d(SL, SB);
|
|
|
+ tnsPackAs(GL_TRIANGLE_FAN);
|
|
|
+
|
|
|
+ tnsColor4d(LA_COLOR3(color),0.7);
|
|
|
+ int scalelow=min/seg-1, scalehigh=max/seg+1;
|
|
|
+ for(int si=scalelow;si<=scalehigh;si++){
|
|
|
+ for(int ssi=0;ssi<10;ssi++){
|
|
|
+ real val=si*seg + ssi*0.1*seg; if(val<min) continue; if(val>max) break;
|
|
|
+ real sfac = (real)(val-min) / (max - min); int smove=Move-sfac*ScaleLen;
|
|
|
+ real lfac = ssi==0?(si==ssi?0.5:0.3):(ssi==5?0.2:0.1);
|
|
|
+ if(IsVertical){ int scaleb=cy+smove; if(scaleb>_B || scaleb<_U) continue;
|
|
|
+ tnsVertex2d(cx-cw*lfac,scaleb); tnsVertex2d(cx+cw*lfac,scaleb);
|
|
|
+ }else{ int scalel=cx-smove; if(scalel<_L || scalel>_R) continue;
|
|
|
+ tnsVertex2d(scalel,cy+ch*lfac); tnsVertex2d(scalel,cy-ch*lfac);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ tnsPackAs(GL_LINES);
|
|
|
+
|
|
|
+ if(!NoLabel){
|
|
|
+ for(int si=scalelow;si<=scalehigh;si++){
|
|
|
+ real val=si*seg; if(val<min) continue; if(val>max) break;
|
|
|
+ real sfac = (real)(val-min) / (max - min); int smove=Move-sfac*ScaleLen;
|
|
|
+ if(IsInt) sprintf(buf,"%.0lf",val/times); else sprintf(buf,"%.2lf",val/times);
|
|
|
+ if(IsVertical){ int scaleb=cy+smove; if(scaleb>_B+LA_RH2 || scaleb<_U-LA_RH2) continue;
|
|
|
+ tnsDrawStringAuto(buf,laThemeColor(bt,LA_BT_TEXT),_L+bt->LM,_R-bt->RM,scaleb-LA_RH2,ui->Flags);
|
|
|
+ }else{ int scalel=cx-smove; if(scalel<_L-100 || scalel>_R+100) continue;
|
|
|
+ tnsDrawStringAuto(buf,laThemeColor(bt,LA_BT_TEXT),scalel-100,scalel+100,_U,ui->Flags);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(IsVertical){
|
|
|
+ tnsDrawStringAuto(limits[0],laThemeColor(bt,LA_BT_TEXT|ui->State),_L+bt->LM,_R-bt->RM,_SB,ui->Flags);
|
|
|
+ tnsDrawStringAuto(limits[1],laThemeColor(bt,LA_BT_TEXT|ui->State),_L+bt->LM,_R-bt->RM,_SU-LA_RH,ui->Flags);
|
|
|
+ }else{
|
|
|
+ tnsDrawStringAuto(limits[0],laThemeColor(bt,LA_BT_TEXT|ui->State),_SL-100,_SL-bt->LM,_B-LA_RH,LA_TEXT_ALIGN_RIGHT);
|
|
|
+ tnsDrawStringAuto(limits[1],laThemeColor(bt,LA_BT_TEXT|ui->State),_SR+bt->RM,_SR+100,_B-LA_RH,LA_TEXT_ALIGN_LEFT);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ tnsUseNoTexture();
|
|
|
+ tnsColor4dv(laAccentColor(LA_BT_BORDER));
|
|
|
+ if(IsVertical){tnsVertex2d(_L,cy); tnsVertex2d(_R,cy);}
|
|
|
+ else{tnsVertex2d(cx,_U); tnsVertex2d(cx,_B);}
|
|
|
+ tnsPackAs(GL_LINES);
|
|
|
+
|
|
|
+ if(times!=1){ sprintf(buf,"%d",times10);
|
|
|
+ if(IsVertical && cw>LA_RH) tnsDrawStringAuto(buf,laAccentColor(LA_BT_BORDER),_L+bt->LM,_R-bt->RM,cy,LA_TEXT_MONO|LA_TEXT_ALIGN_RIGHT);
|
|
|
+ elif(ch>LA_RH) tnsDrawStringAuto(buf,laAccentColor(LA_BT_BORDER),cx+bt->LM,cx+100,_U,LA_TEXT_MONO|LA_TEXT_ALIGN_LEFT);
|
|
|
+ }
|
|
|
+
|
|
|
+ tnsUseNoTexture();
|
|
|
+ tnsColor4dv(laThemeColor(bt,LA_BT_BORDER));
|
|
|
+ tnsVertex2d(_L, _U); tnsVertex2d(_R, _U);
|
|
|
+ tnsVertex2d(_R, _B); tnsVertex2d(_L, _B);
|
|
|
+ tnsPackAs(GL_LINE_LOOP);
|
|
|
+
|
|
|
+ //if(IsVertical){
|
|
|
+ // if(oflow){ tnsDrawStringAuto("⯆",laThemeColor(bt, LA_BT_TEXT), _L+bt->LM,_R-bt->RM, _U, LA_TEXT_ALIGN_CENTER); }
|
|
|
+ // elif(ofhigh){ tnsDrawStringAuto("⯅",laThemeColor(bt, LA_BT_TEXT), _L+bt->LM,_R-bt->RM, _B-LA_RH, LA_TEXT_ALIGN_CENTER); }
|
|
|
+ //}else{
|
|
|
+ // if(oflow){ tnsDrawStringAuto("⯇",laThemeColor(bt, LA_BT_TEXT), _L+bt->LM,_R-bt->RM, _U, LA_TEXT_ALIGN_LEFT); }
|
|
|
+ // elif(ofhigh){ tnsDrawStringAuto("⯈",laThemeColor(bt, LA_BT_TEXT), _L+bt->LM,_R-bt->RM, _U, LA_TEXT_ALIGN_RIGHT); }
|
|
|
+ //}
|
|
|
+
|
|
|
+ tnsPopStringClip();
|
|
|
+ }
|
|
|
+
|
|
|
+ int trisize=LA_RH/3.0f;
|
|
|
+ for(laCompoundPP* CPP=ui->CompoundPPs.pFirst;CPP;CPP=CPP->Item.pNext){
|
|
|
+ IsInt=(CPP->PP.LastPs->p->PropertyType&LA_PROP_INT)?1:0;
|
|
|
+ Len = laGetArrayLength(&CPP->PP);
|
|
|
+ laGetPrefixP(&CPP->PP, prefix);
|
|
|
+ if(IsInt){
|
|
|
+ laGetIntArray(&CPP->PP, SDataI); for(int i=0;i<Len;i++){ SData[i]=SDataI[i]; }
|
|
|
+ //laGetIntRange(&CPP->PP, &Imin, &Imax); min=Imin; max=Imax;
|
|
|
+ }else{
|
|
|
+ laGetFloatArray(&CPP->PP, SData);
|
|
|
+ //laGetFloatRange(&CPP->PP,&min,&max);
|
|
|
+ }
|
|
|
+ if(CPP->Slot <= LA_SLOT_MARKER_4){
|
|
|
+ for (i = 0; i < Len; i++){
|
|
|
+ int _L=ui->L, _R=ui->R, _U=ui->U, _B=ui->B;
|
|
|
+ if(IsVertical){
|
|
|
+ Seg = (real)(ui->R-ui->L)/Len;
|
|
|
+ _L = ui->L + i * Seg; _R=ui->L + (i+1) * Seg;
|
|
|
+ }else{
|
|
|
+ Seg = (real)(ui->B-ui->U)/Len;
|
|
|
+ _U = ui->U + i * Seg; _B=_U+Seg;
|
|
|
+ }
|
|
|
+ real cx=(_L+_R)/2,cy=(_U+_B)/2,cw=(_R-_L),ch=(_B-_U);
|
|
|
+ real sfac = (real)(SData[i]-min) / (real)(max - min);
|
|
|
+ real fac = (real)(Data[i]-min) / (real)(max - min);
|
|
|
+ int SL,SR,SU,SB,_SL,_SR,_SU,_SB, Move = fac*ScaleLen,SMove=sfac*ScaleLen;
|
|
|
+ if(IsVertical){ _SB=SB=cy+Move-SMove; TNS_CLAMP(SB,_U,_B); }
|
|
|
+ else{ SL=_SL=cx-Move+SMove; TNS_CLAMP(SL,_L,_R); }
|
|
|
+
|
|
|
+ tnsUseNoTexture();
|
|
|
+ tnsColor4dv(laThemeColor(bt,LA_BT_TEXT|LA_BT_ACTIVE));
|
|
|
+ if(IsVertical){ tnsVertex2d(_L, SB); tnsVertex2d(_R, SB); }
|
|
|
+ else{ tnsVertex2d(SL, _U); tnsVertex2d(SL, _B); }
|
|
|
+ tnsPackAs(GL_LINES);
|
|
|
+ if(IsVertical){
|
|
|
+ if(! CPP->Slot % 2){ tnsVertex2d(_L, SB); tnsVertex2d(_L+trisize, SB); tnsVertex2d(_L, SB-trisize); }
|
|
|
+ else{ tnsVertex2d(_R, SB+trisize); tnsVertex2d(_R-trisize, SB); tnsVertex2d(_R, SB); }
|
|
|
+ if(SB==_SB){ tnsPackAs(GL_TRIANGLES); }else{ tnsPackAs(GL_LINE_LOOP); }
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ if(! CPP->Slot % 2){ tnsVertex2d(SL, _B); tnsVertex2d(SL, _B-trisize); tnsVertex2d(SL+trisize, _B); }
|
|
|
+ else{ tnsVertex2d(SL-trisize, _U); tnsVertex2d(SL, _U+trisize); tnsVertex2d(SL, _U); }
|
|
|
+ if(SL==_SL){ tnsPackAs(GL_TRIANGLES); }else{ tnsPackAs(GL_LINE_LOOP); }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ tnsFlush();
|
|
|
+}
|
|
|
void la_ValueMeter2DDraw(laUiItem *ui, int h){
|
|
|
laBoxedTheme *bt = (*ui->Type->Theme);
|
|
|
int DataI[8]; real Data[8];
|
|
@@ -1770,6 +1951,9 @@ void la_ImageUiDestroy(laUiItem *ui){
|
|
|
tnsStopUsingImage(im);
|
|
|
#endif
|
|
|
}
|
|
|
+void la_MeterUiInit(laUiItem *ui){
|
|
|
+ la_GeneralUiInit(ui); ui->SymbolID = 20; ui->TemplateContext = 1000;
|
|
|
+}
|
|
|
|
|
|
void la_RegisterUiTypesBasic(){
|
|
|
laKeyMapper* km;
|
|
@@ -1780,12 +1964,16 @@ void la_RegisterUiTypesBasic(){
|
|
|
&_LA_THEME_VALUATOR, la_IntDraw, la_ValueGetHeight, la_GeneralUiInit, la_GeneralUiDestroy);
|
|
|
_LA_UI_INT->GetMinWidth=la_ValueGetMinWidth;
|
|
|
|
|
|
- LA_WIDGET_VALUE_METER->Type=
|
|
|
- _LA_UI_VALUE_METER = la_RegisterUiType("LA_value_meter", 0, 0, &_LA_THEME_VALUATOR, la_ValueMeterDraw, la_ValueMeterGetHeight, la_GeneralUiInit, la_GeneralUiDestroy);
|
|
|
- _LA_UI_VALUE_METER->GetMinWidth=la_ValueGetMinWidth;
|
|
|
+ LA_WIDGET_METER_TYPE1->Type=
|
|
|
+ _LA_UI_METER_TYPE1 = la_RegisterUiType("LA_meter_type1", 0, 0, &_LA_THEME_VALUATOR, la_ValueMeterType1Draw, la_ValueMeterGetHeight, la_MeterUiInit, la_GeneralUiDestroy);
|
|
|
+ _LA_UI_METER_TYPE1->GetMinWidth=la_ValueGetMinWidth;
|
|
|
+
|
|
|
+ LA_WIDGET_METER_TYPE2->Type=
|
|
|
+ _LA_UI_METER_TYPE2 = la_RegisterUiType("LA_meter_type2", 0, 0, &_LA_THEME_VALUATOR, la_ValueMeterType2Draw, la_ValueMeterGetHeight, la_MeterUiInit, la_GeneralUiDestroy);
|
|
|
+ _LA_UI_METER_TYPE2->GetMinWidth=la_ValueGetMinWidth;
|
|
|
|
|
|
LA_WIDGET_VALUE_METER_2D->Type=
|
|
|
- _LA_UI_VALUE_METER_2D = la_RegisterUiType("LA_value_meter_2d", 0, 0, &_LA_THEME_VALUATOR, la_ValueMeter2DDraw, la_ValueMeter2DGetHeight, la_GeneralUiInit, la_GeneralUiDestroy);
|
|
|
+ _LA_UI_VALUE_METER_2D = la_RegisterUiType("LA_value_meter_2d", 0, 0, &_LA_THEME_VALUATOR, la_ValueMeter2DDraw, la_ValueMeter2DGetHeight, la_MeterUiInit, la_GeneralUiDestroy);
|
|
|
|
|
|
LA_WIDGET_FLOAT->Type=LA_WIDGET_FLOAT_PLAIN->Type=
|
|
|
_LA_UI_FLOAT = la_RegisterUiType("LA_real_array_horizon", LA_PROP_FLOAT | LA_PROP_ARRAY, "LA_real_array_h_operator",
|