50 TGSpeedo::TGSpeedo(
const TGWindow *p,
int id)
51 : TGFrame(p, 1, 1), TGWidget (id), fImage(0), fImage2(0), fBase(0)
64 fTextFS = fCounterFS = kNone;
65 fThreshold[0] = fThreshold[1] = fThreshold[2] = 0.0;
66 fThresholdColor[0] = kGreen;
67 fThresholdColor[1] = kOrange;
68 fThresholdColor[2] = kRed;
69 fThresholdActive = kFALSE;
70 fPicName =
"speedo.gif";
71 fImage = TImage::Open(fPicName);
72 if (!fImage || !fImage->IsValid())
73 Error(
"TGSpeedo::Build",
"%s not found", fPicName.Data());
75 AddInput(kButtonPressMask | kButtonReleaseMask);
81 TGSpeedo::TGSpeedo(
const TGWindow *p, Float_t smin, Float_t smax,
82 const char *lbl1,
const char *lbl2,
const char *dsp1,
83 const char *dsp2,
int id)
84 : TGFrame(p, 1, 1), TGWidget (id), fImage(0), fImage2(0), fBase(0)
101 fTextFS = fCounterFS = kNone;
102 fThreshold[0] = fThreshold[1] = fThreshold[2] = 0.0;
103 fThresholdColor[0] = kGreen;
104 fThresholdColor[1] = kOrange;
105 fThresholdColor[2] = kRed;
106 fThresholdActive = kFALSE;
107 fPicName =
"speedo.gif";
108 fImage = TImage::Open(fPicName);
109 if (!fImage || !fImage->IsValid())
110 Error(
"TGSpeedo::Build",
"%s not found", fPicName.Data());
112 AddInput(kButtonPressMask | kButtonReleaseMask);
118 void TGSpeedo::Build()
121 Float_t step, mark[5];
122 TString ar =
"arialbd.ttf";
123 Int_t i, nexe, offset;
125 const TGFont *counterFont = fClient->GetFont(
"-*-helvetica-bold-r-*-*-12-*-*-*-*-*-*-*");
126 if (!counterFont)
return;
127 fCounterFS = counterFont->GetFontStruct();
129 const TGFont *textFont = fClient->GetFont(
"-*-helvetica-bold-r-*-*-8-*-*-*-*-*-*-*");
130 if (!textFont)
return;
131 fTextFS = textFont->GetFontStruct();
133 const TGFont *labelFont = fClient->GetFont(
"-*-helvetica-bold-r-*-*-14-*-*-*-*-*-*-*");
134 if (!labelFont)
return;
135 FontStruct_t labelFS = labelFont->GetFontStruct();
137 if (fImage && fImage->IsValid()) {
138 fBase = fClient->GetPicturePool()->GetPicture(gSystem->BaseName(fPicName.Data()),
139 fImage->GetPixmap(), fImage->GetMask());
141 Float_t xc = (Float_t)(fBase ? (fBase->GetWidth() + 1) / 2 : 96.0);
142 Float_t yc = (Float_t)(fBase ? (fBase->GetHeight() + 1) / 2 : 96.0);
145 step = (fScaleMax - fScaleMin) / 4.0;
148 for (i=1; i<4; i++) {
149 mark[i] = mark[i-1] + step;
152 if (fScaleMax >= 1000.0) {
156 for (i=0; i<5; i++) {
160 if (mark[4] < 1000.0)
break;
163 fImage->DrawText((Int_t)xc - 11, (Int_t)yc + 15,
"x10", 12,
"#ffffff", ar);
165 fImage->DrawText((Int_t)xc + 11, (Int_t)yc + 13, sc.Data(), 10,
"#ffffff", ar);
167 else if (fScaleMax < 100.0) {
171 for (i=0; i<5; i++) {
175 if (mark[4] > 99.9 )
break;
178 fImage->DrawText((Int_t)xc - 11, (Int_t)yc + 15,
"x10", 12,
"#ffffff", ar);
180 fImage->DrawText((Int_t)xc + 11, (Int_t)yc + 13, sc.Data(), 10,
"#ffffff", ar);
183 sc.Form(
"%d",(Int_t)mark[0]);
184 fImage->DrawText((Int_t)xc - 51, (Int_t)yc + 30, sc.Data(), 14,
"#ffffff", ar);
185 sc.Form(
"%d",(Int_t)mark[1]);
186 fImage->DrawText((Int_t)xc - 59, (Int_t)yc - 29, sc.Data(), 14,
"#ffffff", ar);
187 sc.Form(
"%d",(Int_t)mark[2]);
188 offset = gVirtualX->TextWidth(labelFS, sc.Data(), sc.Length()) / 2;
189 fImage->DrawText((Int_t)xc - offset, (Int_t)yc - 65, sc.Data(), 14,
"#ffffff", ar);
190 sc.Form(
"%d",(Int_t)mark[3]);
191 offset = 60 - gVirtualX->TextWidth(labelFS, sc.Data(), sc.Length());
192 fImage->DrawText((Int_t)xc + offset, (Int_t)yc - 29, sc.Data(), 14,
"#ffffff", ar);
193 sc.Form(
"%d",(Int_t)mark[4]);
194 offset = 52 - gVirtualX->TextWidth(labelFS, sc.Data(), sc.Length());
195 fImage->DrawText((Int_t)xc + offset, (Int_t)yc + 30, sc.Data(), 14,
"#ffffff", ar);
197 fImage->DrawText((Int_t)xc + 13, (Int_t)yc - 17, fLabel1.Data(), 14,
"#ffffff", ar);
198 fImage->DrawText((Int_t)xc + 13, (Int_t)yc - 4, fLabel2.Data(), 12,
"#ffffff", ar);
200 gVirtualX->ShapeCombineMask(fId, 0, 0, fBase->GetMask());
207 TGSpeedo::~TGSpeedo()
209 if (fImage && fImage->IsValid())
211 if (fImage2 && fImage2->IsValid())
214 fClient->FreePicture(fBase);
220 TGDimension TGSpeedo::GetDefaultSize()
const
223 return TGDimension(fBase->GetWidth(), fBase->GetHeight());
224 return TGDimension(100, 100);
230 void TGSpeedo::Glow(EGlowColor col)
232 static EGlowColor act_col = kNoglow;
233 TImage *glowImage = 0;
238 if (fImage && fImage->IsValid())
245 glowImage = TImage::Open(
"glow_green.png");
246 if (!glowImage || !glowImage->IsValid()) {
247 Error(
"TGSpeedo::Glow",
"glow_green.png not found");
252 glowImage = TImage::Open(
"glow_orange.png");
253 if (!glowImage || !glowImage->IsValid()) {
254 Error(
"TGSpeedo::Glow",
"glow_orange.png not found");
259 glowImage = TImage::Open(
"glow_red.png");
260 if (!glowImage || !glowImage->IsValid()) {
261 Error(
"TGSpeedo::Glow",
"glow_red.png not found");
266 fImage = TImage::Open(fPicName);
267 if (fImage && fImage->IsValid() && glowImage && glowImage->IsValid()) {
268 fImage->Merge(glowImage);
279 Bool_t TGSpeedo::HandleButton(Event_t *event)
282 int xc = (fBase->GetWidth() + 1) / 2;
283 int yc = (fBase->GetHeight() + 1) / 2;
284 if (event->fType == kButtonRelease && event->fCode == kButton1) {
286 if ((event->fX > (xc - 26)) && (
event->fX < (xc + 26)) &&
287 (
event->fY < (yc + 50)) && (
event->fY > (yc + 28))) {
291 else if ((event->fX > (xc + 30)) && (event->fX < (xc + 40)) &&
292 (event->fY > (yc + 57)) && (event->fY < (yc + 67))) {
296 if (event->fType == kButtonRelease && event->fCode == kButton3) {
306 void TGSpeedo::SetOdoValue(Int_t val)
319 void TGSpeedo::SetDisplayText(
const char *text1,
const char *text2)
321 if (!(fDisplay1.CompareTo(text1)) &&
322 !(fDisplay2.CompareTo(text2)))
333 void TGSpeedo::SetLabelText(
const char *text1,
const char *text2)
335 if (fImage && fImage->IsValid())
339 fImage = TImage::Open(fPicName);
340 if (!fImage || !fImage->IsValid())
341 Error(
"TGSpeedo::Build",
"%s not found", fPicName.Data());
349 void TGSpeedo::SetMinMaxScale(Float_t min, Float_t max)
351 if (fImage && fImage->IsValid())
355 fImage = TImage::Open(fPicName);
356 if (!fImage || !fImage->IsValid())
357 Error(
"TGSpeedo::Build",
"%s not found", fPicName.Data());
365 void TGSpeedo::SetScaleValue(Float_t val)
372 if (fValue > fScaleMax)
374 else if (fValue < fScaleMin)
377 if (fThresholdActive) {
378 if (fValue < fThreshold[0])
380 if (fValue >= fThreshold[0] && fValue < fThreshold[1])
381 Glow(fThresholdColor[0]);
382 if (fValue >= fThreshold[1] && fValue < fThreshold[2])
383 Glow(fThresholdColor[1]);
384 if (fValue >= fThreshold[2])
385 Glow(fThresholdColor[2]);
387 if (fValue > fPeakVal)
390 fAngle = fAngleMin + (fValue / ((fScaleMax - fScaleMin) /
391 (fAngleMax - fAngleMin)));
393 if (fAngle > fAngleMax)
395 else if (fAngle < fAngleMin)
403 void TGSpeedo::SetScaleValue(Float_t val, Int_t damping)
406 Float_t old_val = fValue;
407 Float_t step, new_val = val;
412 if ((damping > 0) || (gVirtualX->InheritsFrom(
"TGX11")))
417 Float_t diff_angle = fAngleMax - fAngleMin;
418 Float_t diff_scale = fScaleMax - fScaleMin;
419 Float_t diff_ratio = diff_scale / diff_angle;
420 Float_t old_angle = fAngleMin + (old_val / diff_ratio);
421 Float_t new_angle = fAngleMin + (new_val / diff_ratio);
423 if (new_angle > old_angle) {
424 for (i=old_angle; i<new_angle; i+=step) {
425 new_val = (i - fAngleMin) * diff_ratio;
426 SetScaleValue(new_val);
428 gSystem->Sleep(damping);
431 if (new_angle < old_angle) {
432 for (i=old_angle; i>new_angle; i-=step) {
433 new_val = (i - fAngleMin) * diff_ratio;
434 SetScaleValue(new_val);
436 gSystem->Sleep(damping);
446 void TGSpeedo::StepScale(Float_t step)
448 SetScaleValue(fValue + step);
454 void TGSpeedo::Translate(Float_t val, Float_t angle, Int_t *x, Int_t *y)
456 Float_t xc = (Float_t)(fBase ? (fBase->GetWidth() + 1) / 2 : 96.0);
457 Float_t yc = (Float_t)(fBase ? (fBase->GetHeight() + 1) / 2 : 96.0);
458 *x = (Int_t)(xc + val * sin(angle * TMath::Pi() / 180) + 0.5);
459 *y = (Int_t)(yc - val * cos(angle * TMath::Pi() / 180) + 0.5);
465 void TGSpeedo::DrawNeedle()
467 Int_t xch0, xch1, ych0, ych1;
468 Int_t xpk0, ypk0, xpk1, ypk1;
469 Int_t xmn0, ymn0, xmn1, ymn1;
470 fValue = (fAngle - fAngleMin) * ((fScaleMax - fScaleMin) /
471 (fAngleMax - fAngleMin));
474 Translate(9.0, fAngle, &xch0, &ych0);
475 Translate(73.0, fAngle, &xch1, &ych1);
478 Float_t angle = fAngleMin + (fPeakVal / ((fScaleMax - fScaleMin) /
479 (fAngleMax - fAngleMin)));
480 Translate(80.0, angle, &xpk0, &ypk0);
481 Translate(67.0, angle, &xpk1, &ypk1);
484 angle = fAngleMin + (fMeanVal / ((fScaleMax - fScaleMin) /
485 (fAngleMax - fAngleMin)));
486 Translate(80.0, angle, &xmn0, &ymn0);
487 Translate(70.0, angle, &xmn1, &ymn1);
489 if (fImage2 && fImage2->IsValid()) {
491 TImage *img = (TImage*)fImage2->Clone(
"img");
492 if (!img || !img->IsValid())
return;
494 img->DrawLine(xpk0, ypk0, xpk1, ypk1,
"#00ff00", 3);
495 img->DrawLine(xpk0, ypk0, xpk1, ypk1,
"#ffffff", 1);
498 img->DrawLine(xmn0, ymn0, xmn1, ymn1,
"#ffff00", 3);
499 img->DrawLine(xmn0, ymn0, xmn1, ymn1,
"#ff0000", 1);
502 img->DrawLine(xch0, ych0, xch1, ych1,
"#ff0000", 2);
504 img->PaintImage(fId, 0, 0, 0, 0, 0, 0,
"opaque");
514 void TGSpeedo::DrawText()
521 Float_t xc = fBase ? (fBase->GetWidth() + 1) / 2 : 96.0;
522 Float_t yc = fBase ? (fBase->GetHeight() + 1) / 2 : 96.0;
524 if (fImage && fImage->IsValid()) {
526 if (fImage2 && fImage2->IsValid())
528 fImage2 = (TImage*)fImage->Clone(
"fImage2");
529 if (!fImage2 || !fImage2->IsValid())
return;
530 TString ar =
"arialbd.ttf";
534 if (fCounter >= 10000) {
538 if (nexe%3 == 0 && ww < 10000)
break;
540 fImage2->DrawText((Int_t)xc - 9, (Int_t)yc + 72,
"x10", 10,
"#ffffff", ar);
541 snprintf(sval, 80,
"%d", nexe);
542 fImage2->DrawText((Int_t)xc + 9, (Int_t)yc + 69, sval, 8,
"#ffffff", ar);
544 snprintf(sval, 80,
"%04d", (
int)ww);
545 snprintf(dsval, 80,
"%c %c %c %c", sval[0], sval[1], sval[2], sval[3]);
547 if (gVirtualX->InheritsFrom(
"TGX11")) {
549 fImage2->DrawText((Int_t)xc - 18, (Int_t)yc + 55, dsval, 12,
"#ffffff", ar);
552 fImage2->DrawText((Int_t)xc - 16, (Int_t)yc + 56, dsval, 12,
"#ffffff", ar);
556 strSize = gVirtualX->TextWidth(fTextFS, fDisplay1.Data(), fDisplay1.Length()) - 6;
558 fImage2->DrawText((Int_t)xc - (strSize / 2), (Int_t)yc + 29, fDisplay1.Data(), 8,
"#ffffff", ar);
560 strSize = gVirtualX->TextWidth(fTextFS, fDisplay2.Data(), fDisplay2.Length()) - 6;
561 fImage2->DrawText((Int_t)xc - (strSize / 2), (Int_t)yc + 38, fDisplay2.Data(), 8,
"#ffffff", ar);
568 void TGSpeedo::DoRedraw()
573 Int_t xch0, xch1, ych0, ych1;
574 Int_t xpk0, ypk0, xpk1, ypk1;
575 Int_t xmn0, ymn0, xmn1, ymn1;
576 static Bool_t first = kTRUE;
581 fValue = (fAngle - fAngleMin) * ((fScaleMax - fScaleMin) /
582 (fAngleMax - fAngleMin));
585 Float_t xc = fBase ? (fBase->GetWidth() + 1) / 2 : 96.0;
586 Float_t yc = fBase ? (fBase->GetHeight() + 1) / 2 : 96.0;
589 Translate(9.0, fAngle, &xch0, &ych0);
590 Translate(73.0, fAngle, &xch1, &ych1);
593 Float_t angle = fAngleMin + (fPeakVal / ((fScaleMax - fScaleMin) /
594 (fAngleMax - fAngleMin)));
595 Translate(80.0, angle, &xpk0, &ypk0);
596 Translate(67.0, angle, &xpk1, &ypk1);
599 angle = fAngleMin + (fMeanVal / ((fScaleMax - fScaleMin) /
600 (fAngleMax - fAngleMin)));
601 Translate(80.0, angle, &xmn0, &ymn0);
602 Translate(70.0, angle, &xmn1, &ymn1);
604 if (fImage && fImage->IsValid()) {
606 if (fImage2 && fImage2->IsValid())
608 fImage2 = (TImage*)fImage->Clone(
"fImage2");
609 if (!fImage2 || !fImage2->IsValid())
return;
610 TString ar =
"arialbd.ttf";
614 if (fCounter >= 10000) {
618 if (nexe%3 == 0 && ww < 10000)
break;
620 fImage2->DrawText((Int_t)xc - 9, (Int_t)yc + 72,
"x10", 10,
"#ffffff", ar);
621 snprintf(sval, 80,
"%d", nexe);
622 fImage2->DrawText((Int_t)xc + 9, (Int_t)yc + 69, sval, 8,
"#ffffff", ar);
624 snprintf(sval, 80,
"%04d", (
int)ww);
625 snprintf(dsval, 80,
"%c %c %c %c", sval[0], sval[1], sval[2], sval[3]);
627 if (gVirtualX->InheritsFrom(
"TGX11")) {
629 fImage2->DrawText((Int_t)xc - 18, (Int_t)yc + 55, dsval, 12,
"#ffffff", ar);
632 fImage2->DrawText((Int_t)xc - 16, (Int_t)yc + 56, dsval, 12,
"#ffffff", ar);
636 strSize = gVirtualX->TextWidth(fTextFS, fDisplay1.Data(), fDisplay1.Length()) - 6;
638 fImage2->DrawText((Int_t)xc - (strSize / 2), (Int_t)yc + 29, fDisplay1.Data(), 8,
"#ffffff", ar);
640 strSize = gVirtualX->TextWidth(fTextFS, fDisplay2.Data(), fDisplay2.Length()) - 6;
641 fImage2->DrawText((Int_t)xc - (strSize / 2), (Int_t)yc + 38, fDisplay2.Data(), 8,
"#ffffff", ar);
642 TImage *img = (TImage*)fImage2->Clone(
"img");
643 if (!img || !img->IsValid())
return;
645 img->DrawLine(xpk0, ypk0, xpk1, ypk1,
"#00ff00", 3);
646 img->DrawLine(xpk0, ypk0, xpk1, ypk1,
"#ffffff", 1);
649 img->DrawLine(xmn0, ymn0, xmn1, ymn1,
"#ffff00", 3);
650 img->DrawLine(xmn0, ymn0, xmn1, ymn1,
"#ff0000", 1);
653 img->DrawLine(xch0, ych0, xch1, ych1,
"#ff0000", 2);
655 img->PaintImage(fId, 0, 0, 0, 0, 0, 0,
"opaque");