diff --git a/meter.cpp b/meter.cpp index 07494d2..8f0ce3b 100644 --- a/meter.cpp +++ b/meter.cpp @@ -23,6 +23,13 @@ meter::meter(QWidget *parent) : QWidget(parent) // // Text in qdarkstylesheet seems to be #EFF0F1 + if(drawLabels) + { + mXstart = 32; + } else { + mXstart = 0; + } + meterType = meterS; currentColor.setNamedColor("#148CD2"); @@ -85,52 +92,57 @@ void meter::paintEvent(QPaintEvent *) // space of the widget, and gives it corrdinates. // The end effect, is that the drawing functions will all // scale to the window size. - - //painter.setWindow(QRect(0, 0, 255+mXstart, widgetWindowHeight)); - - //if(this->height() > widgetWindowHeight ) - //{ - // Clamp down on stretching fonts. - // TODO: Make this more elegant -// painter.setFont(QFont(this->fontInfo().family(), widgetWindowHeight/3.5)); - - painter.setFont(QFont(this->fontInfo().family(), fontSize)); - widgetWindowHeight = this->height(); - painter.setWindow(QRect(0, 0, 255+mXstart+15, widgetWindowHeight)); - barHeight = widgetWindowHeight / 2; - - - //painter.setFont(QFont(this->fontInfo().family(), widgetWindowHeight/2.5)); - //} + painter.setRenderHint(QPainter::SmoothPixmapTransform); + painter.setFont(QFont(this->fontInfo().family(), fontSize)); + widgetWindowHeight = this->height(); + painter.setWindow(QRect(0, 0, 255+mXstart+15, widgetWindowHeight)); + barHeight = widgetWindowHeight / 2; switch(meterType) { case meterS: + label = "S"; peakRedLevel = 120; // S9+ drawScaleS(&painter); break; case meterPower: + label = "PWR"; peakRedLevel = 210; // 100% drawScalePo(&painter); break; case meterALC: + label = "ALC"; peakRedLevel = 100; drawScaleALC(&painter); break; case meterSWR: + label = "SWR"; peakRedLevel = 100; // SWR 2.5 drawScaleSWR(&painter); break; case meterCenter: + label = "CTR"; peakRedLevel = 256; // No need for red here drawScaleCenter(&painter); break; case meterVoltage: + label = "Vd"; peakRedLevel = 241; drawScaleVd(&painter); break; + case meterCurrent: + label = "Id"; + peakRedLevel = 120; + drawScaleId(&painter); + break; + case meterComp: + label = "CMP"; + peakRedLevel = 100; + drawScaleComp(&painter); + break; default: - peakRedLevel = 200; + label = "DN"; + peakRedLevel = 241; drawScaleRaw(&painter); break; } @@ -181,6 +193,16 @@ void meter::paintEvent(QPaintEvent *) painter.drawRect(mXstart+peak-1,mYstart,2,barHeight); } + if(drawLabels) + { + drawLabel(&painter); + } +} + +void meter::drawLabel(QPainter *qp) +{ + qp->setPen(lowLineColor); + qp->drawText(0,scaleTextYstart, label ); } void meter::setLevel(int current) @@ -231,7 +253,7 @@ void meter::drawScaleRaw(QPainter *qp) qp->setPen(lowTextColor); //qp->setFont(QFont("Arial", fontSize)); int i=mXstart; - for(; idrawText(i,scaleTextYstart, QString("%1").arg(i) ); } @@ -264,7 +286,7 @@ void meter::drawScaleVd(QPainter *qp) float VdperDn = (float)(highPointVd-midPointVd) / float(highPointDn-midPointDn); int i=mXstart; - for(; idrawText(i,scaleTextYstart, QString("%1").arg( (int)((i-mXstart) * (float(midPointVd) / float(midPointDn)) )) ); } @@ -382,6 +404,7 @@ void meter::drawScaleALC(QPainter *qp) for(; idrawText(i,scaleTextYstart, QString("%1").arg(alc) ); + qp->drawLine(i,scaleTextYstart, i, scaleTextYstart+5); alc +=20; } @@ -390,6 +413,7 @@ void meter::drawScaleALC(QPainter *qp) for(; idrawText(i,scaleTextYstart, QString("+%1").arg(alc) ); + qp->drawLine(i,scaleTextYstart, i, scaleTextYstart+5); alc +=10; } @@ -401,6 +425,44 @@ void meter::drawScaleALC(QPainter *qp) (void)qp; } +void meter::drawScaleComp(QPainter *qp) +{ + // + // 0000=0 dB, 0130=15 dB,0241=30 dB + // + + qp->setPen(lowTextColor); + + int midPointDn = 130; + int midPointdB = 15; + + int highPointDn = 241; + int highPointdB = 30; + float dBperDn = (float)(highPointdB-midPointdB) / float(highPointDn-midPointDn); + + int i=mXstart; + for(; idrawText(i,scaleTextYstart, QString("%1").arg( (int)((i-mXstart) * (float(midPointdB) / float(midPointDn)) )) ); + qp->drawLine(i,scaleTextYstart, i, scaleTextYstart+5); + } + + i = midPointDn+60; + for(; idrawText(i,scaleTextYstart, QString("%1").arg( (int) std::round( ((i-mXstart-midPointDn) * (dBperDn) ) + (midPointdB) ))); + qp->drawLine(i,scaleTextYstart, i, scaleTextYstart+5); + } + + // Now the lines: + qp->setPen(lowLineColor); + + // Line: X1, Y1 -->to--> X2, Y2 + qp->drawLine(mXstart,scaleLineYstart,peakRedLevel+mXstart,scaleLineYstart); + qp->setPen(Qt::red); + qp->drawLine(peakRedLevel+mXstart,scaleLineYstart,255+mXstart,scaleLineYstart); +} + void meter::drawScaleSWR(QPainter *qp) { // From the manual: @@ -411,26 +473,71 @@ void meter::drawScaleSWR(QPainter *qp) qp->drawText(mXstart,scaleTextYstart, QString("1.0")); qp->drawText(24+mXstart,scaleTextYstart, QString("1.3")); - qp->drawText(48+mXstart,scaleTextYstart, QString("1.5")); + qp->drawText(48+mXstart,scaleTextYstart, QString("1.5")); qp->drawText(80+mXstart,scaleTextYstart, QString("2.0")); qp->drawText(100+mXstart,scaleTextYstart, QString("2.5")); qp->drawText(120+mXstart,scaleTextYstart, QString("3.0")); + qp->drawLine( 0+mXstart,scaleTextYstart, 0+mXstart, scaleTextYstart+5); + qp->drawLine( 24+mXstart,scaleTextYstart, 24+mXstart, scaleTextYstart+5); + qp->drawLine( 48+mXstart,scaleTextYstart, 48+mXstart, scaleTextYstart+5); + qp->drawLine( 80+mXstart,scaleTextYstart, 80+mXstart, scaleTextYstart+5); + qp->drawLine(100+mXstart,scaleTextYstart,100+mXstart, scaleTextYstart+5); // does not draw? + qp->drawLine(120+mXstart,scaleTextYstart,120+mXstart, scaleTextYstart+5); + + qp->setPen(lowLineColor); qp->drawLine(mXstart,scaleLineYstart,100+mXstart,scaleLineYstart); qp->setPen(Qt::red); qp->drawLine(100+mXstart,scaleLineYstart,255+mXstart,scaleLineYstart); - (void)qp; + } void meter::drawScaleId(QPainter *qp) { - (void)qp; + // IC-7300: + // 0000=0, 0097=10, 0146=15, 0241=25 + // + + qp->setPen(lowTextColor); + //qp->setFont(QFont("Arial", fontSize)); + + // 7300/9700 and others: + int midPointDn = 97; + int midPointId = 10; + + int highPointDn = 146; + int highPointId = 15; + float IdperDn = (float)(highPointId-midPointId) / float(highPointDn-midPointDn); + + int i=mXstart; + for(; idrawText(i,scaleTextYstart, QString("%1").arg( (int)((i-mXstart) * (float(midPointId) / float(midPointDn)) )) ); + } + + for(; idrawText(i,scaleTextYstart, QString("%1").arg( (int) std::round( ((i-mXstart-midPointDn) * (IdperDn) ) + (midPointId) ))); + qp->drawLine(i,scaleTextYstart, i, scaleTextYstart+5); + } + + // Now the lines: + qp->setPen(lowLineColor); + + // Line: X1, Y1 -->to--> X2, Y2 + qp->drawLine(mXstart,scaleLineYstart,peakRedLevel+mXstart,scaleLineYstart); + qp->setPen(Qt::red); + qp->drawLine(peakRedLevel+mXstart,scaleLineYstart,255+mXstart,scaleLineYstart); } void meter::drawScaleS(QPainter *qp) { + // + // 0000=S0, 0120=S9, 0241=S9+60dB + // 120 / 9 = 13.333 steps per S-unit + qp->setPen(lowTextColor); //qp->setFont(QFont("Arial", fontSize)); int i=mXstart; @@ -439,6 +546,7 @@ void meter::drawScaleS(QPainter *qp) for(; idrawText(i,scaleTextYstart, QString("%1").arg(s++) ); + qp->drawLine(i,scaleTextYstart, i, scaleTextYstart+5); } // 2 DN per 1 dB now: @@ -454,13 +562,14 @@ void meter::drawScaleS(QPainter *qp) for(; idrawText(i,scaleTextYstart, QString("+%1").arg(s) ); + qp->drawLine(i,scaleTextYstart, i, scaleTextYstart+5); s = s + 20; } qp->setPen(lowLineColor); - qp->drawLine(mXstart,scaleLineYstart,130,scaleLineYstart); + qp->drawLine(mXstart,scaleLineYstart,peakRedLevel+mXstart,scaleLineYstart); qp->setPen(Qt::red); - qp->drawLine(130,scaleLineYstart,255,scaleLineYstart); + qp->drawLine(peakRedLevel+mXstart,scaleLineYstart,255+mXstart,scaleLineYstart); } diff --git a/meter.h b/meter.h index 1708757..472408f 100644 --- a/meter.h +++ b/meter.h @@ -50,7 +50,7 @@ private: int peakRedLevel=0; - + bool drawLabels = true; int mXstart = 0; // Starting point for S=0. int mYstart = 14; // height, down from top, where the drawing starts int barHeight = 10; // Height of meter "bar" indicators @@ -67,8 +67,13 @@ private: void drawScaleSWR(QPainter *qp); void drawScaleVd(QPainter *qp); void drawScaleId(QPainter *qp); + void drawScaleComp(QPainter *qp); void drawScaleRaw(QPainter *qp); + void drawLabel(QPainter *qp); + + QString label; + QColor currentColor; QColor averageColor; QColor peakColor;