Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

# 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_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); // Only labels, no backbone, no ticks
    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 &center, 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 &center,
    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(); // signal ???
    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     // better solution ???
    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 // Local Variables:
    00273 // mode: C++
    00274 // c-file-style: "stroustrup"
    00275 // indent-tabs-mode: nil
    00276 // End: