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