kpresenter

KPrSlideTransitionDia.cpp

00001 // -*- Mode: c++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 4; -*-
00002 /* This file is part of the KDE project
00003    Copyright (C) 2002 Ariya Hidayat <ariya@kde.org>
00004    Copyright (C) 2004 Thorsten Zachmann <zachmann@kde.org>
00005 
00006    This library is free software; you can redistribute it and/or
00007    modify it under the terms of the GNU Library General Public
00008    License as published by the Free Software Foundation; either
00009    version 2 of the License, or (at your option) any later version.
00010 
00011    This library is distributed in the hope that it will be useful,
00012    but WITHOUT ANY WARRANTY; without even the implied warranty of
00013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014    Library General Public License for more details.
00015 
00016    You should have received a copy of the GNU Library General Public License
00017    along with this library; see the file COPYING.LIB.  If not, write to
00018    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00019  * Boston, MA 02110-1301, USA.
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     // draw preview pix
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     // fill effect combo
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     //TODO change the strings to use Down instead of Bottome to make them consistent
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     // workaround, because Random Effect is always negative
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     // setup speed combo
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     // set up sound
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     // set up automatic tansition
00157     m_dialog->automaticTransitionInput->setRange( 1, 600, 1 );
00158     m_dialog->automaticTransitionInput->setValue( m_slideTime );
00159 
00160     // set up preview button
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     // find the first "sound"-resource that contains files
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 = /*TODO */ false;
00347         newSettings.slideTime = slideTime;
00348 
00349         // Collect info about current settings
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 = /*TODO it.current()->getAutoAdvance() */ 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 = /*TODO page->getAutoAdvance() */ 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"
KDE Home | KDE Accessibility Home | Description of Access Keys