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_scldraw.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
00034 QwtCompass::QwtCompass(QWidget* parent, const char* name):
00035 QwtDial(parent, name),
00036 d_rose(0)
00037 {
00038 setScaleOptions(ScaleLabel);
00039
00040 setOrigin(270.0);
00041 setWrapping(TRUE);
00042
00043
00044 d_labelMap.insert(0.0, QString::fromLatin1("N"));
00045 d_labelMap.insert(45.0, QString::fromLatin1("NE"));
00046 d_labelMap.insert(90.0, QString::fromLatin1("E"));
00047 d_labelMap.insert(135.0, QString::fromLatin1("SE"));
00048 d_labelMap.insert(180.0, QString::fromLatin1("S"));
00049 d_labelMap.insert(225.0, QString::fromLatin1("SW"));
00050 d_labelMap.insert(270.0, QString::fromLatin1("W"));
00051 d_labelMap.insert(315.0, QString::fromLatin1("NW"));
00052
00053 #if 0
00054 d_labelMap.insert(22.5, QString::fromLatin1("NNE"));
00055 d_labelMap.insert(67.5, QString::fromLatin1("NEE"));
00056 d_labelMap.insert(112.5, QString::fromLatin1("SEE"));
00057 d_labelMap.insert(157.5, QString::fromLatin1("SSE"));
00058 d_labelMap.insert(202.5, QString::fromLatin1("SSW"));
00059 d_labelMap.insert(247.5, QString::fromLatin1("SWW"));
00060 d_labelMap.insert(292.5, QString::fromLatin1("NWW"));
00061 d_labelMap.insert(337.5, QString::fromLatin1("NNW"));
00062 #endif
00063 }
00064
00066 QwtCompass::~QwtCompass()
00067 {
00068 delete d_rose;
00069 }
00070
00072 void QwtCompass::drawScaleContents(QPainter *painter,
00073 const QPoint ¢er, int radius) const
00074 {
00075 QPalette::ColorGroup cg;
00076 if ( isEnabled() )
00077 cg = hasFocus() ? QPalette::Active : QPalette::Inactive;
00078 else
00079 cg = QPalette::Disabled;
00080
00081 double north = origin();
00082 if ( isValid() )
00083 {
00084 if ( mode() == RotateScale )
00085 north -= value();
00086 }
00087
00088 const int margin = 4;
00089 drawRose(painter, center, radius - margin, 360.0 - north, cg);
00090 }
00091
00101 void QwtCompass::drawRose(QPainter *painter, const QPoint ¢er,
00102 int radius, double north, QPalette::ColorGroup cg) const
00103 {
00104 if ( d_rose )
00105 d_rose->draw(painter, center, radius, north, cg);
00106 }
00107
00115 void QwtCompass::setRose(QwtCompassRose *rose)
00116 {
00117 if ( rose != d_rose )
00118 {
00119 if ( d_rose )
00120 delete d_rose;
00121
00122 d_rose = rose;
00123 update();
00124 }
00125 }
00126
00131 const QwtCompassRose *QwtCompass::rose() const
00132 {
00133 return d_rose;
00134 }
00135
00140 QwtCompassRose *QwtCompass::rose()
00141 {
00142 return d_rose;
00143 }
00144
00154 void QwtCompass::keyPressEvent(QKeyEvent *kev)
00155 {
00156 if (isReadOnly())
00157 return;
00158
00159 #if 0
00160 if ( kev->key() == Key_5 )
00161 {
00162 invalidate();
00163 return;
00164 }
00165 #endif
00166
00167 double newValue = value();
00168
00169 if ( kev->key() >= Qt::Key_1 && kev->key() <= Qt::Key_9 )
00170 {
00171 if ( mode() != RotateNeedle || kev->key() == Qt::Key_5 )
00172 return;
00173
00174 switch (kev->key())
00175 {
00176 case Qt::Key_6:
00177 newValue = 180.0 * 0.0;
00178 break;
00179 case Qt::Key_3:
00180 newValue = 180.0 * 0.25;
00181 break;
00182 case Qt::Key_2:
00183 newValue = 180.0 * 0.5;
00184 break;
00185 case Qt::Key_1:
00186 newValue = 180.0 * 0.75;
00187 break;
00188 case Qt::Key_4:
00189 newValue = 180.0 * 1.0;
00190 break;
00191 case Qt::Key_7:
00192 newValue = 180.0 * 1.25;
00193 break;
00194 case Qt::Key_8:
00195 newValue = 180.0 * 1.5;
00196 break;
00197 case Qt::Key_9:
00198 newValue = 180.0 * 1.75;
00199 break;
00200 }
00201 newValue -= origin();
00202 setValue(newValue);
00203 }
00204 else
00205 {
00206 QwtDial::keyPressEvent(kev);
00207 }
00208 }
00209
00214 const QMap<double, QString> &QwtCompass::labelMap() const
00215 {
00216 return d_labelMap;
00217 }
00218
00223 QMap<double, QString> &QwtCompass::labelMap()
00224 {
00225 return d_labelMap;
00226 }
00227
00240 void QwtCompass::setLabelMap(const QMap<double, QString> &map)
00241 {
00242 d_labelMap = map;
00243 }
00244
00255 QString QwtCompass::scaleLabel(double value) const
00256 {
00257 #if 0
00258
00259 if ( value == -0 )
00260 value = 0.0;
00261 #endif
00262
00263 if ( value < 0.0 )
00264 value += 360.0;
00265
00266 if ( d_labelMap.contains(value) )
00267 return d_labelMap[value];
00268
00269 return QString::null;
00270 }
00271
00272
00273
00274
00275
00276