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
00114 void QwtCompass::drawScaleContents(QPainter *painter,
00115 const QPoint ¢er, int radius) const
00116 {
00117 QPalette::ColorGroup cg;
00118 if ( isEnabled() )
00119 cg = hasFocus() ? QPalette::Active : QPalette::Inactive;
00120 else
00121 cg = QPalette::Disabled;
00122
00123 double north = origin();
00124 if ( isValid() )
00125 {
00126 if ( mode() == RotateScale )
00127 north -= value();
00128 }
00129
00130 const int margin = 4;
00131 drawRose(painter, center, radius - margin, 360.0 - north, cg);
00132 }
00133
00143 void QwtCompass::drawRose(QPainter *painter, const QPoint ¢er,
00144 int radius, double north, QPalette::ColorGroup cg) const
00145 {
00146 if ( d_data->rose )
00147 d_data->rose->draw(painter, center, radius, north, cg);
00148 }
00149
00157 void QwtCompass::setRose(QwtCompassRose *rose)
00158 {
00159 if ( rose != d_data->rose )
00160 {
00161 if ( d_data->rose )
00162 delete d_data->rose;
00163
00164 d_data->rose = rose;
00165 update();
00166 }
00167 }
00168
00173 const QwtCompassRose *QwtCompass::rose() const
00174 {
00175 return d_data->rose;
00176 }
00177
00182 QwtCompassRose *QwtCompass::rose()
00183 {
00184 return d_data->rose;
00185 }
00186
00196 void QwtCompass::keyPressEvent(QKeyEvent *kev)
00197 {
00198 if (isReadOnly())
00199 return;
00200
00201 #if 0
00202 if ( kev->key() == Key_5 )
00203 {
00204 invalidate();
00205 return;
00206 }
00207 #endif
00208
00209 double newValue = value();
00210
00211 if ( kev->key() >= Qt::Key_1 && kev->key() <= Qt::Key_9 )
00212 {
00213 if ( mode() != RotateNeedle || kev->key() == Qt::Key_5 )
00214 return;
00215
00216 switch (kev->key())
00217 {
00218 case Qt::Key_6:
00219 newValue = 180.0 * 0.0;
00220 break;
00221 case Qt::Key_3:
00222 newValue = 180.0 * 0.25;
00223 break;
00224 case Qt::Key_2:
00225 newValue = 180.0 * 0.5;
00226 break;
00227 case Qt::Key_1:
00228 newValue = 180.0 * 0.75;
00229 break;
00230 case Qt::Key_4:
00231 newValue = 180.0 * 1.0;
00232 break;
00233 case Qt::Key_7:
00234 newValue = 180.0 * 1.25;
00235 break;
00236 case Qt::Key_8:
00237 newValue = 180.0 * 1.5;
00238 break;
00239 case Qt::Key_9:
00240 newValue = 180.0 * 1.75;
00241 break;
00242 }
00243 newValue -= origin();
00244 setValue(newValue);
00245 }
00246 else
00247 {
00248 QwtDial::keyPressEvent(kev);
00249 }
00250 }
00251
00256 const QMap<double, QString> &QwtCompass::labelMap() const
00257 {
00258 return d_data->labelMap;
00259 }
00260
00265 QMap<double, QString> &QwtCompass::labelMap()
00266 {
00267 return d_data->labelMap;
00268 }
00269
00282 void QwtCompass::setLabelMap(const QMap<double, QString> &map)
00283 {
00284 d_data->labelMap = map;
00285 }
00286
00297 QwtText QwtCompass::scaleLabel(double value) const
00298 {
00299 #if 0
00300
00301 if ( value == -0 )
00302 value = 0.0;
00303 #endif
00304
00305 if ( value < 0.0 )
00306 value += 360.0;
00307
00308 if ( d_data->labelMap.contains(value) )
00309 return d_data->labelMap[value];
00310
00311 return QwtText();
00312 }