summaryrefslogtreecommitdiff
path: root/core/applets/volumeapplet/oledbox.cpp
Unidiff
Diffstat (limited to 'core/applets/volumeapplet/oledbox.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--core/applets/volumeapplet/oledbox.cpp270
1 files changed, 270 insertions, 0 deletions
diff --git a/core/applets/volumeapplet/oledbox.cpp b/core/applets/volumeapplet/oledbox.cpp
new file mode 100644
index 0000000..3036929
--- a/dev/null
+++ b/core/applets/volumeapplet/oledbox.cpp
@@ -0,0 +1,270 @@
1
2#include <qpixmap.h>
3#include <qbitmap.h>
4#include <qpainter.h>
5
6#include "oledbox.h"
7
8
9#ifdef _QTE_IS_TOO_DUMB_TO_DRAW_AN_ARC
10
11/* XPM */
12static const char * ledborder_xpm[] = {
13"16 16 11 1",
14 " c None",
15 ".c #626562",
16 "+c #7B7D7B",
17 "@c #949594",
18 "#c #ACAEAC",
19 "$c #CDCACD",
20 "%c #CDCECD",
21 ";c #E6E6E6",
22 ">c #FFFFFF",
23 ",c #E6E2E6",
24 "'c #FFFAFF",
25" .++@@# ",
26" ...++@@##$ ",
27" .....+@##$$% ",
28" ..... #$%%% ",
29" ... %%; ",
30".... ;;;;",
31"++. ;>>",
32"+++ >>>",
33"@@@ >>>",
34"@@# >>>",
35"#### >>>>",
36" #$$ >>> ",
37" $$,,' >>>>> ",
38" ,,,''>>>>>>> ",
39" ,''>>>>>>> ",
40" '>>>>> "};
41
42
43QPixmap *OLedBox::s_border_pix = 0;
44
45#endif
46
47
48OLedBox::OLedBox ( const QColor &col, QWidget *parent, const char *name ) : QWidget ( parent, name )
49{
50 m_color = col;
51 m_on = false;
52
53 m_pix [ 0 ] = m_pix [ 1 ] = false;
54
55 setBackgroundMode ( PaletteBackground );
56
57#ifdef _QTE_IS_TOO_DUMB_TO_DRAW_AN_ARC
58 if ( !s_border_pix )
59 s_border_pix = new QPixmap ( ledborder_xpm );
60#endif
61}
62
63OLedBox::~OLedBox ( )
64{
65 delete m_pix [ 0 ];
66 delete m_pix [ 1 ];
67}
68
69QSize OLedBox::sizeHint ( ) const
70{
71 return QSize ( 16, 16 );
72}
73
74bool OLedBox::isOn ( ) const
75{
76 return m_on;
77}
78
79QColor OLedBox::color ( ) const
80{
81 return m_color;
82}
83
84void OLedBox::setOn ( bool b )
85{
86 if ( m_on != b ) {
87 m_on = b;
88 update ( );
89 }
90}
91
92void OLedBox::toggle ( )
93{
94 setOn ( !isOn ( ) );
95}
96
97void OLedBox::setColor ( const QColor &col )
98{
99 if ( m_color != col ) {
100 m_color = col;
101
102 delete m_pix [ 0 ];
103 delete m_pix [ 1 ];
104
105 update ( );
106 }
107}
108
109void OLedBox::mousePressEvent ( QMouseEvent *e )
110{
111 if ( e-> button ( ) == LeftButton ) {
112 m_on = !m_on;
113 update ( );
114 emit toggled ( m_on );
115 }
116}
117
118
119void OLedBox::resizeEvent ( QResizeEvent * )
120{
121 delete m_pix [ 0 ];
122 delete m_pix [ 1 ];
123
124 update ( );
125}
126
127void OLedBox::paintEvent ( QPaintEvent *e )
128{
129 int ind = m_on ? 1 : 0;
130
131 if ( !m_pix [ ind ] ) {
132 m_pix [ ind ] = new QPixmap ( size ( ));
133
134 drawLed ( m_pix [ ind ], m_on ? m_color : m_color. dark ( 300 ) );
135 }
136 if ( !e-> erased ( ))
137 erase ( );
138
139 QPainter p ( this );
140 p. drawPixmap ( 0, 0, *m_pix [ ind ] );
141}
142
143// From KDE libkdeui / led.cpp
144
145void OLedBox::drawLed ( QPixmap *pix, const QColor &col ) // paint a ROUND SUNKEN led lamp
146{
147 QPainter paint;
148 QColor color;
149 QBrush brush;
150 QPen pen;
151
152 // First of all we want to know what area should be updated
153 // Initialize coordinates, width, and height of the LED
154 int width = pix-> width ( );
155
156 // Make sure the LED is round!
157 if ( width > pix-> height ( ))
158 width = pix-> height ( );
159 width -= 2; // leave one pixel border
160 if ( width < 0 )
161 width = 0;
162
163 // maybe we could stop HERE, if width <=0 ?
164
165 // start painting widget
166 //
167 paint.begin( pix );
168
169 // Set the color of the LED according to given parameters
170 color = col;
171
172 // Set the brush to SolidPattern, this fills the entire area
173 // of the ellipse which is drawn first
174 brush.setStyle( QBrush::SolidPattern );
175 brush.setColor( color );
176 paint.setBrush( brush ); // Assign the brush to the painter
177
178 // Draws a "flat" LED with the given color:
179 paint.drawEllipse( 1, 1, width, width );
180
181 // Draw the bright light spot of the LED now, using modified "old"
182 // painter routine taken from KDEUIs KLed widget:
183
184 // Setting the new width of the pen is essential to avoid "pixelized"
185 // shadow like it can be observed with the old LED code
186 pen.setWidth( 2 );
187
188 // shrink the light on the LED to a size about 2/3 of the complete LED
189 int pos = width / 5 + 1;
190 int light_width = width;
191 light_width *= 2;
192 light_width /= 3;
193
194 // Calculate the LEDs "light factor":
195 int light_quote = ( 130 * 2 / ( light_width ? light_width : 1 ) ) + 100;
196
197 // Now draw the bright spot on the LED:
198 while ( light_width )
199 {
200 color = color.light( light_quote ); // make color lighter
201 pen.setColor( color ); // set color as pen color
202 paint.setPen( pen ); // select the pen for drawing
203 paint.drawEllipse( pos, pos, light_width, light_width ); // draw the ellipse (circle)
204 light_width--;
205 if ( !light_width )
206 break;
207 paint.drawEllipse( pos, pos, light_width, light_width );
208 light_width--;
209 if ( !light_width )
210 break;
211 paint.drawEllipse( pos, pos, light_width, light_width );
212 pos++;
213 light_width--;
214 }
215
216 // Drawing of bright spot finished, now draw a thin border
217 // around the LED which resembles a shadow with light coming
218 // from the upper left.
219
220#ifdef _QTE_IS_TOO_DUMB_TO_DRAW_AN_ARC
221 paint. drawPixmap ( 0, 0, *s_border_pix );
222
223#else
224 pen.setWidth( 3 );
225 brush.setStyle( QBrush::NoBrush ); // Switch off the brush
226 paint.setBrush( brush ); // This avoids filling of the ellipse
227
228 // Set the initial color value to 200 (bright) and start
229 // drawing the shadow border at 45 (45*16 = 720).
230 int shadow_color = 200, angle;
231
232 for ( angle = 720; angle < 6480; angle += 240 )
233 {
234 color.setRgb( shadow_color, shadow_color, shadow_color );
235 pen.setColor( color );
236 paint.setPen( pen );
237 paint.drawArc( 0, 0, width+2, width+2, angle, 240 );
238 paint.drawArc( 1, 1, width, width, angle, 240 );
239 paint.drawArc( 2, 2, width-2, width-2, angle, 240 );
240 if ( angle < 2320 ) {
241 shadow_color -= 25; // set color to a darker value
242 if ( shadow_color < 100 )
243 shadow_color = 100;
244 }
245 else if ( ( angle > 2320 ) && ( angle < 5760 ) ) {
246 shadow_color += 25; // set color to a brighter value
247 if ( shadow_color > 255 )
248 shadow_color = 255;
249 }
250 else {
251 shadow_color -= 25; // set color to a darker value again
252 if ( shadow_color < 100 )
253 shadow_color = 100;
254 } // end if ( angle < 2320 )
255 } // end for ( angle = 720; angle < 6480; angle += 160 )
256#endif
257 paint.end();
258 //
259 // painting done
260
261 QBitmap mask ( pix-> width ( ), pix-> height ( ), true );
262 QPainter mp ( &mask );
263 mp. setPen ( Qt::NoPen );
264 mp. setBrush ( Qt::color1 );
265 mp. drawEllipse ( 0, 0, width + 2, width + 2 );
266 mp. end ( );
267
268 pix-> setMask ( mask );
269}
270