Mercurial > hg > svgui
comparison widgets/LEDButton.cpp @ 997:296ccd36f626 tony-2.0-integration
Merge through to branch for Tony 2.0
author | Chris Cannam |
---|---|
date | Thu, 20 Aug 2015 14:54:21 +0100 |
parents | e8949ccb4f4e |
children | 3f5c82034f9b |
comparison
equal
deleted
inserted
replaced
943:788b7623bfca | 997:296ccd36f626 |
---|---|
36 { | 36 { |
37 friend class LEDButton; | 37 friend class LEDButton; |
38 | 38 |
39 int dark_factor; | 39 int dark_factor; |
40 QColor offcolor; | 40 QColor offcolor; |
41 QPixmap *off_map; | |
42 QPixmap *on_map; | |
43 }; | 41 }; |
44 | 42 |
45 | 43 |
46 LEDButton::LEDButton(QWidget *parent) : | 44 LEDButton::LEDButton(QWidget *parent) : |
47 QWidget(parent), | 45 QWidget(parent), |
49 { | 47 { |
50 QColor col(Qt::green); | 48 QColor col(Qt::green); |
51 d = new LEDButton::LEDButtonPrivate; | 49 d = new LEDButton::LEDButtonPrivate; |
52 d->dark_factor = 300; | 50 d->dark_factor = 300; |
53 d->offcolor = col.dark(300); | 51 d->offcolor = col.dark(300); |
54 d->off_map = 0; | |
55 d->on_map = 0; | |
56 | 52 |
57 setColor(col); | 53 setColor(col); |
58 } | 54 } |
59 | 55 |
60 | 56 |
63 led_state(true) | 59 led_state(true) |
64 { | 60 { |
65 d = new LEDButton::LEDButtonPrivate; | 61 d = new LEDButton::LEDButtonPrivate; |
66 d->dark_factor = 300; | 62 d->dark_factor = 300; |
67 d->offcolor = col.dark(300); | 63 d->offcolor = col.dark(300); |
68 d->off_map = 0; | |
69 d->on_map = 0; | |
70 | 64 |
71 setColor(col); | 65 setColor(col); |
72 } | 66 } |
73 | 67 |
74 LEDButton::LEDButton(const QColor& col, bool state, QWidget *parent) : | 68 LEDButton::LEDButton(const QColor& col, bool state, QWidget *parent) : |
76 led_state(state) | 70 led_state(state) |
77 { | 71 { |
78 d = new LEDButton::LEDButtonPrivate; | 72 d = new LEDButton::LEDButtonPrivate; |
79 d->dark_factor = 300; | 73 d->dark_factor = 300; |
80 d->offcolor = col.dark(300); | 74 d->offcolor = col.dark(300); |
81 d->off_map = 0; | |
82 d->on_map = 0; | |
83 | 75 |
84 setColor(col); | 76 setColor(col); |
85 } | 77 } |
86 | 78 |
87 LEDButton::~LEDButton() | 79 LEDButton::~LEDButton() |
88 { | 80 { |
89 delete d->off_map; | |
90 delete d->on_map; | |
91 delete d; | 81 delete d; |
92 } | 82 } |
93 | 83 |
94 void | 84 void |
95 LEDButton::mousePressEvent(QMouseEvent *e) | 85 LEDButton::mousePressEvent(QMouseEvent *e) |
133 width = this->height(); | 123 width = this->height(); |
134 width -= 2; // leave one pixel border | 124 width -= 2; // leave one pixel border |
135 if (width < 0) | 125 if (width < 0) |
136 width = 0; | 126 width = 0; |
137 | 127 |
138 QPixmap *tmpMap = 0; | 128 paint.begin(this); |
139 | |
140 if (led_state) { | |
141 if (d->on_map) { | |
142 if (d->on_map->size() == size()) { | |
143 paint.begin(this); | |
144 paint.drawPixmap(0, 0, *d->on_map); | |
145 paint.end(); | |
146 return; | |
147 } else { | |
148 delete d->on_map; | |
149 d->on_map = 0; | |
150 } | |
151 } | |
152 } else { | |
153 if (d->off_map) { | |
154 if (d->off_map->size() == size()) { | |
155 paint.begin(this); | |
156 paint.drawPixmap(0, 0, *d->off_map); | |
157 paint.end(); | |
158 return; | |
159 } else { | |
160 delete d->off_map; | |
161 d->off_map = 0; | |
162 } | |
163 } | |
164 } | |
165 | |
166 int scale = 1; | |
167 width *= scale; | |
168 | |
169 tmpMap = new QPixmap(width, width); | |
170 tmpMap->fill(palette().background().color()); | |
171 paint.begin(tmpMap); | |
172 | 129 |
173 paint.setRenderHint(QPainter::Antialiasing, true); | 130 paint.setRenderHint(QPainter::Antialiasing, true); |
174 | 131 |
175 // Set the color of the LED according to given parameters | 132 // Set the color of the LED according to given parameters |
176 color = (led_state) ? led_color : d->offcolor; | 133 color = (led_state) ? led_color : d->offcolor; |
180 brush.setStyle(Qt::SolidPattern); | 137 brush.setStyle(Qt::SolidPattern); |
181 brush.setColor(color); | 138 brush.setColor(color); |
182 paint.setBrush(brush); | 139 paint.setBrush(brush); |
183 | 140 |
184 // Draws a "flat" LED with the given color: | 141 // Draws a "flat" LED with the given color: |
185 paint.drawEllipse( scale, scale, width - scale*2, width - scale*2 ); | 142 paint.drawEllipse( 1, 1, width - 2, width - 2 ); |
186 | 143 |
187 // Draw the bright light spot of the LED now, using modified "old" | 144 // Draw the bright light spot of the LED now, using modified "old" |
188 // painter routine taken from KDEUI´s LEDButton widget: | 145 // painter routine taken from KDEUI´s LEDButton widget: |
189 | 146 |
190 // Setting the new width of the pen is essential to avoid "pixelized" | 147 // Setting the new width of the pen is essential to avoid "pixelized" |
191 // shadow like it can be observed with the old LED code | 148 // shadow like it can be observed with the old LED code |
192 pen.setWidth( 2 * scale ); | 149 pen.setWidth( 2 ); |
193 | 150 |
194 // shrink the light on the LED to a size about 2/3 of the complete LED | 151 // shrink the light on the LED to a size about 2/3 of the complete LED |
195 int pos = width/5 + 1; | 152 int pos = width/5 + 1; |
196 int light_width = width; | 153 int light_width = width; |
197 light_width *= 2; | 154 light_width *= 2; |
215 break; | 172 break; |
216 paint.drawEllipse( pos, pos, light_width, light_width ); | 173 paint.drawEllipse( pos, pos, light_width, light_width ); |
217 pos++; light_width--; | 174 pos++; light_width--; |
218 } | 175 } |
219 | 176 |
177 paint.drawPoint(pos, pos); | |
178 | |
220 // Drawing of bright spot finished, now draw a thin border | 179 // Drawing of bright spot finished, now draw a thin border |
221 // around the LED which resembles a shadow with light coming | 180 // around the LED which resembles a shadow with light coming |
222 // from the upper left. | 181 // from the upper left. |
223 | 182 |
224 // pen.setWidth( 2 * scale + 1 ); // ### shouldn't this value be smaller for smaller LEDs? | 183 pen.setWidth(2); |
225 pen.setWidth(2 * scale); | |
226 brush.setStyle(Qt::NoBrush); | 184 brush.setStyle(Qt::NoBrush); |
227 paint.setBrush(brush); // This avoids filling of the ellipse | 185 paint.setBrush(brush); // This avoids filling of the ellipse |
228 | 186 |
229 // Set the initial color value to colorGroup().light() (bright) and start | 187 // Set the initial color value to colorGroup().light() (bright) and start |
230 // drawing the shadow border at 45° (45*16 = 720). | 188 // drawing the shadow border at 45° (45*16 = 720). |
233 color = palette().light().color(); | 191 color = palette().light().color(); |
234 | 192 |
235 for (int arc = 120; arc < 2880; arc += 240) { | 193 for (int arc = 120; arc < 2880; arc += 240) { |
236 pen.setColor(color); | 194 pen.setColor(color); |
237 paint.setPen(pen); | 195 paint.setPen(pen); |
238 int w = width - pen.width()/2 - scale + 1; | 196 int w = width - pen.width()/2; |
239 paint.drawArc(pen.width()/2 + 1, pen.width()/2 + 1, w - 2, w - 2, angle + arc, 240); | 197 paint.drawArc(pen.width()/2 + 1, pen.width()/2 + 1, w - 2, w - 2, angle + arc, 240); |
240 paint.drawArc(pen.width()/2 + 1, pen.width()/2 + 1, w - 2, w - 2, angle - arc, 240); | 198 paint.drawArc(pen.width()/2 + 1, pen.width()/2 + 1, w - 2, w - 2, angle - arc, 240); |
241 color = color.dark(110); //FIXME: this should somehow use the contrast value | 199 color = color.dark(110); //FIXME: this should somehow use the contrast value |
242 } // end for ( angle = 720; angle < 6480; angle += 160 ) | 200 } // end for ( angle = 720; angle < 6480; angle += 160 ) |
243 | 201 |
244 paint.end(); | 202 paint.end(); |
245 // | |
246 // painting done | |
247 | |
248 QPixmap *&dest = led_state ? d->on_map : d->off_map; | |
249 | |
250 if (scale > 1) { | |
251 | |
252 QImage i = tmpMap->toImage(); | |
253 width /= scale; | |
254 delete tmpMap; | |
255 dest = new QPixmap(QPixmap::fromImage | |
256 (i.scaled(width, width, | |
257 Qt::KeepAspectRatio, | |
258 Qt::SmoothTransformation))); | |
259 | |
260 } else { | |
261 | |
262 dest = tmpMap; | |
263 } | |
264 | |
265 paint.begin(this); | |
266 paint.drawPixmap(0, 0, *dest); | |
267 paint.end(); | |
268 } | 203 } |
269 | 204 |
270 bool | 205 bool |
271 LEDButton::state() const | 206 LEDButton::state() const |
272 { | 207 { |
301 LEDButton::setColor(const QColor& col) | 236 LEDButton::setColor(const QColor& col) |
302 { | 237 { |
303 if(led_color!=col) { | 238 if(led_color!=col) { |
304 led_color = col; | 239 led_color = col; |
305 d->offcolor = col.dark(d->dark_factor); | 240 d->offcolor = col.dark(d->dark_factor); |
306 delete d->on_map; | |
307 d->on_map = 0; | |
308 delete d->off_map; | |
309 d->off_map = 0; | |
310 update(); | 241 update(); |
311 } | 242 } |
312 } | 243 } |
313 | 244 |
314 void | 245 void |