00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include "audiowidget.h"
00036
00037
00038 #include <opie2/odebug.h>
00039 #include <qpe/qpeapplication.h>
00040 using namespace Opie::Core;
00041 using namespace Opie::Ui;
00042
00043 namespace
00044 {
00045
00046 const int xo = -2;
00047 const int yo = 22;
00048
00049 const MediaWidget::SkinButtonInfo skinInfo[] =
00050 {
00051 { MediaWidget::Play, "play", MediaWidget::ToggleButton },
00052 { MediaWidget::Stop, "stop", MediaWidget::NormalButton },
00053 { MediaWidget::Next, "next", MediaWidget::NormalButton },
00054 { MediaWidget::Previous, "prev", MediaWidget::NormalButton },
00055 { MediaWidget::VolumeUp, "up", MediaWidget::NormalButton },
00056 { MediaWidget::VolumeDown, "down", MediaWidget::NormalButton },
00057 { MediaWidget::Loop, "loop", MediaWidget::ToggleButton },
00058 { MediaWidget::PlayList, "playlist", MediaWidget::NormalButton },
00059 { MediaWidget::Forward, "forward", MediaWidget::NormalButton },
00060 { MediaWidget::Back, "back", MediaWidget::NormalButton }
00061 };
00062
00063 const uint buttonCount = sizeof( skinInfo ) / sizeof( skinInfo[ 0 ] );
00064
00065 void changeTextColor( QWidget * w) {
00066 QPalette p = w->palette();
00067 p.setBrush( QColorGroup::Background, QColor( 167, 212, 167 ) );
00068 p.setBrush( QColorGroup::Base, QColor( 167, 212, 167 ) );
00069 w->setPalette( p );
00070 }
00071
00072 }
00073
00074 AudioWidget::AudioWidget( PlayListWidget &playList, MediaPlayerState &mediaPlayerState, QWidget* parent, const char* name) :
00075
00076 MediaWidget( playList, mediaPlayerState, parent, name ), songInfo( this ), slider( Qt::Horizontal, this ), time( this ),
00077 audioSliderBeingMoved( false )
00078 {
00079 setCaption( tr("OpiePlayer") );
00080
00081 loadSkin();
00082
00083 connect( &mediaPlayerState, SIGNAL( loopingToggled(bool) ), this, SLOT( setLooping(bool) ) );
00084 connect( &mediaPlayerState, SIGNAL( isSeekableToggled(bool) ), this, SLOT( setSeekable(bool) ) );
00085
00086 connect( this, SIGNAL( forwardClicked() ), this, SLOT( skipFor() ) );
00087 connect( this, SIGNAL( backClicked() ), this, SLOT( skipBack() ) );
00088 connect( this, SIGNAL( forwardReleased() ), this, SLOT( stopSkip() ) );
00089 connect( this, SIGNAL( backReleased() ), this, SLOT( stopSkip() ) );
00090
00091
00092 setLength( mediaPlayerState.length() );
00093 setPosition( mediaPlayerState.position() );
00094 setLooping( mediaPlayerState.isFullscreen() );
00095
00096 setPlaying( mediaPlayerState.isPlaying() );
00097 }
00098
00099 AudioWidget::~AudioWidget() {
00100
00101
00102 }
00103
00104 MediaWidget::GUIInfo AudioWidget::guiInfo()
00105 {
00106 return GUIInfo( QString::null , ::skinInfo, ::buttonCount );
00107 }
00108
00109 void AudioWidget::resizeEvent( QResizeEvent *e ) {
00110 int h = height();
00111 int w = width();
00112
00113 songInfo.setGeometry( QRect( 2, 2, w - 4, 20 ) );
00114 slider.setFixedWidth( w - 110 );
00115 slider.setGeometry( QRect( 15, h - 22, w - 90, 20 ) );
00116 slider.setBackgroundOrigin( QWidget::ParentOrigin );
00117 time.setGeometry( QRect( w - 85, h - 30, 70, 20 ) );
00118
00119 upperLeftOfButtonMask.rx() = ( w - buttonUpImage.width() ) / 2;
00120 upperLeftOfButtonMask.ry() = (( h - buttonUpImage.height() ) / 2) - 10;
00121
00122 MediaWidget::resizeEvent( e );
00123 }
00124
00125 void AudioWidget::sliderPressed() {
00126 audioSliderBeingMoved = TRUE;
00127 }
00128
00129
00130 void AudioWidget::sliderReleased() {
00131 audioSliderBeingMoved = FALSE;
00132 if ( slider.width() == 0 )
00133 return;
00134 long val = long((double)slider.value() * mediaPlayerState.length() / slider.width());
00135 mediaPlayerState.setPosition( val );
00136 }
00137
00138 void AudioWidget::setPosition( long i ) {
00139
00140 updateSlider( i, mediaPlayerState.length() );
00141 }
00142
00143
00144 void AudioWidget::setLength( long max ) {
00145 updateSlider( mediaPlayerState.position(), max );
00146 }
00147
00148
00149 void AudioWidget::setDisplayType( MediaPlayerState::DisplayType mediaType ) {
00150 if ( mediaType == MediaPlayerState::Audio ) {
00151
00152 QPEApplication::showWidget( this );
00153 return;
00154 }
00155
00156 killTimers();
00157 hide();
00158 }
00159
00160 void AudioWidget::loadSkin()
00161 {
00162 loadDefaultSkin( guiInfo() );
00163
00164 songInfo.setFocusPolicy( QWidget::NoFocus );
00165
00166
00167
00168 songInfo.setFrameStyle( QFrame::WinPanel | QFrame::Sunken );
00169
00170
00171 slider.setFixedHeight( 20 );
00172 slider.setMinValue( 0 );
00173 slider.setMaxValue( 1 );
00174 slider.setFocusPolicy( QWidget::NoFocus );
00175 slider.setBackgroundPixmap( backgroundPixmap );
00176
00177
00178
00179
00180
00181 time.setFocusPolicy( QWidget::NoFocus );
00182 time.setAlignment( Qt::AlignCenter );
00183
00184
00185
00186
00187 resizeEvent( 0 );
00188 }
00189
00190 void AudioWidget::setSeekable( bool isSeekable ) {
00191
00192 if ( !isSeekable ) {
00193 odebug << "<<<<<<<<<<<<<<file is STREAMING>>>>>>>>>>>>>>>>>>>" << oendl;
00194 if( !slider.isHidden()) {
00195 slider.hide();
00196 }
00197 disconnect( &mediaPlayerState, SIGNAL( positionChanged(long) ),this, SLOT( setPosition(long) ) );
00198 disconnect( &mediaPlayerState, SIGNAL( positionUpdated(long) ),this, SLOT( setPosition(long) ) );
00199 disconnect( &slider, SIGNAL( sliderPressed() ), this, SLOT( sliderPressed() ) );
00200 disconnect( &slider, SIGNAL( sliderReleased() ), this, SLOT( sliderReleased() ) );
00201 } else {
00202
00203
00204 slider.show();
00205 odebug << " CONNECT SET POSTION " << oendl;
00206 connect( &mediaPlayerState, SIGNAL( positionChanged(long) ),this, SLOT( setPosition(long) ) );
00207 connect( &mediaPlayerState, SIGNAL( positionUpdated(long) ),this, SLOT( setPosition(long) ) );
00208 connect( &slider, SIGNAL( sliderPressed() ), this, SLOT( sliderPressed() ) );
00209 connect( &slider, SIGNAL( sliderReleased() ), this, SLOT( sliderReleased() ) );
00210 }
00211 }
00212
00213
00214 static QString timeAsString( long length ) {
00215 int minutes = length / 60;
00216 int seconds = length % 60;
00217 return QString("%1:%2%3").arg( minutes ).arg( seconds / 10 ).arg( seconds % 10 );
00218 }
00219
00220 void AudioWidget::updateSlider( long i, long max ) {
00221
00222 time.setText( timeAsString( i ) + " / " + timeAsString( max ) );
00223
00224
00225 if ( max == 0 ) {
00226 return;
00227 }
00228
00229
00230 int width = slider.width();
00231 int val = int((double)i * width / max);
00232 if ( !audioSliderBeingMoved ) {
00233 if ( slider.value() != val ) {
00234 slider.setValue( val );
00235 }
00236
00237 if ( slider.maxValue() != width ) {
00238 slider.setMaxValue( width );
00239 }
00240 }
00241 }
00242
00243 void AudioWidget::skipFor() {
00244 skipDirection = +1;
00245 startTimer( 50 );
00246 mediaPlayerState.setPosition( mediaPlayerState.position() + 2 );
00247 }
00248
00249 void AudioWidget::skipBack() {
00250 skipDirection = -1;
00251 startTimer( 50 );
00252 mediaPlayerState.setPosition( mediaPlayerState.position() - 2 );
00253 }
00254
00255
00256
00257 void AudioWidget::stopSkip() {
00258 killTimers();
00259 }
00260
00261
00262 void AudioWidget::timerEvent( QTimerEvent * ) {
00263 if ( skipDirection == +1 ) {
00264 mediaPlayerState.setPosition( mediaPlayerState.position() + 2 );
00265 } else if ( skipDirection == -1 ) {
00266 mediaPlayerState.setPosition( mediaPlayerState.position() - 2 );
00267 }
00268 }
00269
00270 void AudioWidget::keyReleaseEvent( QKeyEvent *e) {
00271 switch ( e->key() ) {
00273 case Key_Home:
00274 break;
00275 case Key_F9:
00276 hide();
00277
00278 e->accept();
00279 break;
00280 case Key_F10:
00281 break;
00282 case Key_F11:
00283 mediaPlayerState.toggleBlank();
00284 e->accept();
00285 break;
00286 case Key_F12:
00287 break;
00288 case Key_F13:
00289 mediaPlayerState.toggleBlank();
00290 e->accept();
00291 break;
00292 case Key_Space: {
00293 e->accept();
00294 mediaPlayerState.togglePaused();
00295 }
00296 break;
00297 case Key_Down:
00298
00299 emit lessClicked();
00300 emit lessReleased();
00301
00302 e->accept();
00303 break;
00304 case Key_Up:
00305
00306 emit moreClicked();
00307 emit moreReleased();
00308
00309 e->accept();
00310 break;
00311 case Key_Right:
00312
00313 mediaPlayerState.setNext();
00314
00315 e->accept();
00316 break;
00317 case Key_Left:
00318
00319 mediaPlayerState.setPrev();
00320
00321 e->accept();
00322 break;
00323 case Key_Escape: {
00324 }
00325 break;
00326
00327 };
00328 }