summaryrefslogtreecommitdiff
path: root/core/multimedia/opieplayer/audiowidget.cpp
Unidiff
Diffstat (limited to 'core/multimedia/opieplayer/audiowidget.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--core/multimedia/opieplayer/audiowidget.cpp326
1 files changed, 225 insertions, 101 deletions
diff --git a/core/multimedia/opieplayer/audiowidget.cpp b/core/multimedia/opieplayer/audiowidget.cpp
index b96b1ef..896da91 100644
--- a/core/multimedia/opieplayer/audiowidget.cpp
+++ b/core/multimedia/opieplayer/audiowidget.cpp
@@ -33,2 +33,5 @@
33 33
34#include <stdlib.h>
35#include <stdio.h>
36
34extern MediaPlayerState *mediaPlayerState; 37extern MediaPlayerState *mediaPlayerState;
@@ -39,66 +42,104 @@ static const int yo = 22; // movable y offset
39 42
40
41struct MediaButton { 43struct MediaButton {
42 int xPos, yPos; 44 bool isToggle, isHeld, isDown;
43 int color;
44 bool isToggle, isBig, isHeld, isDown;
45}; 45};
46 46
47 47//Layout information for the audioButtons (and if it is a toggle button or not)
48// Layout information for the audioButtons (and if it is a toggle button or not)
49MediaButton audioButtons[] = { 48MediaButton audioButtons[] = {
50 { 3*30-15+xo, 3*30-13+yo, 0, TRUE, TRUE, FALSE, FALSE }, // play 49 { TRUE, FALSE, FALSE }, // play
51 { 1*30+xo, 5*30+yo, 2, FALSE, FALSE, FALSE, FALSE }, // stop 50 { FALSE, FALSE, FALSE }, // stop
52 { 5*30+xo, 5*30+yo, 2, TRUE, FALSE, FALSE, FALSE }, // pause 51 { TRUE, FALSE, FALSE }, // pause
53 { 6*30-5+xo, 3*30+yo, 1, FALSE, FALSE, FALSE, FALSE }, // next 52 { FALSE, FALSE, FALSE }, // next
54 { 0*30+5+xo, 3*30+yo, 1, FALSE, FALSE, FALSE, FALSE }, // previous 53 { FALSE, FALSE, FALSE }, // previous
55 { 3*30+xo, 0*30+5+yo, 3, FALSE, FALSE, FALSE, FALSE }, // volume up 54 { FALSE, FALSE, FALSE }, // volume up
56 { 3*30+xo, 6*30-5+yo, 3, FALSE, FALSE, FALSE, FALSE }, // volume down 55 { FALSE, FALSE, FALSE }, // volume down
57 { 5*30+xo, 1*30+yo, 0, TRUE, FALSE, FALSE, FALSE }, // repeat/loop 56 { TRUE, FALSE, FALSE }, // repeat/loop
58 { 1*30+xo, 1*30+yo, 0, FALSE, FALSE, FALSE, FALSE } // playlist 57 { FALSE, FALSE, FALSE }, // playlist
58 { FALSE, FALSE, FALSE }, // forward
59 { FALSE, FALSE, FALSE } // back
59}; 60};
60 61
62const char *skin_mask_file_names[11] = {
63 "play", "stop", "pause", "next", "prev", "up",
64 "down", "loop", "playlist", "forward", "back"
65};
61 66
62static const int numButtons = (sizeof(audioButtons)/sizeof(MediaButton));
63 67
68static void changeTextColor( QWidget *w ) {
69 QPalette p = w->palette();
70 p.setBrush( QColorGroup::Background, QColor( 167, 212, 167 ) );
71 p.setBrush( QColorGroup::Base, QColor( 167, 212, 167 ) );
72 w->setPalette( p );
73}
74
75static const int numButtons = (sizeof(audioButtons)/sizeof(MediaButton));
64 76
65AudioWidget::AudioWidget(QWidget* parent, const char* name, WFlags f) : 77AudioWidget::AudioWidget(QWidget* parent, const char* name, WFlags f) :
66 QWidget( parent, name, f ) 78 QWidget( parent, name, f ), songInfo( this ), slider( Qt::Horizontal, this ), time( this )
67{ 79{
68 setCaption( tr("OpiePlayer") ); 80 setCaption( tr("OpiePlayer") );
81 qDebug("<<<<<audioWidget");
82
69 Config cfg("OpiePlayer"); 83 Config cfg("OpiePlayer");
70 cfg.setGroup("AudioWidget"); 84 cfg.setGroup("AudioWidget");
71// QGridLayout *layout = new QGridLayout( this ); 85 skin = cfg.readEntry("Skin","default");
72// layout->setSpacing( 2); 86 //skin = "scaleTest";
73// layout->setMargin( 2); 87// color of background, frame, degree of transparency
74 QString backgroundPix, buttonsAllPix, buttonsBigPix, controlsPix, animatedPix; 88
75 backgroundPix=cfg.readEntry( " backgroundPix", "opieplayer/metalFinish"); 89 QString skinPath = "opieplayer2/skins/" + skin;
76 buttonsAllPix=cfg.readEntry( "buttonsAllPix","opieplayer/mediaButtonsAll"); 90 pixBg = new QPixmap( Resource::loadPixmap( QString("%1/background").arg(skinPath) ) );
77 buttonsBigPix=cfg.readEntry( "buttonsBigPix","opieplayer/mediaButtonsBig"); 91 imgUp = new QImage( Resource::loadImage( QString("%1/skin_up").arg(skinPath) ) );
78 controlsPix=cfg.readEntry( "controlsPix","opieplayer/mediaControls"); 92 imgDn = new QImage( Resource::loadImage( QString("%1/skin_down").arg(skinPath) ) );
79// animatedPix=cfg.readEntry( "animatedPix", "opieplayer/animatedButton"); 93
80 94 imgButtonMask = new QImage( imgUp->width(), imgUp->height(), 8, 255 );
81 setBackgroundPixmap( Resource::loadPixmap( backgroundPix) ); 95 imgButtonMask->fill( 0 );
82 pixmaps[0] = new QPixmap( Resource::loadPixmap( buttonsAllPix ) ); 96
83 pixmaps[1] = new QPixmap( Resource::loadPixmap( buttonsBigPix ) ); 97 for ( int i = 0; i < 11; i++ ) {
84 pixmaps[2] = new QPixmap( Resource::loadPixmap( controlsPix ) ); 98 QString filename = QString(getenv("OPIEDIR")) + "/pics/" + skinPath + "/skin_mask_" + skin_mask_file_names[i] + ".png";
85// pixmaps[3] = new QPixmap( Resource::loadPixmap( animatedPix) ); 99 masks[i] = new QBitmap( filename );
86 100
87 songInfo = new Ticker( this ); 101 if ( !masks[i]->isNull() ) {
88 songInfo->setFocusPolicy( QWidget::NoFocus ); 102 QImage imgMask = masks[i]->convertToImage();
89 songInfo->setGeometry( QRect( 7, 3, 220, 20 ) ); 103 uchar **dest = imgButtonMask->jumpTable();
90// layout->addMultiCellWidget( songInfo, 0, 0, 0, 2 ); 104 for ( int y = 0; y < imgUp->height(); y++ ) {
91 105 uchar *line = dest[y];
92 slider = new QSlider( Qt::Horizontal, this ); 106 for ( int x = 0; x < imgUp->width(); x++ )
93 slider->setFixedWidth( 220 ); 107 if ( !qRed( imgMask.pixel( x, y ) ) )
94 slider->setFixedHeight( 20 ); 108 line[x] = i + 1;
95 slider->setMinValue( 0 ); 109 }
96 slider->setMaxValue( 1 ); 110 }
97 slider->setBackgroundPixmap( Resource::loadPixmap( backgroundPix ) ); 111
98 slider->setFocusPolicy( QWidget::NoFocus ); 112 }
99 slider->setGeometry( QRect( 7, 262, 220, 20 ) ); 113
100 // layout->addMultiCellWidget( slider, 4, 4, 0, 2 ); 114 for ( int i = 0; i < 11; i++ ) {
101 115 buttonPixUp[i] = NULL;
102 connect( slider, SIGNAL( sliderPressed() ), this, SLOT( sliderPressed() ) ); 116 buttonPixDown[i] = NULL;
103 connect( slider, SIGNAL( sliderReleased() ), this, SLOT( sliderReleased() ) ); 117 }
118
119 setBackgroundPixmap( *pixBg );
120
121 songInfo.setFocusPolicy( QWidget::NoFocus );
122
123 changeTextColor( &songInfo );
124 songInfo.setBackgroundColor( QColor( 167, 212, 167 ));
125 songInfo.setFrameStyle( QFrame::NoFrame);
126// songInfo.setFrameStyle( QFrame::WinPanel | QFrame::Sunken );
127 //NoFrame
128// songInfo.setForegroundColor(Qt::white);
129
130 slider.setFixedHeight( 20 );
131 slider.setMinValue( 0 );
132 slider.setMaxValue( 1 );
133 slider.setFocusPolicy( QWidget::NoFocus );
134 slider.setBackgroundPixmap( *pixBg );
135
136 time.setFocusPolicy( QWidget::NoFocus );
137 time.setAlignment( Qt::AlignCenter );
138 time.setFrame(FALSE);
139 changeTextColor( &time );
140
141 resizeEvent( NULL );
142
143 connect( &slider, SIGNAL( sliderPressed() ), this, SLOT( sliderPressed() ) );
144 connect( &slider, SIGNAL( sliderReleased() ), this, SLOT( sliderReleased() ) );
104 145
@@ -116,3 +157,3 @@ AudioWidget::AudioWidget(QWidget* parent, const char* name, WFlags f) :
116 setPlaying( mediaPlayerState->playing() ); 157 setPlaying( mediaPlayerState->playing() );
117 158
118} 159}
@@ -121,5 +162,14 @@ AudioWidget::AudioWidget(QWidget* parent, const char* name, WFlags f) :
121AudioWidget::~AudioWidget() { 162AudioWidget::~AudioWidget() {
122 mediaPlayerState->isStreaming = FALSE; 163
123 for ( int i = 0; i < 3; i++ ) 164 for ( int i = 0; i < 11; i++ ) {
124 delete pixmaps[i]; 165 delete buttonPixUp[i];
166 delete buttonPixDown[i];
167 }
168 delete pixBg;
169 delete imgUp;
170 delete imgDn;
171 delete imgButtonMask;
172 for ( int i = 0; i < 11; i++ ) {
173 delete masks[i];
174 }
125} 175}
@@ -127,5 +177,53 @@ AudioWidget::~AudioWidget() {
127 177
128static bool audioSliderBeingMoved = FALSE; 178QPixmap *combineImageWithBackground( QImage img, QPixmap bg, QPoint offset ) {
179 QPixmap pix( img.width(), img.height() );
180 QPainter p( &pix );
181 p.drawTiledPixmap( pix.rect(), bg, offset );
182 p.drawImage( 0, 0, img );
183 return new QPixmap( pix );
184}
185
186
187QPixmap *maskPixToMask( QPixmap pix, QBitmap mask )
188{
189 QPixmap *pixmap = new QPixmap( pix );
190 pixmap->setMask( mask );
191 return pixmap;
192}
129 193
130 194
195
196void AudioWidget::resizeEvent( QResizeEvent * ) {
197 int h = height();
198 int w = width();
199
200 songInfo.setGeometry( QRect( 2, 10, w - 4, 20 ) );
201 slider.setFixedWidth( w - 110 );
202 slider.setGeometry( QRect( 15, h - 30, w - 90, 20 ) );
203 slider.setBackgroundOrigin( QWidget::ParentOrigin );
204 time.setGeometry( QRect( w - 85, h - 30, 70, 20 ) );
205
206 xoff = ( w - imgUp->width() ) / 2;
207 yoff = (( h - imgUp->height() ) / 2) - 10;
208 QPoint p( xoff, yoff );
209
210 QPixmap *pixUp = combineImageWithBackground( *imgUp, *pixBg, p );
211 QPixmap *pixDn = combineImageWithBackground( *imgDn, *pixBg, p );
212
213 for ( int i = 0; i < 11; i++ ) {
214 if ( !masks[i]->isNull() ) {
215 delete buttonPixUp[i];
216 delete buttonPixDown[i];
217 buttonPixUp[i] = maskPixToMask( *pixUp, *masks[i] );
218 buttonPixDown[i] = maskPixToMask( *pixDn, *masks[i] );
219 }
220 }
221
222 delete pixUp;
223 delete pixDn;
224}
225
226
227static bool audioSliderBeingMoved = FALSE;
228
131void AudioWidget::sliderPressed() { 229void AudioWidget::sliderPressed() {
@@ -137,5 +235,5 @@ void AudioWidget::sliderReleased() {
137 audioSliderBeingMoved = FALSE; 235 audioSliderBeingMoved = FALSE;
138 if ( slider->width() == 0 ) 236 if ( slider.width() == 0 )
139 return; 237 return;
140 long val = long((double)slider->value() * mediaPlayerState->length() / slider->width()); 238 long val = long((double)slider.value() * mediaPlayerState->length() / slider.width());
141 mediaPlayerState->setPosition( val ); 239 mediaPlayerState->setPosition( val );
@@ -146,3 +244,4 @@ void AudioWidget::setPosition( long i ) {
146// qDebug("set position %d",i); 244// qDebug("set position %d",i);
147 updateSlider( i, mediaPlayerState->length() ); 245 long length = mediaPlayerState->length();
246 updateSlider( i, length );
148} 247}
@@ -156,4 +255,5 @@ void AudioWidget::setLength( long max ) {
156void AudioWidget::setView( char view ) { 255void AudioWidget::setView( char view ) {
256
157 if (mediaPlayerState->isStreaming) { 257 if (mediaPlayerState->isStreaming) {
158 if( !slider->isHidden()) slider->hide(); 258 if( !slider.isHidden()) slider.hide();
159 disconnect( mediaPlayerState, SIGNAL( positionChanged(long) ),this, SLOT( setPosition(long) ) ); 259 disconnect( mediaPlayerState, SIGNAL( positionChanged(long) ),this, SLOT( setPosition(long) ) );
@@ -163,3 +263,3 @@ void AudioWidget::setView( char view ) {
163 // does not stop stream when it reaches the end 263 // does not stop stream when it reaches the end
164 slider->show(); 264 slider.show();
165 connect( mediaPlayerState, SIGNAL( positionChanged(long) ),this, SLOT( setPosition(long) ) ); 265 connect( mediaPlayerState, SIGNAL( positionChanged(long) ),this, SLOT( setPosition(long) ) );
@@ -179,3 +279,12 @@ void AudioWidget::setView( char view ) {
179 279
280static QString timeAsString( long length ) {
281 length /= 44100;
282 int minutes = length / 60;
283 int seconds = length % 60;
284 return QString("%1:%2%3").arg( minutes ).arg( seconds / 10 ).arg( seconds % 10 );
285}
286
180void AudioWidget::updateSlider( long i, long max ) { 287void AudioWidget::updateSlider( long i, long max ) {
288 time.setText( timeAsString( i ) + " / " + timeAsString( max ) );
289
181 if ( max == 0 ) 290 if ( max == 0 )
@@ -184,9 +293,9 @@ void AudioWidget::updateSlider( long i, long max ) {
184 // Scale to something reasonable 293 // Scale to something reasonable
185 int width = slider->width(); 294 int width = slider.width();
186 int val = int((double)i * width / max); 295 int val = int((double)i * width / max);
187 if ( !audioSliderBeingMoved ) { 296 if ( !audioSliderBeingMoved ) {
188 if ( slider->value() != val ) 297 if ( slider.value() != val )
189 slider->setValue( val ); 298 slider.setValue( val );
190 if ( slider->maxValue() != width ) 299 if ( slider.maxValue() != width )
191 slider->setMaxValue( width ); 300 slider.setMaxValue( width );
192 } 301 }
@@ -209,8 +318,6 @@ void AudioWidget::toggleButton( int i ) {
209void AudioWidget::paintButton( QPainter *p, int i ) { 318void AudioWidget::paintButton( QPainter *p, int i ) {
210 int x = audioButtons[i].xPos; 319 if ( audioButtons[i].isDown )
211 int y = audioButtons[i].yPos; 320 p->drawPixmap( xoff, yoff, *buttonPixDown[i] );
212 int offset = 22 + 14 * audioButtons[i].isBig + audioButtons[i].isDown; 321 else
213 int buttonSize = 64 + audioButtons[i].isBig * (90 - 64); 322 p->drawPixmap( xoff, yoff, *buttonPixUp[i] );
214 p->drawPixmap( x, y, *pixmaps[audioButtons[i].isBig], buttonSize * (audioButtons[i].isDown + 2 * audioButtons[i].color), 0, buttonSize, buttonSize );
215 p->drawPixmap( x + offset, y + offset, *pixmaps[2], 18 * i, 0, 18, 18 );
216} 323}
@@ -219,2 +326,11 @@ void AudioWidget::paintButton( QPainter *p, int i ) {
219void AudioWidget::timerEvent( QTimerEvent * ) { 326void AudioWidget::timerEvent( QTimerEvent * ) {
327/*
328 int x = audioButtons[AudioPlay].xPos;
329 int y = audioButtons[AudioPlay].yPos;
330 QPainter p( this );
331 // Optimize to only draw the little bit of the changing images which is different
332 p.drawPixmap( x + 14, y + 8, *pixmaps[3], 32 * frame, 0, 32, 32 );
333 p.drawPixmap( x + 37, y + 37, *pixmaps[2], 18 * AudioPlay, 0, 6, 3 );
334*/
335/*
220 static int frame = 0; 336 static int frame = 0;
@@ -222,9 +338,4 @@ void AudioWidget::timerEvent( QTimerEvent * ) {
222 frame = frame >= 7 ? 0 : frame + 1; 338 frame = frame >= 7 ? 0 : frame + 1;
223// int x = audioButtons[AudioPlay].xPos;
224// int y = audioButtons[AudioPlay].yPos;
225// QPainter p( this );
226// // Optimize to only draw the little bit of the changing images which is different
227// p.drawPixmap( x + 14, y + 8, *pixmaps[3], 32 * frame, 0, 32, 32 );
228// p.drawPixmap( x + 37, y + 37, *pixmaps[2], 18 * AudioPlay, 0, 6, 3 );
229 } 339 }
340 */
230} 341}
@@ -234,15 +345,14 @@ void AudioWidget::mouseMoveEvent( QMouseEvent *event ) {
234 for ( int i = 0; i < numButtons; i++ ) { 345 for ( int i = 0; i < numButtons; i++ ) {
235 int size = audioButtons[i].isBig;
236 int x = audioButtons[i].xPos;
237 int y = audioButtons[i].yPos;
238 if ( event->state() == QMouseEvent::LeftButton ) { 346 if ( event->state() == QMouseEvent::LeftButton ) {
239 // The test to see if the mouse click is inside the circular button or not 347
240 // (compared with the radius squared to avoid a square-root of our distance) 348 // The test to see if the mouse click is inside the button or not
241 int radius = 32 + 13 * size; 349 int x = event->pos().x() - xoff;
242 QPoint center = QPoint( x + radius, y + radius ); 350 int y = event->pos().y() - yoff;
243 QPoint dXY = center - event->pos(); 351
244 int dist = dXY.x() * dXY.x() + dXY.y() * dXY.y(); 352 bool isOnButton = ( x > 0 && y > 0 && x < imgButtonMask->width()
245 bool isOnButton = dist <= (radius * radius); 353 && y < imgButtonMask->height() && imgButtonMask->pixelIndex( x, y ) == i + 1 );
246// QRect r( x, y, 64 + 22*size, 64 + 22*size ); 354
247// bool isOnButton = r.contains( event->pos() ); // Rectangular Button code 355 if ( isOnButton && i == AudioVolumeUp )
356 qDebug("on up");
357
248 if ( isOnButton && !audioButtons[i].isHeld ) { 358 if ( isOnButton && !audioButtons[i].isHeld ) {
@@ -250,5 +360,7 @@ void AudioWidget::mouseMoveEvent( QMouseEvent *event ) {
250 toggleButton(i); 360 toggleButton(i);
251 qDebug("button toggled1 %d",i);
252 switch (i) { 361 switch (i) {
253 case AudioVolumeUp: emit moreClicked(); return; 362 case AudioVolumeUp:
363 qDebug("more clicked");
364 emit moreClicked();
365 return;
254 case AudioVolumeDown: emit lessClicked(); return; 366 case AudioVolumeDown: emit lessClicked(); return;
@@ -258,3 +370,2 @@ void AudioWidget::mouseMoveEvent( QMouseEvent *event ) {
258 toggleButton(i); 370 toggleButton(i);
259 qDebug("button toggled2 %d",i);
260 } 371 }
@@ -265,3 +376,2 @@ void AudioWidget::mouseMoveEvent( QMouseEvent *event ) {
265 setToggleButton( i, FALSE ); 376 setToggleButton( i, FALSE );
266 qDebug("button toggled3 %d",i);
267 switch (i) { 377 switch (i) {
@@ -283,2 +393,3 @@ void AudioWidget::mouseMoveEvent( QMouseEvent *event ) {
283 393
394
284void AudioWidget::mousePressEvent( QMouseEvent *event ) { 395void AudioWidget::mousePressEvent( QMouseEvent *event ) {
@@ -304,6 +415,18 @@ void AudioWidget::closeEvent( QCloseEvent* ) {
304 415
305void AudioWidget::paintEvent( QPaintEvent * ) { 416void AudioWidget::paintEvent( QPaintEvent * pe) {
306 QPainter p( this ); 417 if ( !pe->erased() ) {
307 for ( int i = 0; i < numButtons; i++ ) 418 // Combine with background and double buffer
308 paintButton( &p, i ); 419 QPixmap pix( pe->rect().size() );
420 QPainter p( &pix );
421 p.translate( -pe->rect().topLeft().x(), -pe->rect().topLeft().y() );
422 p.drawTiledPixmap( pe->rect(), *pixBg, pe->rect().topLeft() );
423 for ( int i = 0; i < numButtons; i++ )
424 paintButton( &p, i );
425 QPainter p2( this );
426 p2.drawPixmap( pe->rect().topLeft(), pix );
427 } else {
428 QPainter p( this );
429 for ( int i = 0; i < numButtons; i++ )
430 paintButton( &p, i );
431 }
309} 432}
@@ -329,2 +452,3 @@ void AudioWidget::keyReleaseEvent( QKeyEvent *e)
329 case Key_Space: { 452 case Key_Space: {
453
330 if(mediaPlayerState->playing()) { 454 if(mediaPlayerState->playing()) {
@@ -340,3 +464,3 @@ void AudioWidget::keyReleaseEvent( QKeyEvent *e)
340 break; 464 break;
341 case Key_Down: 465 case Key_Down: //volume
342 toggleButton(6); 466 toggleButton(6);
@@ -346,3 +470,3 @@ void AudioWidget::keyReleaseEvent( QKeyEvent *e)
346 break; 470 break;
347 case Key_Up: 471 case Key_Up: //volume
348 toggleButton(5); 472 toggleButton(5);
@@ -352,3 +476,3 @@ void AudioWidget::keyReleaseEvent( QKeyEvent *e)
352 break; 476 break;
353 case Key_Right: 477 case Key_Right: //next in playlist
354// toggleButton(3); 478// toggleButton(3);
@@ -357,3 +481,3 @@ void AudioWidget::keyReleaseEvent( QKeyEvent *e)
357 break; 481 break;
358 case Key_Left: 482 case Key_Left: // previous in playlist
359// toggleButton(4); 483// toggleButton(4);