summaryrefslogtreecommitdiff
path: root/noncore/multimedia/opieplayer2/audiowidget.cpp
Unidiff
Diffstat (limited to 'noncore/multimedia/opieplayer2/audiowidget.cpp') (more/less context) (show whitespace changes)
-rw-r--r--noncore/multimedia/opieplayer2/audiowidget.cpp341
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
16extern MediaPlayerState *mediaPlayerState;
17
18
19static const int xo = -2; // movable x offset
20static const int yo = 22; // movable y offset
21
22
23struct 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)
31MediaButton 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
44static const int numButtons = (sizeof(audioButtons)/sizeof(MediaButton));
45
46
47AudioWidget::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
96AudioWidget::~AudioWidget() {
97 mediaPlayerState->isStreaming = FALSE;
98 for ( int i = 0; i < 3; i++ ) {
99 delete pixmaps[i];
100 }
101}
102
103
104static bool audioSliderBeingMoved = FALSE;
105
106
107void AudioWidget::sliderPressed() {
108 audioSliderBeingMoved = TRUE;
109}
110
111
112void 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
122void AudioWidget::setPosition( long i ) {
123 // qDebug("set position %d",i);
124 updateSlider( i, mediaPlayerState->length() );
125}
126
127
128void AudioWidget::setLength( long max ) {
129 updateSlider( mediaPlayerState->position(), max );
130}
131
132
133void 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
157void 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
177void AudioWidget::setToggleButton( int i, bool down ) {
178 if ( down != audioButtons[i].isDown ) {
179 toggleButton( i );
180 }
181}
182
183
184void AudioWidget::toggleButton( int i ) {
185 audioButtons[i].isDown = !audioButtons[i].isDown;
186 QPainter p(this);
187 paintButton ( &p, i );
188}
189
190
191void 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
201void 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
209void 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
258void AudioWidget::mousePressEvent( QMouseEvent *event ) {
259 mouseMoveEvent( event );
260}
261
262
263void AudioWidget::mouseReleaseEvent( QMouseEvent *event ) {
264 mouseMoveEvent( event );
265}
266
267
268void AudioWidget::showEvent( QShowEvent* ) {
269 QMouseEvent event( QEvent::MouseMove, QPoint( 0, 0 ), 0, 0 );
270 mouseMoveEvent( &event );
271}
272
273
274void AudioWidget::closeEvent( QCloseEvent* ) {
275 mediaPlayerState->setList();
276}
277
278
279void AudioWidget::paintEvent( QPaintEvent * ) {
280 QPainter p( this );
281 for ( int i = 0; i < numButtons; i++ )
282 paintButton( &p, i );
283}
284
285void 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}