1 #include <qlayout.h>
2 #include <qwt_compass.h>
3 #include <qwt_compass_rose.h>
4 #include <qwt_dial_needle.h>
5 #include "compass_grid.h"
6 
7 #if QT_VERSION < 0x040000
8 typedef QColorGroup Palette;
9 #else
10 typedef QPalette Palette;
11 #endif
12 
CompassGrid(QWidget * parent)13 CompassGrid::CompassGrid(QWidget *parent):
14     QFrame(parent)
15 {
16 #if QT_VERSION < 0x040000
17     setBackgroundColor(Qt::gray);
18 #else
19     QPalette p = palette();
20     p.setColor(backgroundRole(), Qt::gray);
21     setPalette(p);
22 #endif
23 
24 #if QT_VERSION >= 0x040100
25     setAutoFillBackground(true);
26 #endif
27 
28     QGridLayout *layout = new QGridLayout(this);
29     layout->setSpacing(5);
30     layout->setMargin(0);
31 
32     int i;
33     for ( i = 0; i < 6; i++ )
34     {
35         QwtCompass *compass = createCompass(i);
36         layout->addWidget(compass, i / 3, i % 3);
37     }
38 
39 #if QT_VERSION < 0x040000
40     for ( i = 0; i < layout->numCols(); i++ )
41         layout->setColStretch(i, 1);
42 #else
43     for ( i = 0; i < layout->columnCount(); i++ )
44         layout->setColumnStretch(i, 1);
45 #endif
46 }
47 
createCompass(int pos)48 QwtCompass *CompassGrid::createCompass(int pos)
49 {
50     int c;
51 
52     Palette colorGroup;
53     for ( c = 0; c < Palette::NColorRoles; c++ )
54         colorGroup.setColor((Palette::ColorRole)c, QColor());
55 
56 #if QT_VERSION < 0x040000
57     colorGroup.setColor(Palette::Base, backgroundColor().light(120));
58 #else
59     colorGroup.setColor(Palette::Base,
60         palette().color(backgroundRole()).lighter(120));
61 #endif
62     colorGroup.setColor(Palette::WindowText,
63         colorGroup.color(Palette::Base));
64 
65     QwtCompass *compass = new QwtCompass(this);
66     compass->setLineWidth(4);
67     compass->setFrameShadow(
68         pos <= 2 ? QwtCompass::Sunken : QwtCompass::Raised);
69 
70     switch(pos)
71     {
72         case 0:
73         {
74             /*
75               A compass with a rose and no needle. Scale and rose are
76               rotating.
77              */
78             compass->setMode(QwtCompass::RotateScale);
79 
80             QwtSimpleCompassRose *rose = new QwtSimpleCompassRose(16, 2);
81             rose->setWidth(0.15);
82 
83             compass->setRose(rose);
84             break;
85         }
86         case 1:
87         {
88             /*
89               A windrose, with a scale indicating the main directions only
90              */
91             QMap<double, QString> map;
92             map.insert(0.0, "N");
93             map.insert(90.0, "E");
94             map.insert(180.0, "S");
95             map.insert(270.0, "W");
96 
97             compass->setLabelMap(map);
98 
99             QwtSimpleCompassRose *rose = new QwtSimpleCompassRose(4, 1);
100             compass->setRose(rose);
101 
102             compass->setNeedle(
103                 new QwtCompassWindArrow(QwtCompassWindArrow::Style2));
104             compass->setValue(60.0);
105             break;
106         }
107         case 2:
108         {
109             /*
110               A compass with a rotating needle in darkBlue. Shows
111               a ticks for each degree.
112              */
113 
114             colorGroup.setColor(Palette::Base, Qt::darkBlue);
115             colorGroup.setColor(Palette::WindowText,
116                 QColor(Qt::darkBlue).darker(120));
117             colorGroup.setColor(Palette::Text, Qt::white);
118 
119             compass->setScaleOptions(QwtDial::ScaleTicks | QwtDial::ScaleLabel);
120             compass->setScaleTicks(1, 1, 3);
121             compass->setScale(36, 5, 0);
122 
123             compass->setNeedle(
124                 new QwtCompassMagnetNeedle(QwtCompassMagnetNeedle::ThinStyle));
125             compass->setValue(220.0);
126 
127             break;
128         }
129         case 3:
130         {
131             /*
132               A compass without a frame, showing numbers as tick labels.
133               The origin is at 220.0
134              */
135 #if QT_VERSION < 0x040000
136             colorGroup.setColor(Palette::Base, backgroundColor());
137 #else
138             colorGroup.setColor(Palette::Base,
139                 palette().color(backgroundRole()));
140 #endif
141             colorGroup.setColor(Palette::WindowText, Qt::blue);
142 
143             compass->setLineWidth(0);
144 
145             compass->setScaleOptions(QwtDial::ScaleBackbone |
146                 QwtDial::ScaleTicks | QwtDial::ScaleLabel);
147             compass->setScaleTicks(0, 0, 3);
148 
149             QMap<double, QString> map;
150             for ( double d = 0.0; d < 360.0; d += 60.0 )
151             {
152                 QString label;
153                 label = QString::number(d, 'f', 0);
154                 map.insert(d, label);
155             }
156             compass->setLabelMap(map);
157             compass->setScale(36, 5, 0);
158 
159             compass->setNeedle(new QwtDialSimpleNeedle(QwtDialSimpleNeedle::Ray,
160                 false, Qt::white));
161             compass->setOrigin(220.0);
162             compass->setValue(20.0);
163             break;
164         }
165         case 4:
166         {
167             /*
168              A compass showing another needle
169              */
170             compass->setScaleOptions(QwtDial::ScaleTicks | QwtDial::ScaleLabel);
171             compass->setScaleTicks(0, 0, 3);
172 
173             compass->setNeedle(new QwtCompassMagnetNeedle(
174                 QwtCompassMagnetNeedle::TriangleStyle, Qt::white, Qt::red));
175             compass->setValue(220.0);
176             break;
177         }
178         case 5:
179         {
180             /*
181              A compass with a yellow on black ray
182              */
183             colorGroup.setColor(Palette::WindowText, Qt::black);
184 
185             compass->setNeedle(new QwtDialSimpleNeedle(QwtDialSimpleNeedle::Ray,
186                 false, Qt::yellow));
187             compass->setValue(315.0);
188             break;
189         }
190     }
191 
192     QPalette newPalette = compass->palette();
193     for ( c = 0; c < Palette::NColorRoles; c++ )
194     {
195         if ( colorGroup.color((Palette::ColorRole)c).isValid() )
196         {
197             for ( int cg = 0; cg < QPalette::NColorGroups; cg++ )
198             {
199                 newPalette.setColor(
200                     (QPalette::ColorGroup)cg,
201                     (Palette::ColorRole)c,
202                     colorGroup.color((Palette::ColorRole)c));
203             }
204         }
205     }
206 
207     for ( int i = 0; i < QPalette::NColorGroups; i++ )
208     {
209         QPalette::ColorGroup cg = (QPalette::ColorGroup)i;
210 
211         const QColor light =
212             newPalette.color(cg, Palette::Base).lighter(170);
213         const QColor dark = newPalette.color(cg, Palette::Base).darker(170);
214         const QColor mid = compass->frameShadow() == QwtDial::Raised
215             ? newPalette.color(cg, Palette::Base).darker(110)
216             : newPalette.color(cg, Palette::Base).lighter(110);
217 
218         newPalette.setColor(cg, Palette::Dark, dark);
219         newPalette.setColor(cg, Palette::Mid, mid);
220         newPalette.setColor(cg, Palette::Light, light);
221     }
222     compass->setPalette(newPalette);
223 
224     return compass;
225 }
226