qwt_compass.cpp

00001 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
00002  * Qwt Widget Library
00003  * Copyright (C) 1997   Josef Wilgen
00004  * Copyright (C) 2002   Uwe Rathmann
00005  *
00006  * This library is free software; you can redistribute it and/or
00007  * modify it under the terms of the Qwt License, Version 1.0
00008  *****************************************************************************/
00009 
00010 // vim: expandtab
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); // Only labels, no backbone, no ticks
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 &center, 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 &center,
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(); // signal ???
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     // better solution ???
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 }

Generated on Mon Feb 26 21:22:36 2007 for Qwt User's Guide by  doxygen 1.4.6