00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "KPrSlideTransitionDia.h"
00023
00024 #include <kfiledialog.h>
00025 #include <klocale.h>
00026 #include <knuminput.h>
00027 #include <kstandarddirs.h>
00028 #include <kurlrequester.h>
00029
00030 #include <qcheckbox.h>
00031 #include <qcombobox.h>
00032 #include <qimage.h>
00033 #include <qlabel.h>
00034 #include <qpushbutton.h>
00035
00036 #include "KPrBackground.h"
00037 #include "KPrCanvas.h"
00038 #include "KPrCommand.h"
00039 #include "KPrDocument.h"
00040 #include "KPrSoundPlayer.h"
00041 #include "KPrView.h"
00042 #include "KPrPage.h"
00043 #include "KPrPageEffects.h"
00044 #include "slidetransitionwidget.h"
00045
00046 KPrSlideTransitionDia::KPrSlideTransitionDia( QWidget *parent, const char *name, KPrView *view )
00047 : KDialogBase( parent, name, true, i18n( "Slide Transition" ), User1|Ok|Cancel, Ok, true )
00048 , m_dialog( new SlideTransitionWidget( this ) ), m_view( view ), m_soundPlayer(0), m_pageEffect( 0 )
00049 {
00050 int pgnum = m_view->getCurrPgNum() - 1;
00051 KPrPage *page = m_view->kPresenterDoc()->pageList().at( pgnum );
00052 m_effect = page->getPageEffect();
00053 m_effectSpeed = page->getPageEffectSpeed();
00054 m_soundEffect = page->getPageSoundEffect();
00055 m_soundFileName = page->getPageSoundFileName();
00056 m_slideTime = page->getPageTimer();
00057
00058
00059 m_view->getCanvas()->drawPageInPix( m_pixmap, pgnum, 60 );
00060 int w = m_pixmap.width();
00061 int h = m_pixmap.height();
00062
00063 if ( w > h )
00064 {
00065 h = 300 * h / w;
00066 w = 300;
00067 }
00068 else
00069 {
00070 w = 300 * w / h;
00071 h = 300;
00072 }
00073
00074 const QImage img(m_pixmap.convertToImage().smoothScale( w, h ));
00075 m_pixmap.convertFromImage(img);
00076
00077 m_dialog->previewPixmap->setPixmap( m_pixmap );
00078 m_dialog->previewPixmap->setFixedSize( w, h );
00079 m_target.resize( m_pixmap.size() );
00080 m_target.fill( Qt::black );
00081
00082
00083 m_dialog->effectCombo->insertItem( i18n( "No Effect" ) );
00084 m_dialog->effectCombo->insertItem( i18n( "Close Horizontal" ) );
00085 m_dialog->effectCombo->insertItem( i18n( "Close Vertical" ) );
00086 m_dialog->effectCombo->insertItem( i18n( "Close From All Directions" ) );
00087 m_dialog->effectCombo->insertItem( i18n( "Open Horizontal" ) );
00088 m_dialog->effectCombo->insertItem( i18n( "Open Vertical" ) );
00089 m_dialog->effectCombo->insertItem( i18n( "Open From All Directions" ) );
00090 m_dialog->effectCombo->insertItem( i18n( "Interlocking Horizontal 1" ) );
00091 m_dialog->effectCombo->insertItem( i18n( "Interlocking Horizontal 2" ) );
00092 m_dialog->effectCombo->insertItem( i18n( "Interlocking Vertical 1" ) );
00093 m_dialog->effectCombo->insertItem( i18n( "Interlocking Vertical 2" ) );
00094 m_dialog->effectCombo->insertItem( i18n( "Surround 1" ) );
00095 m_dialog->effectCombo->insertItem( i18n( "Fly Away 1" ) );
00096 m_dialog->effectCombo->insertItem( i18n( "Blinds Horizontal" ) );
00097 m_dialog->effectCombo->insertItem( i18n( "Blinds Vertical" ) );
00098 m_dialog->effectCombo->insertItem( i18n( "Box In" ) );
00099 m_dialog->effectCombo->insertItem( i18n( "Box Out" ) );
00100 m_dialog->effectCombo->insertItem( i18n( "Checkerboard Across" ) );
00101 m_dialog->effectCombo->insertItem( i18n( "Checkerboard Down" ) );
00102 m_dialog->effectCombo->insertItem( i18n( "Cover Down" ) );
00103 m_dialog->effectCombo->insertItem( i18n( "Uncover Down" ) );
00104 m_dialog->effectCombo->insertItem( i18n( "Cover Up" ) );
00105 m_dialog->effectCombo->insertItem( i18n( "Uncover Up" ) );
00106 m_dialog->effectCombo->insertItem( i18n( "Cover Left" ) );
00107 m_dialog->effectCombo->insertItem( i18n( "Uncover Left" ) );
00108 m_dialog->effectCombo->insertItem( i18n( "Cover Right" ) );
00109 m_dialog->effectCombo->insertItem( i18n( "Uncover Right" ) );
00110 m_dialog->effectCombo->insertItem( i18n( "Cover Left-Up" ) );
00111 m_dialog->effectCombo->insertItem( i18n( "Uncover Left-Up" ) );
00112 m_dialog->effectCombo->insertItem( i18n( "Cover Left-Down" ) );
00113 m_dialog->effectCombo->insertItem( i18n( "Uncover Left-Down" ) );
00114 m_dialog->effectCombo->insertItem( i18n( "Cover Right-Up" ) );
00115 m_dialog->effectCombo->insertItem( i18n( "Uncover Right-Up" ) );
00116
00117 m_dialog->effectCombo->insertItem( i18n( "Cover Right-Bottom" ) );
00118 m_dialog->effectCombo->insertItem( i18n( "Uncover Right-Bottom" ) );
00119 m_dialog->effectCombo->insertItem( i18n( "Dissolve" ) );
00120 m_dialog->effectCombo->insertItem( i18n( "Strips Left-Up" ) );
00121 m_dialog->effectCombo->insertItem( i18n( "Strips Left-Down" ) );
00122 m_dialog->effectCombo->insertItem( i18n( "Strips Right-Up" ) );
00123 m_dialog->effectCombo->insertItem( i18n( "Strips Right-Down" ) );
00124 m_dialog->effectCombo->insertItem( i18n( "Melting" ) );
00125 m_dialog->effectCombo->insertItem( i18n( "Random Transition" ) );
00126 m_dialog->effectCombo->setCurrentItem( static_cast<int>( m_effect ) );
00127
00128
00129 if( m_effect == PEF_RANDOM )
00130 m_dialog->effectCombo->setCurrentItem( m_dialog->effectCombo->count()-1 );
00131
00132 connect( m_dialog->effectCombo, SIGNAL( activated( int ) ), this, SLOT( effectChanged( int ) ) );
00133
00134
00135 m_dialog->speedCombo->insertItem( i18n("Slow") );
00136 m_dialog->speedCombo->insertItem( i18n("Medium") );
00137 m_dialog->speedCombo->insertItem( i18n("Fast") );
00138
00139 m_dialog->speedCombo->setCurrentItem( m_effectSpeed );
00140
00141 connect( m_dialog->speedCombo, SIGNAL( activated( int ) ), this, SLOT( effectChanged( int ) ) );
00142
00143
00144 m_dialog->soundCheckBox->setChecked( m_soundEffect );
00145 m_dialog->soundRequester->setURL( m_soundFileName );
00146 soundEffectChanged();
00147 m_dialog->playButton->setIconSet( SmallIconSet( "player_play" ) );
00148 m_dialog->stopButton->setIconSet( SmallIconSet( "player_stop" ) );
00149 connect( m_dialog->playButton, SIGNAL( clicked() ), this, SLOT( playSound() ) );
00150 connect( m_dialog->stopButton, SIGNAL( clicked() ), this, SLOT( stopSound() ) );
00151
00152 connect( m_dialog->soundCheckBox, SIGNAL( clicked()), this, SLOT( soundEffectChanged() ) );
00153 connect( m_dialog->soundRequester, SIGNAL( openFileDialog( KURLRequester * ) ), this, SLOT( slotRequesterClicked( KURLRequester * ) ) );
00154 connect( m_dialog->soundRequester, SIGNAL( textChanged( const QString& ) ), this, SLOT( slotSoundFileChanged( const QString& ) ) );
00155
00156
00157 m_dialog->automaticTransitionInput->setRange( 1, 600, 1 );
00158 m_dialog->automaticTransitionInput->setValue( m_slideTime );
00159
00160
00161 connect( m_dialog->previewButton, SIGNAL( clicked() ), this, SLOT( preview() ) );
00162
00163 setButtonText(KDialogBase::User1,i18n( "Apply &Global" ));
00164
00165 connect( this, SIGNAL( okClicked() ), this, SLOT( slotOk() ) );
00166 connect( this, SIGNAL( user1Clicked() ), this, SLOT( slotUser1() ) );
00167
00168 setMainWidget( m_dialog );
00169 }
00170
00171
00172 KPrSlideTransitionDia::~KPrSlideTransitionDia()
00173 {
00174 delete m_dialog;
00175 }
00176
00177
00178 void KPrSlideTransitionDia::effectChanged( int )
00179 {
00180 preview();
00181 }
00182
00183
00184 void KPrSlideTransitionDia::preview()
00185 {
00186 PageEffect effect = static_cast<PageEffect>( m_dialog->effectCombo->currentItem() );
00187 if ( m_dialog->effectCombo->currentText() == i18n( "Random Transition" ) )
00188 effect = PEF_RANDOM;
00189
00190 EffectSpeed effectSpeed = static_cast<EffectSpeed>( m_dialog->speedCombo->currentItem() );
00191
00192 if ( m_pageEffect )
00193 {
00194 m_pageEffectTimer.stop();
00195 QObject::disconnect( &m_pageEffectTimer, SIGNAL( timeout() ), this, SLOT( slotDoPageEffect() ) );
00196
00197 m_pageEffect->finish();
00198
00199 delete m_pageEffect;
00200 m_pageEffect = 0;
00201 m_dialog->previewPixmap->repaint();
00202 }
00203
00204 m_pageEffect = new KPrPageEffects( m_dialog->previewPixmap, m_target, effect, effectSpeed );
00205 if ( m_pageEffect->doEffect() )
00206 {
00207 delete m_pageEffect;
00208 m_pageEffect = 0;
00209 m_dialog->previewPixmap->update();
00210 }
00211 else
00212 {
00213 connect( &m_pageEffectTimer, SIGNAL( timeout() ), SLOT( slotDoPageEffect() ) );
00214 m_pageEffectTimer.start( 50, true );
00215 }
00216 }
00217
00218
00219 void KPrSlideTransitionDia::slotDoPageEffect()
00220 {
00221 if ( m_pageEffect->doEffect() )
00222 {
00223 m_pageEffectTimer.stop();
00224 QObject::disconnect( &m_pageEffectTimer, SIGNAL( timeout() ), this, SLOT( slotDoPageEffect() ) );
00225 delete m_pageEffect;
00226 m_pageEffect = 0;
00227 m_dialog->previewPixmap->update();
00228 }
00229 else
00230 {
00231 m_pageEffectTimer.start( 50, true );
00232 }
00233 }
00234
00235
00236 void KPrSlideTransitionDia::slotRequesterClicked( KURLRequester * )
00237 {
00238 QString filter( getSoundFileFilter() );
00239 m_dialog->soundRequester->fileDialog()->setFilter( filter );
00240
00241
00242 QStringList soundDirs = KGlobal::dirs()->resourceDirs( "sound" );
00243 if ( !soundDirs.isEmpty() ) {
00244 KURL soundURL;
00245 QDir dir;
00246 dir.setFilter( QDir::Files | QDir::Readable );
00247 QStringList::ConstIterator it = soundDirs.begin();
00248 while ( it != soundDirs.end() ) {
00249 dir = *it;
00250 if ( dir.isReadable() && dir.count() > 2 ) {
00251 soundURL.setPath( *it );
00252 m_dialog->soundRequester->fileDialog()->setURL( soundURL );
00253 break;
00254 }
00255 ++it;
00256 }
00257 }
00258 }
00259
00260
00261 QString KPrSlideTransitionDia::getSoundFileFilter()
00262 {
00263 QStringList fileList;
00264 fileList << "wav" << "au" << "mp3" << "mp1" << "mp2" << "mpg" << "dat"
00265 << "mpeg" << "ogg" << "cdda" << "cda " << "vcd" << "null";
00266 fileList.sort();
00267
00268 bool comma = false;
00269 QString full, str;
00270 for ( QStringList::ConstIterator it = fileList.begin(); it != fileList.end(); ++it ) {
00271 if ( comma )
00272 str += '\n';
00273 comma = true;
00274 str += QString( i18n( "*.%1|%2 Files" ) ).arg( *it ).arg( (*it).upper() );
00275
00276 full += QString( "*.") + (*it) + ' ';
00277 }
00278
00279 str = full + '|' + i18n( "All Supported Files" ) + '\n' + str;
00280 str += "\n*|" + i18n( "All Files" );
00281
00282 return str;
00283 }
00284
00285
00286 void KPrSlideTransitionDia::soundEffectChanged()
00287 {
00288 bool soundEffect = m_dialog->soundCheckBox->isChecked();
00289
00290 m_dialog->soundLabel->setEnabled( soundEffect );
00291 m_dialog->soundRequester->setEnabled( soundEffect );
00292
00293 if ( !m_dialog->soundRequester->url().isEmpty() ) {
00294 m_dialog->playButton->setEnabled( soundEffect );
00295 m_dialog->stopButton->setEnabled( soundEffect );
00296 }
00297 else {
00298 m_dialog->playButton->setEnabled( false );
00299 m_dialog->stopButton->setEnabled( false );
00300 }
00301 }
00302
00303
00304 void KPrSlideTransitionDia::slotSoundFileChanged( const QString& text )
00305 {
00306 m_dialog->playButton->setEnabled( !text.isEmpty() );
00307 m_dialog->stopButton->setEnabled( !text.isEmpty() );
00308 }
00309
00310
00311 void KPrSlideTransitionDia::slotOk()
00312 {
00313 apply( false );
00314 }
00315
00316
00317 void KPrSlideTransitionDia::slotUser1()
00318 {
00319 apply( true );
00320 }
00321
00322
00323 void KPrSlideTransitionDia::apply( bool global )
00324 {
00325 PageEffect effect = static_cast<PageEffect>( m_dialog->effectCombo->currentItem() );
00326 if ( m_dialog->effectCombo->currentText() == i18n( "Random Transition" ) )
00327 effect = PEF_RANDOM;
00328
00329 EffectSpeed effectSpeed = static_cast<EffectSpeed>( m_dialog->speedCombo->currentItem() );
00330 bool soundEffect = m_dialog->soundCheckBox->isChecked();
00331 QString soundFileName = m_dialog->soundRequester->url();
00332 int slideTime = m_dialog->automaticTransitionInput->value();
00333
00334 if ( effect != m_effect ||
00335 effectSpeed != m_effectSpeed ||
00336 soundEffect != m_soundEffect ||
00337 soundFileName != m_soundFileName ||
00338 slideTime != m_slideTime )
00339 {
00340 KPrTransEffectCmd::PageEffectSettings newSettings;
00341
00342 newSettings.pageEffect = effect;
00343 newSettings.effectSpeed = effectSpeed;
00344 newSettings.soundEffect = soundEffect;
00345 newSettings.soundFileName = soundFileName;
00346 newSettings.autoAdvance = false;
00347 newSettings.slideTime = slideTime;
00348
00349
00350 QValueVector<KPrTransEffectCmd::PageEffectSettings> oldSettings;
00351 KPrPage *page = 0;
00352 if ( global )
00353 {
00354 oldSettings.resize( m_view->kPresenterDoc()->getPageList().count() );
00355 int i = 0;
00356 for( QPtrListIterator<KPrPage> it( m_view->kPresenterDoc()->getPageList() ); *it; ++it, ++i )
00357 {
00358 oldSettings[i].pageEffect = it.current()->getPageEffect();
00359 oldSettings[i].effectSpeed = it.current()->getPageEffectSpeed();
00360 oldSettings[i].soundEffect = it.current()->getPageSoundEffect();
00361 oldSettings[i].soundFileName = it.current()->getPageSoundFileName();
00362 oldSettings[i].autoAdvance = false;
00363 oldSettings[i].slideTime = it.current()->getPageTimer();
00364 }
00365 }
00366 else
00367 {
00368 int pgnum = m_view->getCurrPgNum() - 1;
00369 page = m_view->kPresenterDoc()->pageList().at( pgnum );
00370 oldSettings.resize( 1 );
00371 oldSettings[0].pageEffect = page->getPageEffect();
00372 oldSettings[0].effectSpeed = page->getPageEffectSpeed();
00373 oldSettings[0].soundEffect = page->getPageSoundEffect();
00374 oldSettings[0].soundFileName = page->getPageSoundFileName();
00375 oldSettings[0].autoAdvance = false;
00376 oldSettings[0].slideTime = page->getPageTimer();
00377 }
00378 KPrTransEffectCmd *transEffectCmd = new KPrTransEffectCmd( oldSettings, newSettings,
00379 global ? 0 : page, m_view->kPresenterDoc() );
00380 transEffectCmd->execute();
00381 m_view->kPresenterDoc()->addCommand( transEffectCmd );
00382 }
00383
00384 accept();
00385 }
00386
00387
00388 void KPrSlideTransitionDia::playSound()
00389 {
00390 delete m_soundPlayer;
00391
00392 m_soundPlayer = new KPrSoundPlayer( m_dialog->soundRequester->url() );
00393 m_soundPlayer->play();
00394
00395 m_dialog->playButton->setEnabled( false );
00396 m_dialog->stopButton->setEnabled( true );
00397 }
00398
00399
00400 void KPrSlideTransitionDia::stopSound()
00401 {
00402 if ( m_soundPlayer ) {
00403 m_soundPlayer->stop();
00404 delete m_soundPlayer;
00405 m_soundPlayer = 0;
00406
00407 m_dialog->playButton->setEnabled( true );
00408 m_dialog->stopButton->setEnabled( false );
00409 }
00410 }
00411
00412
00413 #include "KPrSlideTransitionDia.moc"