00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 #include "qcgaugewidget.h"
00032 
00036 
00037 QcGaugeWidget::QcGaugeWidget(QWidget *parent) :
00038     QWidget(parent)
00039 {
00040     setMinimumSize(250,250);
00041 }
00042 
00043 QcBackgroundItem *QcGaugeWidget::addBackground(float position)
00044 {
00045     QcBackgroundItem * item = new QcBackgroundItem(this);
00046     item->setPosition(position);
00047     mItems.append(item);
00048     return item;
00049 }
00050 
00051 QcDegreesItem *QcGaugeWidget::addDegrees(float position)
00052 {
00053     QcDegreesItem * item = new QcDegreesItem(this);
00054     item->setPosition(position);
00055 
00056     mItems.append(item);
00057     return item;
00058 }
00059 
00060 
00061 QcValuesItem *QcGaugeWidget::addValues(float position)
00062 {
00063     QcValuesItem * item = new QcValuesItem(this);
00064     item->setPosition(position);
00065     mItems.append(item);
00066     return item;
00067 }
00068 
00069 QcArcItem *QcGaugeWidget::addArc(float position)
00070 {
00071     QcArcItem * item = new QcArcItem(this);
00072     item->setPosition(position);
00073     mItems.append(item);
00074     return item;
00075 }
00076 
00077 QcColorBand *QcGaugeWidget::addColorBand(float position)
00078 {
00079     QcColorBand * item = new QcColorBand(this);
00080     item->setPosition(position);
00081     mItems.append(item);
00082     return item;
00083 }
00084 
00085 QcNeedleItem *QcGaugeWidget::addNeedle(float position)
00086 {
00087     QcNeedleItem * item = new QcNeedleItem(this);
00088     item->setPosition(position);
00089     mItems.append(item);
00090     return item;
00091 }
00092 
00093 QcLabelItem *QcGaugeWidget::addLabel(float position)
00094 {
00095     QcLabelItem * item = new QcLabelItem(this);
00096     item->setPosition(position);
00097     mItems.append(item);
00098     return item;
00099 }
00100 
00101 QcGlassItem *QcGaugeWidget::addGlass(float position)
00102 {
00103     QcGlassItem * item = new QcGlassItem(this);
00104     item->setPosition(position);
00105     mItems.append(item);
00106     return item;
00107 }
00108 
00109 QcAttitudeMeter *QcGaugeWidget::addAttitudeMeter(float position)
00110 {
00111     QcAttitudeMeter * item = new QcAttitudeMeter(this);
00112     item->setPosition(position);
00113     mItems.append(item);
00114     return item;
00115 }
00116 
00117 void QcGaugeWidget::addItem(QcItem *item,float position)
00118 {
00119     
00120     item->setParent(this);
00121     item->setPosition(position);
00122     mItems.append(item);
00123 }
00124 
00125 int QcGaugeWidget::removeItem(QcItem *item)
00126 {
00127    return mItems.removeAll(item);
00128 }
00129 
00130 QList<QcItem *> QcGaugeWidget::items()
00131 {
00132     return mItems;
00133 }
00134 
00135 
00136 void QcGaugeWidget::paintEvent(QPaintEvent *)
00137 {
00138     QPainter painter(this);
00139     painter.setRenderHint(QPainter::Antialiasing);
00140 
00141     foreach (QcItem * item, mItems) {
00142         item->draw(&painter);
00143     }
00144 }
00148 
00149 QcItem::QcItem(QObject *parent) :
00150     QObject(parent)
00151 {
00152 
00153     parentWidget = qobject_cast<QWidget*>(parent);
00154     mPosition = 50;
00155 }
00156 
00157 int QcItem::type()
00158 {
00159     return 50;
00160 }
00161 
00162 void QcItem::update()
00163 {
00164     parentWidget->update();
00165 }
00166 
00167 float QcItem::position()
00168 {
00169     return mPosition;
00170 }
00171 
00172 QRectF QcItem::rect()
00173 {
00174     return mRect;
00175 }
00176 
00177 void QcItem::setPosition(float position)
00178 {
00179     if(position>100)
00180         mPosition = 100;
00181     else if(position<0)
00182         mPosition = 0;
00183     else
00184         mPosition = position;
00185     update();
00186 }
00187 
00188 QRectF QcItem::adjustRect(float percentage)
00189 {
00190     float r = getRadius(mRect);
00191     float offset =   r-(percentage*r)/100.0;
00192     QRectF tmpRect = mRect.adjusted(offset,offset,-offset,-offset);
00193     return tmpRect;
00194 }
00195 
00196 float QcItem::getRadius(const QRectF &tmpRect)
00197 {
00198     float r = 0;
00199     if(tmpRect.width()<tmpRect.height())
00200         r = tmpRect.width()/2.0;
00201     else
00202         r = tmpRect.height()/2.0;
00203     return r;
00204 }
00205 
00206 QRectF QcItem::resetRect()
00207 {
00208     mRect = parentWidget->rect();
00209     float r = getRadius(mRect);
00210     mRect.setWidth(2.0*r);
00211     mRect.setHeight(2.0*r);
00212     mRect.moveCenter(parentWidget->rect().center());
00213     return mRect;
00214 }
00215 
00216 QPointF QcItem::getPoint(float deg,const QRectF &tmpRect)
00217 {
00218     float r = getRadius(tmpRect);
00219     float xx=cos(0.0174533*deg)*r; 
00220     float yy=sin(0.0174533*deg)*r; 
00221     QPointF pt;
00222     xx=tmpRect.center().x()-xx;
00223     yy=tmpRect.center().y()-yy;
00224     pt.setX(xx);
00225     pt.setY(yy);
00226     return pt;
00227 }
00228 
00229 
00230 
00231 float QcItem::getAngle(const QPointF&pt, const QRectF &tmpRect)
00232 {
00233     float xx=tmpRect.center().x()-pt.x();
00234     float yy=tmpRect.center().y()-pt.y();
00235     return 0.0174533*( atan2(yy,xx));
00236 }
00237 
00241 
00242 QcScaleItem::QcScaleItem(QObject *parent) :
00243     QcItem(parent)
00244 {
00245     mMinDegree = -45;
00246     mMaxDegree = 225;
00247     mMinValue = 0;
00248     mMaxValue = 100;
00249 }
00250 
00251 void QcScaleItem::setValueRange(float minValue, float maxValue)
00252 {
00253     if(!(minValue<maxValue))
00254         throw( InvalidValueRange);
00255     mMinValue = minValue;
00256     mMaxValue = maxValue;
00257 
00258 }
00259 
00260 void QcScaleItem::setDgereeRange(float minDegree, float maxDegree)
00261 {
00262     if(!(minDegree<maxDegree))
00263         throw( InvalidValueRange);
00264     mMinDegree = minDegree;
00265     mMaxDegree = maxDegree;
00266 }
00267 
00268 float QcScaleItem::getDegFromValue(float v)
00269 {
00270     float a = (mMaxDegree-mMinDegree)/(mMaxValue-mMinValue);
00271     float b = -a*mMinValue+mMinDegree;
00272     return a*v+b;
00273 }
00274 
00275 
00276 void QcScaleItem::setMinValue(float minValue)
00277 {
00278     if(minValue>mMaxValue)
00279         throw (InvalidValueRange);
00280     mMinValue = minValue;
00281     update();
00282 }
00283 
00284 
00285 void QcScaleItem::setMaxValue(float maxValue)
00286 {
00287     if(maxValue<mMinValue )
00288         throw (InvalidValueRange);
00289     mMaxValue = maxValue;
00290     update();
00291 }
00292 
00293 void QcScaleItem::setMinDegree(float minDegree)
00294 {
00295     if(minDegree>mMaxDegree)
00296         throw (InvalidDegreeRange);
00297     mMinDegree = minDegree;
00298     update();
00299 }
00300 void QcScaleItem::setMaxDegree(float maxDegree)
00301 {
00302     if(maxDegree<mMinDegree)
00303         throw (InvalidDegreeRange);
00304     mMaxDegree = maxDegree;
00305     update();
00306 }
00307 
00311 
00312 QcBackgroundItem::QcBackgroundItem(QObject *parent) :
00313     QcItem(parent)
00314 {
00315     setPosition(88);
00316     mPen = Qt::NoPen;
00317     setPosition(88);
00318 
00319     addColor(0.4,Qt::darkGray);
00320     addColor(0.8,Qt::black);
00321 
00322 }
00323 
00324 
00325 void QcBackgroundItem::draw(QPainter* painter)
00326 {
00327     QRectF tmpRect = resetRect();
00328     painter->setBrush(Qt::NoBrush);
00329     QLinearGradient linearGrad(tmpRect.topLeft(), tmpRect.bottomRight());
00330     for(int i = 0;i<mColors.size();i++){
00331         linearGrad.setColorAt(mColors[i].first,mColors[i].second);
00332     }
00333     painter->setPen(mPen);
00334     painter->setBrush(linearGrad);
00335     painter->drawEllipse(adjustRect(position()));
00336 }
00337 
00338 void QcBackgroundItem::addColor(float position, const QColor &color)
00339 {
00340     if(position<0||position>1)
00341         return;
00342       QPair<float,QColor> pair;
00343       pair.first = position;
00344       pair.second = color;
00345       mColors.append(pair);
00346       update();
00347 }
00348 
00349 void QcBackgroundItem::clearrColors()
00350 {
00351     mColors.clear();
00352 }
00353 
00357 
00358 QcGlassItem::QcGlassItem(QObject *parent) :
00359     QcItem(parent)
00360 {
00361     setPosition(88);
00362 }
00363 
00364 void QcGlassItem::draw(QPainter *painter)
00365 {
00366     resetRect();
00367     QRectF tmpRect1 = adjustRect(position());
00368     QRectF tmpRect2 = tmpRect1;
00369     float r = getRadius(tmpRect1);
00370     tmpRect2.setHeight(r/2.0);
00371     painter->setPen(Qt::NoPen);
00372 
00373     QColor clr1 = Qt::gray ;
00374     QColor clr2 = Qt::white;
00375     clr1.setAlphaF(0.2);
00376     clr2.setAlphaF(0.4);
00377 
00378     QLinearGradient linearGrad1(tmpRect1.topLeft(), tmpRect1.bottomRight());
00379     linearGrad1.setColorAt(0.1, clr1);
00380     linearGrad1.setColorAt(0.5, clr2);
00381 
00382     painter->setBrush(linearGrad1);
00383     painter->drawPie(tmpRect1,0,16*180);
00384     tmpRect2.moveCenter(rect().center());
00385     painter->drawPie(tmpRect2,0,-16*180);
00386 }
00390 
00391 QcLabelItem::QcLabelItem(QObject *parent) :
00392     QcItem(parent)
00393 {
00394     setPosition(50);
00395     mAngle = 270;
00396     mText = "%";
00397     mColor = Qt::black;
00398 }
00399 
00400 void QcLabelItem::draw(QPainter *painter)
00401 {
00402     resetRect();
00403     QRectF tmpRect = adjustRect(position());
00404     float r = getRadius(rect());
00405     QFont font("Meiryo UI", r/10.0, QFont::Bold);
00406     painter->setFont(font);
00407     painter->setPen(QPen(mColor));
00408 
00409     QPointF txtCenter = getPoint(mAngle,tmpRect);
00410     QFontMetrics fMetrics = painter->fontMetrics();
00411     QSize sz = fMetrics.size( Qt::TextSingleLine, mText );
00412     QRectF txtRect(QPointF(0,0), sz );
00413     txtRect.moveCenter(txtCenter);
00414 
00415     painter->drawText( txtRect, Qt::TextSingleLine,mText );
00416 
00417 }
00418 
00419 void QcLabelItem::setAngle(float a)
00420 {
00421     mAngle = a;
00422     update();
00423 }
00424 
00425 float QcLabelItem::angle()
00426 {
00427     return mAngle;
00428 }
00429 
00430 void QcLabelItem::setText(const QString &text, bool repaint)
00431 {
00432     mText = text;
00433     if(repaint)
00434         update();
00435 }
00436 
00437 QString QcLabelItem::text()
00438 {
00439     return mText;
00440 }
00441 
00442 void QcLabelItem::setColor(const QColor &color)
00443 {
00444     mColor = color;
00445     update();
00446 }
00447 
00448 QColor QcLabelItem::color()
00449 {
00450     return mColor;
00451 }
00452 
00456 
00457 QcArcItem::QcArcItem(QObject *parent) :
00458     QcScaleItem(parent)
00459 {
00460     setPosition(80);
00461     mColor = Qt::black;
00462 }
00463 
00464 void QcArcItem::draw(QPainter *painter)
00465 {
00466     resetRect();
00467     QRectF tmpRect= adjustRect(position());
00468     float r = getRadius(tmpRect);
00469 
00470     QPen pen;
00471     pen.setColor(mColor);
00472     pen.setWidthF(r/40);
00473     painter->setPen(pen);
00474     painter->drawArc(tmpRect,-16*(mMinDegree+180),-16*(mMaxDegree-mMinDegree));
00475 }
00476 
00477 void QcArcItem::setColor(const QColor &color)
00478 {
00479     mColor = color;
00480 }
00484 
00485 QcColorBand::QcColorBand(QObject *parent) :
00486     QcScaleItem(parent)
00487 {
00488     QColor tmpColor;
00489     tmpColor.setAlphaF(0.1);
00490     QPair<QColor,float> pair;
00491 
00492     pair.first = Qt::green;
00493     pair.second = 10;
00494     mBandColors.append(pair);
00495 
00496     pair.first = Qt::darkGreen;
00497     pair.second = 50;
00498     mBandColors.append(pair);
00499 
00500     pair.first = Qt::red;
00501     pair.second = 100;
00502     mBandColors.append(pair);
00503 
00504     setPosition(50);
00505 }
00506 
00507 QPainterPath QcColorBand::createSubBand(float from, float sweep)
00508 {
00509     QRectF tmpRect = adjustRect(position());
00510     QPainterPath path;
00511     path.arcMoveTo(tmpRect,180+from);
00512     path.arcTo(tmpRect,180+from,-sweep);
00513     return path;
00514 }
00515 
00516 void QcColorBand::draw(QPainter *painter)
00517 {
00518     resetRect();
00519     float r = getRadius(rect());
00520     QPen pen;
00521     pen.setCapStyle(Qt::FlatCap);
00522     pen.setWidthF(r/20.0);
00523     painter->setBrush(Qt::NoBrush);
00524     float offset = getDegFromValue(mBandStartValue);
00525     for(int i = 0;i<mBandColors.size();i++){
00526         QColor clr = mBandColors[i].first;
00527         float sweep;
00528         if(i==0)
00529             sweep = getDegFromValue(mBandColors[i].second)-getDegFromValue(mMinValue);
00530         else
00531             sweep = getDegFromValue(mBandColors[i].second)-getDegFromValue(mBandColors[i-1].second);
00532         QPainterPath path = createSubBand(-offset,sweep);
00533         offset += sweep;
00534         pen.setColor(clr);
00535         painter->setPen(pen);
00536         painter->drawPath(path);
00537     }
00538 }
00539 void QcColorBand::setColors(const QList<QPair<QColor, float> > &colors)
00540 {
00541     mBandColors = colors;
00542     update();
00543 }
00544 
00548 
00549 QcDegreesItem::QcDegreesItem(QObject *parent) :
00550     QcScaleItem(parent)
00551 {
00552     mStep = 10;
00553     mColor = Qt::black;
00554     mSubDegree = false;
00555     setPosition(90);
00556 }
00557 
00558 
00559 void QcDegreesItem::draw(QPainter *painter)
00560 {
00561     resetRect();
00562     QRectF tmpRect = adjustRect(position());
00563 
00564     painter->setPen(mColor);
00565     float r = getRadius(tmpRect);
00566     for(float val = mMinValue;val<=mMaxValue;val+=mStep){
00567         float deg = getDegFromValue(val);
00568         QPointF pt = getPoint(deg,tmpRect);
00569         QPainterPath path;
00570         path.moveTo(pt);
00571         path.lineTo(tmpRect.center());
00572         pt = path.pointAtPercent(0.03);
00573         QPointF newPt = path.pointAtPercent(0.13);
00574 
00575         QPen pen;
00576         pen.setColor(mColor);
00577         if(!mSubDegree)
00578             pen.setWidthF(r/25.0);
00579 
00580         painter->setPen(pen);
00581         painter->drawLine(pt,newPt);
00582 
00583     }
00584 }
00585 
00586 void QcDegreesItem::setStep(float step)
00587 {
00588     mStep = step;
00589     update();
00590 }
00591 
00592 void QcDegreesItem::setColor(const QColor& color)
00593 {
00594     mColor = color;
00595     update();
00596 }
00597 
00598 void QcDegreesItem::setSubDegree(bool b)
00599 {
00600     mSubDegree = b;
00601     update();
00602 }
00603 
00607 
00608 QcNeedleItem::QcNeedleItem(QObject *parent) :
00609     QcScaleItem(parent)
00610 {
00611     mCurrentValue = 0;
00612     mColor = Qt::black;
00613     mLabel = NULL;
00614     mNeedleType = FeatherNeedle;
00615 }
00616 
00617 void QcNeedleItem::draw(QPainter *painter)
00618 {
00619     resetRect();
00620     QRectF tmpRect = adjustRect(position());
00621     painter->save();
00622     painter->translate(tmpRect.center());
00623     float deg = getDegFromValue( mCurrentValue);
00624     painter->rotate(deg+90.0);
00625     painter->setBrush(QBrush(mColor));
00626     painter->setPen(Qt::NoPen);
00627 
00628     QLinearGradient grad;
00629 
00630     switch (mNeedleType) {
00631     case QcNeedleItem::FeatherNeedle:
00632         createFeatherNeedle(getRadius(tmpRect));
00633         break;
00634     case QcNeedleItem::DiamonNeedle:
00635         createDiamonNeedle(getRadius(tmpRect));
00636         break;
00637     case QcNeedleItem::TriangleNeedle:
00638         createTriangleNeedle(getRadius(tmpRect));
00639         break;
00640     case QcNeedleItem::AttitudeMeterNeedle:
00641         createAttitudeNeedle(getRadius(tmpRect));
00642         break;
00643     case QcNeedleItem::CompassNeedle:
00644         createCompassNeedle(getRadius(tmpRect));
00645         grad.setStart(mNeedlePoly[0]);
00646         grad.setFinalStop(mNeedlePoly[1]);
00647         grad.setColorAt(0.9,Qt::red);
00648         grad.setColorAt(1,Qt::blue);
00649         painter->setBrush(grad);
00650 
00651         break;
00652 
00653     default:
00654         break;
00655     }
00656     painter->drawConvexPolygon(mNeedlePoly);
00657     painter->restore();
00658 }
00659 
00660 void QcNeedleItem::setCurrentValue(float value)
00661 {
00662        if(value<mMinValue)
00663         mCurrentValue = mMinValue;
00664     else if(value>mMaxValue)
00665         mCurrentValue = mMaxValue;
00666     else
00667         mCurrentValue = value;
00668 
00669     if(mLabel!=0)
00670         mLabel->setText(QString::number(mCurrentValue),false);
00671 
00673 
00674 
00675 
00676 
00677 
00678 
00679     update();
00680 }
00681 
00682 float QcNeedleItem::currentValue()
00683 {
00684     return mCurrentValue;
00685 }
00686 
00687 void QcNeedleItem::setValueFormat(QString format){
00688     mFormat = format;
00689     update();
00690 }
00691 
00692 QString QcNeedleItem::currentValueFormat(){
00693     return mFormat;
00694 }
00695 
00696 void QcNeedleItem::setColor(const QColor &color)
00697 {
00698     mColor = color;
00699     update();
00700 }
00701 
00702 QColor QcNeedleItem::color()
00703 {
00704     return mColor;
00705 }
00706 
00707 void QcNeedleItem::setLabel(QcLabelItem *label)
00708 {
00709     mLabel = label;
00710     update();
00711 }
00712 
00713 QcLabelItem *QcNeedleItem::label()
00714 {
00715     return mLabel;
00716 }
00717 
00718 
00719 void QcNeedleItem::setNeedle(QcNeedleItem::NeedleType needleType)
00720 {
00721     mNeedleType = needleType;
00722     update();
00723 }
00724 
00725 
00726 void QcNeedleItem::createDiamonNeedle(float r)
00727 {
00728     QVector<QPointF> tmpPoints;
00729     tmpPoints.append(QPointF(0.0, 0.0));
00730     tmpPoints.append(QPointF(-r/20.0,r/20.0));
00731     tmpPoints.append(QPointF(0.0, r));
00732     tmpPoints.append(QPointF(r/20.0,r/20.0));
00733     mNeedlePoly = tmpPoints;
00734 }
00735 
00736 void QcNeedleItem::createTriangleNeedle(float r)
00737 {
00738     QVector<QPointF> tmpPoints;
00739     tmpPoints.append(QPointF(0.0, r));
00740     tmpPoints.append(QPointF(-r/40.0, 0.0));
00741     tmpPoints.append(QPointF(r/40.0,0.0));
00742     mNeedlePoly = tmpPoints;
00743 }
00744 
00745 void QcNeedleItem::createFeatherNeedle(float r)
00746 {
00747     QVector<QPointF> tmpPoints;
00748     tmpPoints.append(QPointF(0.0, r));
00749     tmpPoints.append(QPointF(-r/40.0, 0.0));
00750     tmpPoints.append(QPointF(-r/15.0, -r/5.0));
00751     tmpPoints.append(QPointF(r/15.0,-r/5));
00752     tmpPoints.append(QPointF(r/40.0,0.0));
00753     mNeedlePoly = tmpPoints;
00754 }
00755 
00756 void QcNeedleItem::createAttitudeNeedle(float r)
00757 {
00758     QVector<QPointF> tmpPoints;
00759     tmpPoints.append(QPointF(0.0, r));
00760     tmpPoints.append(QPointF(-r/20.0, 0.85*r));
00761     tmpPoints.append(QPointF(r/20.0,0.85*r));
00762     mNeedlePoly = tmpPoints;
00763 }
00764 
00765 void QcNeedleItem::createCompassNeedle(float r)
00766 {
00767     QVector<QPointF> tmpPoints;
00768     tmpPoints.append(QPointF(0.0, r));
00769     tmpPoints.append(QPointF(-r/15.0, 0.0));
00770     tmpPoints.append(QPointF(0.0, -r));
00771     tmpPoints.append(QPointF(r/15.0,0.0));
00772     mNeedlePoly = tmpPoints;
00773 }
00774 
00778 
00779 QcValuesItem::QcValuesItem(QObject *parent) :
00780     QcScaleItem(parent)
00781 {
00782     setPosition(70);
00783     mColor = Qt::black;
00784     mStep = 10;
00785 }
00786 
00787 
00788 void QcValuesItem::draw(QPainter*painter)
00789 {
00790     QRectF  tmpRect = resetRect();
00791     float r = getRadius(adjustRect(99));
00792     QFont font("Meiryo UI",0, QFont::Bold);
00793     font.setPointSizeF(0.08*r);
00794 
00795     painter->setFont(font);
00796     painter->setPen(mColor);
00797     for(float val = mMinValue;val<=mMaxValue;val+=mStep){
00798         float deg = getDegFromValue(val);
00799         QPointF pt = getPoint(deg,tmpRect);
00800         QPainterPath path;
00801         path.moveTo(pt);
00802         path.lineTo(    tmpRect.center());
00803         QString strVal = QString::number(val);
00804         QFontMetrics fMetrics = painter->fontMetrics();
00805         QSize sz = fMetrics.size( Qt::TextSingleLine, strVal );
00806         QRectF txtRect(QPointF(0,0), sz );
00807         QPointF textCenter = path.pointAtPercent(1.0-position()/100.0);
00808         txtRect.moveCenter(textCenter);
00809 
00810         painter->drawText( txtRect, Qt::TextSingleLine, strVal );
00811     }
00812 }
00813 
00814 void QcValuesItem::setStep(float step)
00815 {
00816     mStep = step;
00817 }
00818 
00819 
00820 void QcValuesItem::setColor(const QColor& color)
00821 {
00822     mColor = color;
00823 }
00824 
00828 
00829 QcAttitudeMeter::QcAttitudeMeter(QObject *parent) :
00830     QcItem(parent)
00831 {
00832     mPitch = 0;
00833     mRoll = 0;
00834 }
00835 
00836 void QcAttitudeMeter::setCurrentPitch(float pitch)
00837 {
00838     mPitch=-pitch;
00839     update();
00840 }
00841 
00842 void QcAttitudeMeter::setCurrentRoll(float roll)
00843 {
00844     mRoll = roll;
00845     update();
00846 }
00847 
00848 QPointF QcAttitudeMeter::getIntersection(float r, const QPointF &pitchPoint, const QPointF &pt)
00849 {
00850     
00851 
00852     Q_UNUSED(r)
00853     float a = (pitchPoint.y()-pt.y())/(pitchPoint.x()-pt.x());
00854     float b = pt.y()-a*pt.x();
00855     return QPointF(0,a*0+b);
00856 }
00857 
00858 float QcAttitudeMeter::getStartAngle(const QRectF& tmpRect)
00859 {
00860     float r = getRadius(tmpRect);
00861     QPointF pt1 = getPoint(mRoll,tmpRect);
00862     pt1.setY(pt1.y()-mPitchOffset);
00863     QPointF pitchPoint = QPointF(tmpRect.center().x(),tmpRect.center().y()-mPitchOffset);
00864 
00865 
00867     QPainterPath path1;
00868     path1.moveTo(pitchPoint);
00869     path1.lineTo(getIntersection(r,pitchPoint,pt1)+QPointF(0,5));
00870     path1.lineTo(getIntersection(r,pitchPoint,pt1)+QPointF(0,-5));
00871 
00872     QPainterPath path2;
00873     path2.addEllipse(tmpRect);
00874 
00875     QPointF p = path1.intersected(path2).pointAtPercent(.5);
00876     return getAngle(p,tmpRect);
00877 }
00878 
00879 void QcAttitudeMeter::draw(QPainter *painter)
00880 {
00881     resetRect();
00882     QRectF tmpRect = adjustRect(position());
00883     float r = getRadius(tmpRect);
00884     if(mPitch<0)
00885         mPitchOffset = 0.0135*r*mPitch;
00886     else
00887         mPitchOffset = 0.015*r*mPitch;
00888 
00889     painter->setPen(Qt::NoPen);
00890     drawUpperEllipse(painter,tmpRect);
00891     drawLowerEllipse(painter,tmpRect);
00892 
00893     
00894 
00895     drawPitchSteps(painter,tmpRect);
00896     drawHandle(painter);
00897 
00898     drawDegrees(painter);
00899 
00900 }
00901 
00902 void QcAttitudeMeter::drawDegrees(QPainter *painter)
00903 {
00904     resetRect();
00905     QRectF tmpRect = adjustRect(position());
00906     float r = getRadius(tmpRect);
00907     QPen pen;
00908 
00909     pen.setColor(Qt::white);
00910     painter->setPen(pen);
00911     for(int deg = 60;deg<=120;deg+=10){
00912         if(deg == 90)
00913             continue;
00914         drawDegree(painter,tmpRect,deg);
00915     }
00916 
00917     pen.setWidthF(r/30.0);
00918     painter->setPen(pen);
00919     drawDegree(painter,tmpRect,0);
00920     drawDegree(painter,tmpRect,90);
00921     drawDegree(painter,tmpRect,180);
00922     drawDegree(painter,tmpRect,30);
00923     drawDegree(painter,tmpRect,150);
00924 }
00925 
00926 
00927 void QcAttitudeMeter::drawDegree(QPainter * painter, const QRectF& tmpRect,float deg)
00928 {
00929     QPointF pt1 = getPoint(deg,tmpRect);
00930     QPointF pt2 = tmpRect.center();
00931     QPainterPath path;
00932     path.moveTo(pt1);
00933     path.lineTo(pt2);
00934     QPointF pt = path.pointAtPercent(0.1);
00935     painter->drawLine(pt1,pt);
00936 }
00937 
00938 
00939 void QcAttitudeMeter::drawUpperEllipse(QPainter *painter, const QRectF &tmpRect)
00940 {
00941 
00942     QLinearGradient radialGrad1(tmpRect.topLeft(),tmpRect.bottomRight());
00943     QColor clr1 = Qt::blue;
00944     clr1.setAlphaF(0.5);
00945     QColor clr2 = Qt::darkBlue;
00946     clr2.setAlphaF(0.5);
00947     radialGrad1.setColorAt(0, clr1);
00948     radialGrad1.setColorAt(.8, clr2);
00949 
00950 
00951     float offset = getStartAngle(tmpRect);
00952     float startAngle = 180-offset;
00953     float endAngle = offset-2*mRoll;
00954     float span =endAngle-startAngle;
00955 
00956     painter->setBrush(radialGrad1);
00957     painter->drawChord(tmpRect,16*startAngle,16*span);
00958 
00959 }
00960 
00961 
00962 void QcAttitudeMeter::drawLowerEllipse(QPainter *painter, const QRectF &tmpRect)
00963 {
00964     QLinearGradient radialGrad2(tmpRect.topLeft(),tmpRect.bottomRight());
00965     QColor clr1 = QColor(139,119,118);
00966     QColor clr2 = QColor(139,119,101);
00967     radialGrad2.setColorAt(0, clr1);
00968     radialGrad2.setColorAt(.8, clr2);
00969 
00970     float offset = getStartAngle(tmpRect);
00971     float startAngle = 180+offset;
00972     float endAngle = offset-2*mRoll;
00973     float span =endAngle+startAngle;
00974 
00975     painter->setPen(Qt::NoPen);
00976     painter->setBrush(radialGrad2);
00977     painter->drawChord(tmpRect,-16*startAngle,16*span);
00978 
00979 }
00980 
00981 void QcAttitudeMeter::drawPitchSteps(QPainter *painter, const QRectF &tmpRect)
00982 {
00983     float r = getRadius(tmpRect);
00984     QPointF center = tmpRect.center();
00985     painter->save();
00986     painter->translate(center.x(),center.y()-mPitchOffset);
00987     painter->rotate(mRoll);
00988     QPen pen;
00989     pen.setColor(Qt::white);
00990     pen.setWidthF(r/40.0);
00991 
00992     painter->setPen(pen);
00993     for (int i = -30;i<=30;i+=10){
00994         QPointF pt1;
00995         pt1.setX(-0.01*r*abs(i));
00996         pt1.setY(r/70.0*i);
00997         QPointF pt2;
00998         pt2.setX(0.01*r*abs(i));
00999         pt2.setY(r/70.0*i);
01000         painter->drawLine(pt1,pt2);
01001 
01002         if(i==0)
01003             continue;
01004 
01005         
01006         QFont font("Meiryo UI",0, QFont::Bold);
01007         font.setPointSizeF(0.08*r);
01008         painter->setFont(font);
01009         QString strVal = QString::number(abs(i));
01010         QFontMetrics fMetrics = painter->fontMetrics();
01011         QSize sz = fMetrics.size( Qt::TextSingleLine, strVal );
01012         QRectF leftTxtRect(QPointF(0,0), sz );
01013         QRectF rightTxtRect(QPointF(0,0), sz );
01014         leftTxtRect.moveCenter(pt1-QPointF(0.1*r,0));
01015         rightTxtRect.moveCenter(pt2+QPointF(0.1*r,0));
01016         painter->drawText( leftTxtRect, Qt::TextSingleLine, strVal );
01017         painter->drawText( rightTxtRect, Qt::TextSingleLine, strVal );
01018     }
01019     painter->restore();
01020 }
01021 
01022 void QcAttitudeMeter::drawHandle(QPainter *painter)
01023 {
01024     QRectF tmpRct = adjustRect(15);
01025     float r = getRadius(tmpRct);
01026     QPen pen;
01027     pen.setColor(Qt::gray);
01028     pen.setWidthF(0.25*r);
01029     painter->setPen(pen);
01030     painter->drawArc(tmpRct,0,-16*180);
01031 
01032     QPointF center = tmpRct.center();
01033     QPointF leftPt1 = center;
01034     QPointF leftPt2 = center;
01035     QPointF rightPt1 = center;
01036     QPointF rightPt2 = center;
01037     leftPt1.setX(center.x()-2*r);
01038     leftPt2.setX(center.x()-r);
01039     rightPt1.setX(center.x()+2*r);
01040     rightPt2.setX(center.x()+r);
01041     painter->drawLine(leftPt1,leftPt2);
01042     painter->drawLine(rightPt1,rightPt2);
01043     painter->drawEllipse(adjustRect(2));
01044 
01045     
01046     QPointF pt1 = center;
01047     QPointF pt2 = center;
01048     
01049     pt1.setY(center.y()+r);
01050     pt2.setY(center.y()+4*r);
01051     pen.setColor(Qt::gray);
01052     painter->setPen(pen);
01053     painter->drawLine(pt1,pt2);
01054 
01055     
01056     painter->setPen(Qt::gray);
01057     painter->setBrush(Qt::gray);
01058     QPolygonF trapPoly;
01059     QPointF tmpPt = center;
01060     tmpPt.setX(center.x()-r);
01061     tmpPt.setY(center.y()+4*r);
01062     trapPoly.append(tmpPt);
01063     tmpRct = adjustRect(position());
01064     trapPoly.append(getPoint(290,tmpRct));
01065     trapPoly.append(getPoint(250,tmpRct));
01066     tmpPt = center;
01067     tmpPt.setX(center.x()+r);
01068     tmpPt.setY(center.y()+4*r);
01069     trapPoly.append(tmpPt);
01070     painter->drawPolygon(trapPoly);
01071     painter->drawChord(tmpRct,-16*70,-16*40);
01072 }
01073