Diffstat (limited to 'noncore/multimedia/opieplayer2/audiowidget.cpp') (more/less context) (show whitespace changes)
-rw-r--r-- | noncore/multimedia/opieplayer2/audiowidget.cpp | 341 |
1 files changed, 341 insertions, 0 deletions
diff --git a/noncore/multimedia/opieplayer2/audiowidget.cpp b/noncore/multimedia/opieplayer2/audiowidget.cpp new file mode 100644 index 0000000..8d3963a --- a/dev/null +++ b/noncore/multimedia/opieplayer2/audiowidget.cpp | |||
@@ -0,0 +1,341 @@ | |||
1 | |||
2 | #include <qpe/qpeapplication.h> | ||
3 | #include <qpe/resource.h> | ||
4 | #include <qpe/config.h> | ||
5 | |||
6 | #include <qwidget.h> | ||
7 | #include <qpixmap.h> | ||
8 | #include <qbutton.h> | ||
9 | #include <qpainter.h> | ||
10 | #include <qframe.h> | ||
11 | #include <qlayout.h> | ||
12 | |||
13 | #include "audiowidget.h" | ||
14 | #include "mediaplayerstate.h" | ||
15 | |||
16 | extern MediaPlayerState *mediaPlayerState; | ||
17 | |||
18 | |||
19 | static const int xo = -2; // movable x offset | ||
20 | static const int yo = 22; // movable y offset | ||
21 | |||
22 | |||
23 | struct MediaButton { | ||
24 | int xPos, yPos; | ||
25 | int color; | ||
26 | bool isToggle, isBig, isHeld, isDown; | ||
27 | }; | ||
28 | |||
29 | |||
30 | // Layout information for the audioButtons (and if it is a toggle button or not) | ||
31 | MediaButton audioButtons[] = { | ||
32 | { 3*30-15+xo, 3*30-13+yo, 0, TRUE, TRUE, FALSE, FALSE }, // play | ||
33 | { 1*30+xo, 5*30+yo, 2, FALSE, FALSE, FALSE, FALSE }, // stop | ||
34 | { 5*30+xo, 5*30+yo, 2, TRUE, FALSE, FALSE, FALSE }, // pause | ||
35 | { 6*30-5+xo, 3*30+yo, 1, FALSE, FALSE, FALSE, FALSE }, // next | ||
36 | { 0*30+5+xo, 3*30+yo, 1, FALSE, FALSE, FALSE, FALSE }, // previous | ||
37 | { 3*30+xo, 0*30+5+yo, 3, FALSE, FALSE, FALSE, FALSE }, // volume up | ||
38 | { 3*30+xo, 6*30-5+yo, 3, FALSE, FALSE, FALSE, FALSE }, // volume down | ||
39 | { 5*30+xo, 1*30+yo, 0, TRUE, FALSE, FALSE, FALSE }, // repeat/loop | ||
40 | { 1*30+xo, 1*30+yo, 0, FALSE, FALSE, FALSE, FALSE } // playlist | ||
41 | }; | ||
42 | |||
43 | |||
44 | static const int numButtons = (sizeof(audioButtons)/sizeof(MediaButton)); | ||
45 | |||
46 | |||
47 | AudioWidget::AudioWidget(QWidget* parent, const char* name, WFlags f) : | ||
48 | QWidget( parent, name, f ) | ||
49 | { | ||
50 | setCaption( tr("OpiePlayer - Audio") ); | ||
51 | Config cfg("OpiePlayer"); | ||
52 | cfg.setGroup("AudioWidget"); | ||
53 | |||
54 | QString backgroundPix, buttonsAllPix, buttonsBigPix, controlsPix, animatedPix; | ||
55 | backgroundPix=cfg.readEntry( " backgroundPix", "opieplayer/metalFinish"); | ||
56 | buttonsAllPix=cfg.readEntry( "buttonsAllPix","opieplayer/mediaButtonsAll"); | ||
57 | buttonsBigPix=cfg.readEntry( "buttonsBigPix","opieplayer/mediaButtonsBig"); | ||
58 | controlsPix=cfg.readEntry( "controlsPix","opieplayer/mediaControls"); | ||
59 | |||
60 | setBackgroundPixmap( Resource::loadPixmap( backgroundPix) ); | ||
61 | pixmaps[0] = new QPixmap( Resource::loadPixmap( buttonsAllPix ) ); | ||
62 | pixmaps[1] = new QPixmap( Resource::loadPixmap( buttonsBigPix ) ); | ||
63 | pixmaps[2] = new QPixmap( Resource::loadPixmap( controlsPix ) ); | ||
64 | |||
65 | songInfo = new Ticker( this ); | ||
66 | songInfo->setFocusPolicy( QWidget::NoFocus ); | ||
67 | songInfo->setGeometry( QRect( 7, 3, 220, 20 ) ); | ||
68 | |||
69 | slider = new QSlider( Qt::Horizontal, this ); | ||
70 | slider->setFixedWidth( 220 ); | ||
71 | slider->setFixedHeight( 20 ); | ||
72 | slider->setMinValue( 0 ); | ||
73 | slider->setMaxValue( 1 ); | ||
74 | slider->setBackgroundPixmap( Resource::loadPixmap( backgroundPix ) ); | ||
75 | slider->setFocusPolicy( QWidget::NoFocus ); | ||
76 | slider->setGeometry( QRect( 7, 262, 220, 20 ) ); | ||
77 | |||
78 | connect( slider, SIGNAL( sliderPressed() ), this, SLOT( sliderPressed() ) ); | ||
79 | connect( slider, SIGNAL( sliderReleased() ), this, SLOT( sliderReleased() ) ); | ||
80 | connect( mediaPlayerState, SIGNAL( lengthChanged(long) ), this, SLOT( setLength(long) ) ); | ||
81 | connect( mediaPlayerState, SIGNAL( viewChanged(char) ), this, SLOT( setView(char) ) ); | ||
82 | connect( mediaPlayerState, SIGNAL( loopingToggled(bool) ), this, SLOT( setLooping(bool) ) ); | ||
83 | connect( mediaPlayerState, SIGNAL( pausedToggled(bool) ), this, SLOT( setPaused(bool) ) ); | ||
84 | connect( mediaPlayerState, SIGNAL( playingToggled(bool) ), this, SLOT( setPlaying(bool) ) ); | ||
85 | |||
86 | // Intialise state | ||
87 | setLength( mediaPlayerState->length() ); | ||
88 | setPosition( mediaPlayerState->position() ); | ||
89 | setLooping( mediaPlayerState->fullscreen() ); | ||
90 | setPaused( mediaPlayerState->paused() ); | ||
91 | setPlaying( mediaPlayerState->playing() ); | ||
92 | |||
93 | } | ||
94 | |||
95 | |||
96 | AudioWidget::~AudioWidget() { | ||
97 | mediaPlayerState->isStreaming = FALSE; | ||
98 | for ( int i = 0; i < 3; i++ ) { | ||
99 | delete pixmaps[i]; | ||
100 | } | ||
101 | } | ||
102 | |||
103 | |||
104 | static bool audioSliderBeingMoved = FALSE; | ||
105 | |||
106 | |||
107 | void AudioWidget::sliderPressed() { | ||
108 | audioSliderBeingMoved = TRUE; | ||
109 | } | ||
110 | |||
111 | |||
112 | void AudioWidget::sliderReleased() { | ||
113 | audioSliderBeingMoved = FALSE; | ||
114 | if ( slider->width() == 0 ) { | ||
115 | return; | ||
116 | } | ||
117 | long val = long((double)slider->value() * mediaPlayerState->length() / slider->width()); | ||
118 | mediaPlayerState->setPosition( val ); | ||
119 | } | ||
120 | |||
121 | |||
122 | void AudioWidget::setPosition( long i ) { | ||
123 | // qDebug("set position %d",i); | ||
124 | updateSlider( i, mediaPlayerState->length() ); | ||
125 | } | ||
126 | |||
127 | |||
128 | void AudioWidget::setLength( long max ) { | ||
129 | updateSlider( mediaPlayerState->position(), max ); | ||
130 | } | ||
131 | |||
132 | |||
133 | void AudioWidget::setView( char view ) { | ||
134 | if (mediaPlayerState->isStreaming) { | ||
135 | if( !slider->isHidden()) slider->hide(); | ||
136 | disconnect( mediaPlayerState, SIGNAL( positionChanged(long) ),this, SLOT( setPosition(long) ) ); | ||
137 | disconnect( mediaPlayerState, SIGNAL( positionUpdated(long) ),this, SLOT( setPosition(long) ) ); | ||
138 | } else { | ||
139 | // this stops the slider from being moved, thus | ||
140 | // does not stop stream when it reaches the end | ||
141 | slider->show(); | ||
142 | connect( mediaPlayerState, SIGNAL( positionChanged(long) ),this, SLOT( setPosition(long) ) ); | ||
143 | connect( mediaPlayerState, SIGNAL( positionUpdated(long) ),this, SLOT( setPosition(long) ) ); | ||
144 | } | ||
145 | |||
146 | if ( view == 'a' ) { | ||
147 | startTimer( 150 ); | ||
148 | // show(); | ||
149 | showMaximized(); | ||
150 | } else { | ||
151 | killTimers(); | ||
152 | hide(); | ||
153 | } | ||
154 | } | ||
155 | |||
156 | |||
157 | void AudioWidget::updateSlider( long i, long max ) { | ||
158 | if ( max == 0 ) { | ||
159 | return; | ||
160 | } | ||
161 | // Will flicker too much if we don't do this | ||
162 | // Scale to something reasonable | ||
163 | int width = slider->width(); | ||
164 | int val = int((double)i * width / max); | ||
165 | if ( !audioSliderBeingMoved ) { | ||
166 | if ( slider->value() != val ) { | ||
167 | slider->setValue( val ); | ||
168 | } | ||
169 | |||
170 | if ( slider->maxValue() != width ) { | ||
171 | slider->setMaxValue( width ); | ||
172 | } | ||
173 | } | ||
174 | } | ||
175 | |||
176 | |||
177 | void AudioWidget::setToggleButton( int i, bool down ) { | ||
178 | if ( down != audioButtons[i].isDown ) { | ||
179 | toggleButton( i ); | ||
180 | } | ||
181 | } | ||
182 | |||
183 | |||
184 | void AudioWidget::toggleButton( int i ) { | ||
185 | audioButtons[i].isDown = !audioButtons[i].isDown; | ||
186 | QPainter p(this); | ||
187 | paintButton ( &p, i ); | ||
188 | } | ||
189 | |||
190 | |||
191 | void AudioWidget::paintButton( QPainter *p, int i ) { | ||
192 | int x = audioButtons[i].xPos; | ||
193 | int y = audioButtons[i].yPos; | ||
194 | int offset = 22 + 14 * audioButtons[i].isBig + audioButtons[i].isDown; | ||
195 | int buttonSize = 64 + audioButtons[i].isBig * (90 - 64); | ||
196 | p->drawPixmap( x, y, *pixmaps[audioButtons[i].isBig], buttonSize * (audioButtons[i].isDown + 2 * audioButtons[i].color), 0, buttonSize, buttonSize ); | ||
197 | p->drawPixmap( x + offset, y + offset, *pixmaps[2], 18 * i, 0, 18, 18 ); | ||
198 | } | ||
199 | |||
200 | |||
201 | void AudioWidget::timerEvent( QTimerEvent * ) { | ||
202 | static int frame = 0; | ||
203 | if ( !mediaPlayerState->paused() && audioButtons[ AudioPlay ].isDown ) { | ||
204 | frame = frame >= 7 ? 0 : frame + 1; | ||
205 | } | ||
206 | } | ||
207 | |||
208 | |||
209 | void AudioWidget::mouseMoveEvent( QMouseEvent *event ) { | ||
210 | for ( int i = 0; i < numButtons; i++ ) { | ||
211 | int size = audioButtons[i].isBig; | ||
212 | int x = audioButtons[i].xPos; | ||
213 | int y = audioButtons[i].yPos; | ||
214 | if ( event->state() == QMouseEvent::LeftButton ) { | ||
215 | // The test to see if the mouse click is inside the circular button or not | ||
216 | // (compared with the radius squared to avoid a square-root of our distance) | ||
217 | int radius = 32 + 13 * size; | ||
218 | QPoint center = QPoint( x + radius, y + radius ); | ||
219 | QPoint dXY = center - event->pos(); | ||
220 | int dist = dXY.x() * dXY.x() + dXY.y() * dXY.y(); | ||
221 | bool isOnButton = dist <= (radius * radius); | ||
222 | if ( isOnButton && !audioButtons[i].isHeld ) { | ||
223 | audioButtons[i].isHeld = TRUE; | ||
224 | toggleButton(i); | ||
225 | qDebug("button toggled1 %d",i); | ||
226 | switch (i) { | ||
227 | case AudioVolumeUp: emit moreClicked(); return; | ||
228 | case AudioVolumeDown: emit lessClicked(); return; | ||
229 | } | ||
230 | } else if ( !isOnButton && audioButtons[i].isHeld ) { | ||
231 | audioButtons[i].isHeld = FALSE; | ||
232 | toggleButton(i); | ||
233 | qDebug("button toggled2 %d",i); | ||
234 | } | ||
235 | } else { | ||
236 | if ( audioButtons[i].isHeld ) { | ||
237 | audioButtons[i].isHeld = FALSE; | ||
238 | if ( !audioButtons[i].isToggle ) | ||
239 | setToggleButton( i, FALSE ); | ||
240 | qDebug("button toggled3 %d",i); | ||
241 | switch (i) { | ||
242 | case AudioPlay: mediaPlayerState->setPlaying(audioButtons[i].isDown); return; | ||
243 | case AudioStop: mediaPlayerState->setPlaying(FALSE); return; | ||
244 | case AudioPause: mediaPlayerState->setPaused(audioButtons[i].isDown); return; | ||
245 | case AudioNext: mediaPlayerState->setNext(); return; | ||
246 | case AudioPrevious: mediaPlayerState->setPrev(); return; | ||
247 | case AudioLoop: mediaPlayerState->setLooping(audioButtons[i].isDown); return; | ||
248 | case AudioVolumeUp: emit moreReleased(); return; | ||
249 | case AudioVolumeDown: emit lessReleased(); return; | ||
250 | case AudioPlayList: mediaPlayerState->setList(); return; | ||
251 | } | ||
252 | } | ||
253 | } | ||
254 | } | ||
255 | } | ||
256 | |||
257 | |||
258 | void AudioWidget::mousePressEvent( QMouseEvent *event ) { | ||
259 | mouseMoveEvent( event ); | ||
260 | } | ||
261 | |||
262 | |||
263 | void AudioWidget::mouseReleaseEvent( QMouseEvent *event ) { | ||
264 | mouseMoveEvent( event ); | ||
265 | } | ||
266 | |||
267 | |||
268 | void AudioWidget::showEvent( QShowEvent* ) { | ||
269 | QMouseEvent event( QEvent::MouseMove, QPoint( 0, 0 ), 0, 0 ); | ||
270 | mouseMoveEvent( &event ); | ||
271 | } | ||
272 | |||
273 | |||
274 | void AudioWidget::closeEvent( QCloseEvent* ) { | ||
275 | mediaPlayerState->setList(); | ||
276 | } | ||
277 | |||
278 | |||
279 | void AudioWidget::paintEvent( QPaintEvent * ) { | ||
280 | QPainter p( this ); | ||
281 | for ( int i = 0; i < numButtons; i++ ) | ||
282 | paintButton( &p, i ); | ||
283 | } | ||
284 | |||
285 | void AudioWidget::keyReleaseEvent( QKeyEvent *e) | ||
286 | { | ||
287 | switch ( e->key() ) { | ||
288 | ////////////////////////////// Zaurus keys | ||
289 | case Key_Home: | ||
290 | break; | ||
291 | case Key_F9: //activity | ||
292 | hide(); | ||
293 | // qDebug("Audio F9"); | ||
294 | break; | ||
295 | case Key_F10: //contacts | ||
296 | break; | ||
297 | case Key_F11: //menu | ||
298 | break; | ||
299 | case Key_F12: //home | ||
300 | break; | ||
301 | case Key_F13: //mail | ||
302 | break; | ||
303 | case Key_Space: { | ||
304 | if(mediaPlayerState->playing()) { | ||
305 | // toggleButton(1); | ||
306 | mediaPlayerState->setPlaying(FALSE); | ||
307 | // toggleButton(1); | ||
308 | } else { | ||
309 | // toggleButton(0); | ||
310 | mediaPlayerState->setPlaying(TRUE); | ||
311 | // toggleButton(0); | ||
312 | } | ||
313 | } | ||
314 | break; | ||
315 | case Key_Down: | ||
316 | toggleButton(6); | ||
317 | emit lessClicked(); | ||
318 | emit lessReleased(); | ||
319 | toggleButton(6); | ||
320 | break; | ||
321 | case Key_Up: | ||
322 | toggleButton(5); | ||
323 | emit moreClicked(); | ||
324 | emit moreReleased(); | ||
325 | toggleButton(5); | ||
326 | break; | ||
327 | case Key_Right: | ||
328 | // toggleButton(3); | ||
329 | mediaPlayerState->setNext(); | ||
330 | // toggleButton(3); | ||
331 | break; | ||
332 | case Key_Left: | ||
333 | // toggleButton(4); | ||
334 | mediaPlayerState->setPrev(); | ||
335 | // toggleButton(4); | ||
336 | break; | ||
337 | case Key_Escape: | ||
338 | break; | ||
339 | |||
340 | }; | ||
341 | } | ||