00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "soundeditwidget.h"
00023
00024 #include <kabc/addressee.h>
00025 #include <kfiledialog.h>
00026 #include <kicon.h>
00027 #include <kio/netaccess.h>
00028 #include <klocale.h>
00029 #include <kmessagebox.h>
00030
00031 #ifndef Q_OS_WINCE
00032 #include <phonon/mediaobject.h>
00033 #endif
00034
00035 #include <QtCore/QBuffer>
00036 #include <QtGui/QContextMenuEvent>
00037 #include <QtGui/QMenu>
00038
00042 class SoundLoader
00043 {
00044 public:
00045 SoundLoader( QWidget *parent = 0 );
00046
00047 QByteArray loadSound( const KUrl &url, bool *ok );
00048
00049 private:
00050 QByteArray mSound;
00051 QWidget *mParent;
00052 };
00053
00054
00055 SoundLoader::SoundLoader( QWidget *parent )
00056 : mParent( parent )
00057 {
00058 }
00059
00060 QByteArray SoundLoader::loadSound( const KUrl &url, bool *ok )
00061 {
00062 QByteArray sound;
00063 QString tempFile;
00064
00065 if ( url.isEmpty() )
00066 return sound;
00067
00068 (*ok) = false;
00069
00070 if ( url.isLocalFile() ) {
00071 QFile file( url.toLocalFile() );
00072 if ( file.open( QIODevice::ReadOnly ) ) {
00073 sound = file.readAll();
00074 file.close();
00075 (*ok) = true;
00076 }
00077 } else if ( KIO::NetAccess::download( url, tempFile, mParent ) ) {
00078 QFile file( tempFile );
00079 if ( file.open( QIODevice::ReadOnly ) ) {
00080 sound = file.readAll();
00081 file.close();
00082 (*ok) = true;
00083 }
00084 KIO::NetAccess::removeTempFile( tempFile );
00085 }
00086
00087 if ( !(*ok) ) {
00088 KMessageBox::sorry( mParent, i18n( "This contact's sound cannot be found." ) );
00089 return sound;
00090 }
00091
00092 (*ok) = true;
00093
00094 return sound;
00095 }
00096
00097
00098
00099
00100 SoundEditWidget::SoundEditWidget( QWidget *parent )
00101 : QToolButton( parent ),
00102 mHasSound( false ),
00103 mReadOnly( false ),
00104 mSoundLoader( 0 )
00105 {
00106 connect( this, SIGNAL( clicked() ), SLOT( playSound() ) );
00107
00108 updateView();
00109 }
00110
00111 SoundEditWidget::~SoundEditWidget()
00112 {
00113 delete mSoundLoader;
00114 }
00115
00116 void SoundEditWidget::loadContact( const KABC::Addressee &contact )
00117 {
00118 const KABC::Sound sound = contact.sound();
00119 if ( sound.isIntern() && !sound.data().isEmpty() ) {
00120 mHasSound = true;
00121 mSound = sound.data();
00122 }
00123
00124 updateView();
00125 }
00126
00127 void SoundEditWidget::storeContact( KABC::Addressee &contact ) const
00128 {
00129 KABC::Sound sound( contact.sound() );
00130 sound.setData( mSound );
00131 contact.setSound( sound );
00132 }
00133
00134 void SoundEditWidget::setReadOnly( bool readOnly )
00135 {
00136 mReadOnly = readOnly;
00137 }
00138
00139 void SoundEditWidget::updateView()
00140 {
00141 if ( mHasSound ) {
00142 setIcon( KIcon( QLatin1String( "audio-volume-medium" ) ) );
00143 setToolTip( i18n( "Click to play pronunciation" ) );
00144 } else {
00145 setIcon( KIcon( QLatin1String( "audio-volume-muted" ) ) );
00146 setToolTip( i18n( "No pronunciation available" ) );
00147 }
00148 }
00149
00150 void SoundEditWidget::contextMenuEvent( QContextMenuEvent *event )
00151 {
00152 QMenu menu;
00153
00154 if ( mHasSound )
00155 menu.addAction( i18n( "Play" ), this, SLOT( playSound() ) );
00156
00157 if ( !mReadOnly )
00158 menu.addAction( i18n( "Change..." ), this, SLOT( changeSound() ) );
00159
00160 if ( mHasSound ) {
00161 menu.addAction( i18n( "Save..." ), this, SLOT( saveSound() ) );
00162
00163 if ( !mReadOnly )
00164 menu.addAction( i18n( "Remove" ), this, SLOT( deleteSound() ) );
00165 }
00166
00167 menu.exec( event->globalPos() );
00168 }
00169
00170 void SoundEditWidget::playSound()
00171 {
00172 if ( !mHasSound )
00173 return;
00174
00175 #ifndef Q_OS_WINCE
00176 Phonon::MediaObject* player = Phonon::createPlayer( Phonon::NotificationCategory );
00177 QBuffer* soundData = new QBuffer( player );
00178 soundData->setData( mSound );
00179 player->setCurrentSource( soundData );
00180 player->setParent( this );
00181 connect( player, SIGNAL( finished() ), player, SLOT( deleteLater() ) );
00182 player->play();
00183 #endif
00184 }
00185
00186 void SoundEditWidget::changeSound()
00187 {
00188 const KUrl url = KFileDialog::getOpenUrl( QString(), QLatin1String( "*.wav" ), this );
00189 if ( url.isValid() ) {
00190 bool ok = false;
00191 const QByteArray sound = soundLoader()->loadSound( url, &ok );
00192 if ( ok ) {
00193 mSound = sound;
00194 mHasSound = true;
00195 updateView();
00196 }
00197 }
00198 }
00199
00200 void SoundEditWidget::saveSound()
00201 {
00202 const QString fileName = KFileDialog::getSaveFileName( KUrl(), QLatin1String( "*.wav" ), this );
00203 if ( !fileName.isEmpty() ) {
00204 QFile file( fileName );
00205 if ( file.open( QIODevice::WriteOnly ) ) {
00206 file.write( mSound );
00207 file.close();
00208 }
00209 }
00210 }
00211
00212 void SoundEditWidget::deleteSound()
00213 {
00214 mHasSound = false;
00215 mSound = QByteArray();
00216 updateView();
00217 }
00218
00219 SoundLoader* SoundEditWidget::soundLoader()
00220 {
00221 if ( !mSoundLoader )
00222 mSoundLoader = new SoundLoader;
00223
00224 return mSoundLoader;
00225 }
00226
00227 #include "soundeditwidget.moc"