Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <math.h>
00013 #include <qpainter.h>
00014 #include <qpixmap.h>
00015 #include <qevent.h>
00016 #include "qwt_math.h"
00017 #include "qwt_scale_draw.h"
00018 #include "qwt_paint_buffer.h"
00019 #include "qwt_painter.h"
00020 #include "qwt_dial_needle.h"
00021 #include "qwt_compass_rose.h"
00022 #include "qwt_compass.h"
00023
00024 class QwtCompass::PrivateData
00025 {
00026 public:
00027 PrivateData():
00028 rose(NULL)
00029 {
00030 }
00031
00032 ~PrivateData()
00033 {
00034 delete rose;
00035 }
00036
00037 QwtCompassRose *rose;
00038 QMap<double, QString> labelMap;
00039 };
00040
00050 QwtCompass::QwtCompass(QWidget* parent):
00051 QwtDial(parent)
00052 {
00053 initCompass();
00054 }
00055
00056 #if QT_VERSION < 0x040000
00057
00068 QwtCompass::QwtCompass(QWidget* parent, const char *name):
00069 QwtDial(parent, name)
00070 {
00071 initCompass();
00072 }
00073
00074 #endif
00075
00077 QwtCompass::~QwtCompass()
00078 {
00079 delete d_data;
00080 }
00081
00082 void QwtCompass::initCompass()
00083 {
00084 d_data = new PrivateData;
00085
00086 setScaleOptions(ScaleLabel);
00087
00088 setOrigin(270.0);
00089 setWrapping(true);
00090
00091
00092 d_data->labelMap.insert(0.0, QString::fromLatin1("N"));
00093 d_data->labelMap.insert(45.0, QString::fromLatin1("NE"));
00094 d_data->labelMap.insert(90.0, QString::fromLatin1("E"));
00095 d_data->labelMap.insert(135.0, QString::fromLatin1("SE"));
00096 d_data->labelMap.insert(180.0, QString::fromLatin1("S"));
00097 d_data->labelMap.insert(225.0, QString::fromLatin1("SW"));
00098 d_data->labelMap.insert(270.0, QString::fromLatin1("W"));
00099 d_data->labelMap.insert(315.0, QString::fromLatin1("NW"));
00100
00101 #if 0
00102 d_data->labelMap.insert(22.5, QString::fromLatin1("NNE"));
00103 d_data->labelMap.insert(67.5, QString::fromLatin1("NEE"));
00104 d_data->labelMap.insert(112.5, QString::fromLatin1("SEE"));
00105 d_data->labelMap.insert(157.5, QString::fromLatin1("SSE"));
00106 d_data->labelMap.insert(202.5, QString::fromLatin1("SSW"));
00107 d_data->labelMap.insert(247.5, QString::fromLatin1("SWW"));
00108 d_data->labelMap.insert(292.5, QString::fromLatin1("NWW"));
00109 d_data->labelMap.insert(337.5, QString::fromLatin1("NNW"));
00110 #endif
00111 }
00112
00120 void QwtCompass::drawScaleContents(QPainter *painter,
00121 const QPoint ¢er, int radius) const
00122 {
00123 QPalette::ColorGroup cg;
00124 if ( isEnabled() )
00125 cg = hasFocus() ? QPalette::Active : QPalette::Inactive;
00126 else
00127 cg = QPalette::Disabled;
00128
00129 double north = origin();
00130 if ( isValid() )
00131 {
00132 if ( mode() == RotateScale )
00133 north -= value();
00134 }
00135
00136 const int margin = 4;
00137 drawRose(painter, center, radius - margin, 360.0 - north, cg);
00138 }
00139
00149 void QwtCompass::drawRose(QPainter *painter, const QPoint ¢er,
00150 int radius, double north, QPalette::ColorGroup cg) const
00151 {
00152 if ( d_data->rose )
00153 d_data->rose->draw(painter, center, radius, north, cg);
00154 }
00155
00163 void QwtCompass::setRose(QwtCompassRose *rose)
00164 {
00165 if ( rose != d_data->rose )
00166 {
00167 if ( d_data->rose )
00168 delete d_data->rose;
00169
00170 d_data->rose = rose;
00171 update();
00172 }
00173 }
00174
00179 const QwtCompassRose *QwtCompass::rose() const
00180 {
00181 return d_data->rose;
00182 }
00183
00188 QwtCompassRose *QwtCompass::rose()
00189 {
00190 return d_data->rose;
00191 }
00192
00202 void QwtCompass::keyPressEvent(QKeyEvent *kev)
00203 {
00204 if (isReadOnly())
00205 return;
00206
00207 #if 0
00208 if ( kev->key() == Key_5 )
00209 {
00210 invalidate();
00211 return;
00212 }
00213 #endif
00214
00215 double newValue = value();
00216
00217 if ( kev->key() >= Qt::Key_1 && kev->key() <= Qt::Key_9 )
00218 {
00219 if ( mode() != RotateNeedle || kev->key() == Qt::Key_5 )
00220 return;
00221
00222 switch (kev->key())
00223 {
00224 case Qt::Key_6:
00225 newValue = 180.0 * 0.0;
00226 break;
00227 case Qt::Key_3:
00228 newValue = 180.0 * 0.25;
00229 break;
00230 case Qt::Key_2:
00231 newValue = 180.0 * 0.5;
00232 break;
00233 case Qt::Key_1:
00234 newValue = 180.0 * 0.75;
00235 break;
00236 case Qt::Key_4:
00237 newValue = 180.0 * 1.0;
00238 break;
00239 case Qt::Key_7:
00240 newValue = 180.0 * 1.25;
00241 break;
00242 case Qt::Key_8:
00243 newValue = 180.0 * 1.5;
00244 break;
00245 case Qt::Key_9:
00246 newValue = 180.0 * 1.75;
00247 break;
00248 }
00249 newValue -= origin();
00250 setValue(newValue);
00251 }
00252 else
00253 {
00254 QwtDial::keyPressEvent(kev);
00255 }
00256 }
00257
00262 const QMap<double, QString> &QwtCompass::labelMap() const
00263 {
00264 return d_data->labelMap;
00265 }
00266
00271 QMap<double, QString> &QwtCompass::labelMap()
00272 {
00273 return d_data->labelMap;
00274 }
00275
00288 void QwtCompass::setLabelMap(const QMap<double, QString> &map)
00289 {
00290 d_data->labelMap = map;
00291 }
00292
00303 QwtText QwtCompass::scaleLabel(double value) const
00304 {
00305 #if 0
00306
00307 if ( value == -0 )
00308 value = 0.0;
00309 #endif
00310
00311 if ( value < 0.0 )
00312 value += 360.0;
00313
00314 if ( d_data->labelMap.contains(value) )
00315 return d_data->labelMap[value];
00316
00317 return QwtText();
00318 }