Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

audiowidget.cpp

Go to the documentation of this file.
00001 /*
00002                             This file is part of the Opie Project
00003 
00004                              Copyright (c)  2002 Max Reiss <harlekin@handhelds.org>
00005                              Copyright (c)  2002 L. Potter <ljp@llornkcor.com>
00006                              Copyright (c)  2002 Holger Freyther <zecke@handhelds.org>
00007               =.
00008             .=l.
00009            .>+-=
00010  _;:,     .>    :=|.         This program is free software; you can
00011 .> <`_,   >  .   <=          redistribute it and/or  modify it under
00012 :`=1 )Y*s>-.--   :           the terms of the GNU General Public
00013 .="- .-=="i,     .._         License as published by the Free Software
00014  - .   .-<_>     .<>         Foundation; either version 2 of the License,
00015      ._= =}       :          or (at your option) any later version.
00016     .%`+i>       _;_.
00017     .i_,=:_.      -<s.       This program is distributed in the hope that
00018      +  .  -:.       =       it will be useful,  but WITHOUT ANY WARRANTY;
00019     : ..    .:,     . . .    without even the implied warranty of
00020     =_        +     =;=|`    MERCHANTABILITY or FITNESS FOR A
00021   _.=:.       :    :=>`:     PARTICULAR PURPOSE. See the GNU
00022 ..}^=.=       =       ;      Library General Public License for more
00023 ++=   -.     .`     .:       details.
00024  :     =  ...= . :.=-
00025  -.   .:....=;==+<;          You should have received a copy of the GNU
00026   -_. . .   )=.  =           Library General Public License along with
00027     --        :-=`           this library; see the file COPYING.LIB.
00028                              If not, write to the Free Software Foundation,
00029                              Inc., 59 Temple Place - Suite 330,
00030                              Boston, MA 02111-1307, USA.
00031 
00032 */
00033 
00034 
00035 #include "audiowidget.h"
00036 
00037 /* OPIE */
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; // movable x offset
00047 const int yo = 22; // movable y offset
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     // Intialise state
00092     setLength( mediaPlayerState.length() );
00093     setPosition( mediaPlayerState.position() );
00094     setLooping( mediaPlayerState.isFullscreen() );
00095     //    setPaused( mediaPlayerState->paused() );
00096     setPlaying( mediaPlayerState.isPlaying() );
00097 }
00098 
00099 AudioWidget::~AudioWidget() {
00100 
00101 //    mediaPlayerState->setPlaying(false);
00102 }
00103 
00104 MediaWidget::GUIInfo AudioWidget::guiInfo()
00105 {
00106     return GUIInfo( QString::null /* infix */, ::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     //    odebug << "<<<<<<<<<<<<<<<<<<<<<<<<set position " << i << "" << oendl;
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         // startTimer( 150 );
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 //    changeTextColor( &songInfo );
00166 //    songInfo.setBackgroundColor( QColor( 167, 212, 167 ));
00167 //    songInfo.setFrameStyle( QFrame::NoFrame);
00168     songInfo.setFrameStyle( QFrame::WinPanel | QFrame::Sunken );
00169 //    songInfo.setForegroundColor(Qt::white);
00170 
00171     slider.setFixedHeight( 20 );
00172     slider.setMinValue( 0 );
00173     slider.setMaxValue( 1 );
00174     slider.setFocusPolicy( QWidget::NoFocus );
00175     slider.setBackgroundPixmap( backgroundPixmap );
00176 
00177 //     Config cofg("qpe");
00178 //     cofg.setGroup("Appearance");
00179 //     QColor backgroundcolor = QColor( cofg.readEntry( "Background", "#E5E1D5" ) );
00180 
00181     time.setFocusPolicy( QWidget::NoFocus );
00182     time.setAlignment( Qt::AlignCenter );
00183 
00184 //    time.setFrame(FALSE);
00185 //    changeTextColor( &time );
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         // this stops the slider from being moved, thus
00203         // does not stop stream when it reaches the end
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 //    odebug << timeAsString( i ) << " / " << timeAsString( max ) << oendl;
00224 
00225     if ( max == 0 ) {
00226         return;
00227     }
00228     // Will flicker too much if we don't do this
00229     // Scale to something reasonable
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: //activity
00276            hide();
00277            //           odebug << "Audio F9" << oendl;
00278            e->accept();
00279           break;
00280       case Key_F10: //contacts
00281           break;
00282       case Key_F11: //menu
00283               mediaPlayerState.toggleBlank();
00284               e->accept();
00285           break;
00286       case Key_F12: //home
00287           break;
00288       case Key_F13: //mail
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           //              toggleButton(6);
00299           emit lessClicked();
00300           emit lessReleased();
00301           //          toggleButton(6);
00302           e->accept();
00303           break;
00304       case Key_Up:
00305           //             toggleButton(5);
00306            emit moreClicked();
00307            emit moreReleased();
00308            //             toggleButton(5);
00309            e->accept();
00310            break;
00311       case Key_Right:
00312           //            toggleButton(3);
00313           mediaPlayerState.setNext();
00314           //            toggleButton(3);
00315            e->accept();
00316           break;
00317       case Key_Left:
00318           //            toggleButton(4);
00319           mediaPlayerState.setPrev();
00320           //            toggleButton(4);
00321           e->accept();
00322           break;
00323       case Key_Escape: {
00324       }
00325           break;
00326 
00327     };
00328 }

Generated on Sat Nov 5 16:15:34 2005 for OPIE by  doxygen 1.4.2