// -*- Mode: c++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 4; -*- /* This file is part of the KDE project Copyright (C) 1998, 1999 Reginald Stadlbauer <reggie@kde.org> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "KPrView.h" #include "KPrDocument.h" #include "KPrEffectDia.h" #include "KPrCommand.h" #include "KPrObject.h" #include "KPrSoundPlayer.h" #include <tqpushbutton.h> #include <tqcombobox.h> #include <tqlabel.h> #include <tqgroupbox.h> #include <tqcheckbox.h> #include <tqlineedit.h> #include <tqvaluelist.h> #include <tqlayout.h> #include <tqspinbox.h> #include <tqstringlist.h> #include <tqdir.h> #include <tqtooltip.h> #include <tqwhatsthis.h> #include <klocale.h> #include <kglobal.h> #include <kbuttonbox.h> #include <knuminput.h> #include <kurlrequester.h> #include <kurl.h> #include <kstandarddirs.h> #include <kfiledialog.h> KPrEffectDia::KPrEffectDia( TQWidget* parent, const char* name, const TQPtrList<KPrObject>& _objs, KPrView *_view ) : KDialogBase( parent, name, true ), objs( _objs ) { view = _view; KPrObject *obj = objs.at( 0 ); soundPlayer1 = 0; soundPlayer2 = 0; TQWidget *page = new TQWidget( this ); setMainWidget(page); topLayout = new TQVBoxLayout( page, 0, spacingHint() ); TQGroupBox *grp1 = new TQGroupBox(0, Qt::Vertical, i18n( "Appear" ), page ); grp1->layout()->setSpacing(KDialog::spacingHint()); grp1->layout()->setMargin(KDialog::marginHint()); topLayout->addWidget(grp1); TQGridLayout *upperRow = new TQGridLayout(grp1->layout(), 6, 4); lAppear = new TQLabel( i18n( "Order of appearance:" ), grp1 ); lAppear->setAlignment( AlignVCenter ); upperRow->addWidget(lAppear, 0, 0); eAppearStep = new TQSpinBox( 0, 100, 1, grp1 ); eAppearStep->setValue( obj->getAppearStep() ); upperRow->addWidget(eAppearStep, 0, 1); //( void )new TQWidget( grp1 ); //( void )new TQWidget( grp1 ); lEffect = new TQLabel( i18n( "Effect (appearing):" ), grp1 ); lEffect->setAlignment( AlignVCenter ); upperRow->addWidget(lEffect, 1, 0); cEffect = new TQComboBox( false, grp1, "cEffect" ); cEffect->insertItem( i18n( "No Effect" ) ); cEffect->insertItem( i18n( "Come From Right" ) ); cEffect->insertItem( i18n( "Come From Left" ) ); cEffect->insertItem( i18n( "Come From Top" ) ); cEffect->insertItem( i18n( "Come From Bottom" ) ); cEffect->insertItem( i18n( "Come From Right/Top" ) ); cEffect->insertItem( i18n( "Come From Right/Bottom" ) ); cEffect->insertItem( i18n( "Come From Left/Top" ) ); cEffect->insertItem( i18n( "Come From Left/Bottom" ) ); cEffect->insertItem( i18n( "Wipe From Left" ) ); cEffect->insertItem( i18n( "Wipe From Right" ) ); cEffect->insertItem( i18n( "Wipe From Top" ) ); cEffect->insertItem( i18n( "Wipe From Bottom" ) ); cEffect->setCurrentItem( static_cast<int>( obj->getEffect() ) ); upperRow->addWidget(cEffect, 1, 1); connect( cEffect, TQT_SIGNAL( activated( int ) ), this, TQT_SLOT( appearEffectChanged( int ) ) ); lAppearSpeed = new TQLabel( i18n( "Speed:" ), grp1 ); lAppearSpeed->setAlignment( AlignVCenter ); upperRow->addWidget(lAppearSpeed, 2, 0); cAppearSpeed = new TQComboBox( false, grp1, "cEffect" ); cAppearSpeed->insertItem( i18n( "Slow" ) ); cAppearSpeed->insertItem( i18n( "Medium" ) ); cAppearSpeed->insertItem( i18n( "Fast" ) ); cAppearSpeed->setCurrentItem( static_cast<int>( obj->getAppearSpeed() ) ); upperRow->addWidget(cAppearSpeed, 2, 1); appearEffectChanged( cEffect->currentItem() ); lEffect2 = new TQLabel( i18n( "Effect (object specific):" ), grp1 ); lEffect2->setAlignment( AlignVCenter ); upperRow->addWidget(lEffect2, 3, 0); cEffect2 = new TQComboBox( false, grp1, "cEffect2" ); cEffect2->insertItem( i18n( "No Effect" ) ); upperRow->addWidget(cEffect2, 3, 1); switch ( obj->getType() ) { case OT_TEXT: { cEffect2->insertItem( i18n( "Paragraph After Paragraph" ) ); } break; default: lEffect2->setEnabled(false); cEffect2->setEnabled(false); break; } if ( obj->getEffect2() == EF2_NONE ) cEffect2->setCurrentItem( static_cast<int>( obj->getEffect2() ) ); else { switch ( obj->getType() ) { case OT_TEXT: cEffect2->setCurrentItem( static_cast<int>( obj->getEffect2() + TxtObjOffset ) ); break; default: break; } } TQLabel *lTimerOfAppear = new TQLabel( i18n( "Timer of the object:" ), grp1 ); lTimerOfAppear->setAlignment( AlignVCenter ); upperRow->addWidget( lTimerOfAppear, 4, 0 ); timerOfAppear = new KIntNumInput( obj->getAppearTimer(), grp1 ); timerOfAppear->setRange( 1, 600, 1 ); timerOfAppear->setSuffix( i18n( " seconds" ) ); upperRow->addWidget( timerOfAppear, 4, 1 ); if ( view->kPresenterDoc()->spManualSwitch() ) timerOfAppear->setEnabled( false ); // setup the Sound Effect stuff appearSoundEffect = new TQCheckBox( i18n( "Sound effect" ), grp1 ); appearSoundEffect->setChecked( obj->getAppearSoundEffect() ); upperRow->addWidget( appearSoundEffect, 5, 0 ); connect( appearSoundEffect, TQT_SIGNAL( clicked() ), this, TQT_SLOT( appearSoundEffectChanged() ) ); lSoundEffect1 = new TQLabel( i18n( "File name:" ), grp1 ); lSoundEffect1->setAlignment( AlignVCenter ); upperRow->addWidget( lSoundEffect1, 6, 0 ); requester1 = new KURLRequester( grp1 ); requester1->setURL( obj->getAppearSoundEffectFileName() ); upperRow->addWidget( requester1, 6, 1 ); connect( requester1, TQT_SIGNAL( openFileDialog( KURLRequester * ) ), this, TQT_SLOT( slotRequesterClicked( KURLRequester * ) ) ); connect( requester1, TQT_SIGNAL( textChanged( const TQString& ) ), this, TQT_SLOT( slotAppearFileChanged( const TQString& ) ) ); buttonTestPlaySoundEffect1 = new TQPushButton( grp1 ); buttonTestPlaySoundEffect1->setIconSet( SmallIconSet("1rightarrow") ); TQToolTip::add( buttonTestPlaySoundEffect1, i18n("Play") ); upperRow->addWidget( buttonTestPlaySoundEffect1, 6, 2 ); connect( buttonTestPlaySoundEffect1, TQT_SIGNAL( clicked() ), this, TQT_SLOT( playSound1() ) ); buttonTestStopSoundEffect1 = new TQPushButton( grp1 ); buttonTestStopSoundEffect1->setIconSet( SmallIconSet("player_stop") ); TQToolTip::add( buttonTestStopSoundEffect1, i18n("Stop") ); upperRow->addWidget( buttonTestStopSoundEffect1, 6, 3 ); connect( buttonTestStopSoundEffect1, TQT_SIGNAL( clicked() ), this, TQT_SLOT( stopSound1() ) ); disappear = new TQCheckBox( i18n( "Disappear" ), page ); disappear->setChecked( obj->getDisappear() ); topLayout->addWidget(disappear); TQGroupBox *grp2 = new TQGroupBox(0, Qt::Vertical, i18n( "Disappear" ), page); grp2->layout()->setSpacing(KDialog::spacingHint()); grp2->layout()->setMargin(KDialog::marginHint()); topLayout->addWidget(grp2); TQGridLayout *lowerRow = new TQGridLayout(grp2->layout(), 5, 4); lDisappear = new TQLabel( i18n( "Order of disappearance:" ), grp2 ); lDisappear->setAlignment( AlignVCenter ); lowerRow->addWidget(lDisappear, 0, 0); eDisappearStep = new TQSpinBox( 0, 100, 1, grp2 ); eDisappearStep->setValue( obj->getDisappearStep() ); lowerRow->addWidget(eDisappearStep, 0, 1); lDEffect = new TQLabel( i18n( "Effect (disappearing):" ), grp2 ); lDEffect->setAlignment( AlignVCenter ); lowerRow->addWidget(lDEffect, 1, 0); cDisappear = new TQComboBox( false, grp2, "cDisappear" ); cDisappear->insertItem( i18n( "No Effect" ) ); cDisappear->insertItem( i18n( "Disappear to Right" ) ); cDisappear->insertItem( i18n( "Disappear to Left" ) ); cDisappear->insertItem( i18n( "Disappear to Top" ) ); cDisappear->insertItem( i18n( "Disappear to Bottom" ) ); cDisappear->insertItem( i18n( "Disappear to Right/Top" ) ); cDisappear->insertItem( i18n( "Disappear to Right/Bottom" ) ); cDisappear->insertItem( i18n( "Disappear to Left/Top" ) ); cDisappear->insertItem( i18n( "Disappear to Left/Bottom" ) ); cDisappear->insertItem( i18n( "Wipe to Left" ) ); cDisappear->insertItem( i18n( "Wipe to Right" ) ); cDisappear->insertItem( i18n( "Wipe to Top" ) ); cDisappear->insertItem( i18n( "Wipe to Bottom" ) ); cDisappear->setCurrentItem( static_cast<int>( obj->getEffect3() ) ); lowerRow->addWidget(cDisappear, 1, 1); connect( cDisappear, TQT_SIGNAL( activated( int ) ), this, TQT_SLOT( disappearEffectChanged( int ) ) ); lDisappearSpeed = new TQLabel( i18n( "Speed:" ), grp2 ); lDisappearSpeed->setAlignment( AlignVCenter ); lowerRow->addWidget(lDisappearSpeed, 2, 0); cDisappearSpeed = new TQComboBox( false, grp2, "cEffect" ); cDisappearSpeed->insertItem( i18n( "Slow" ) ); cDisappearSpeed->insertItem( i18n( "Medium" ) ); cDisappearSpeed->insertItem( i18n( "Fast" ) ); cDisappearSpeed->setCurrentItem( static_cast<int>( obj->getDisappearSpeed() ) ); lowerRow->addWidget(cDisappearSpeed, 2, 1); //appearEffectChanged( cEffect->currentItem() ); TQLabel *lTimerOfDisappear = new TQLabel( i18n( "Timer of the object:" ), grp2 ); lTimerOfDisappear->setAlignment( AlignVCenter ); lowerRow->addWidget( lTimerOfDisappear, 3, 0 ); timerOfDisappear = new KIntNumInput( obj->getDisappearTimer(), grp2 ); timerOfDisappear->setRange( 1, 600, 1 ); timerOfDisappear->setSuffix( i18n( " seconds" ) ); lowerRow->addWidget( timerOfDisappear, 3, 1 ); if ( view->kPresenterDoc()->spManualSwitch() ) timerOfDisappear->setEnabled( false ); // setup the Sound Effect stuff disappearSoundEffect = new TQCheckBox( i18n( "Sound effect" ), grp2 ); disappearSoundEffect->setChecked( obj->getDisappearSoundEffect() ); lowerRow->addWidget( disappearSoundEffect, 4, 0 ); disappearSoundEffect->setEnabled( disappear->isChecked() ); connect( disappearSoundEffect, TQT_SIGNAL( clicked() ), this, TQT_SLOT( disappearSoundEffectChanged() ) ); lSoundEffect2 = new TQLabel( i18n( "File name:" ), grp2 ); lSoundEffect2->setAlignment( AlignVCenter ); lowerRow->addWidget( lSoundEffect2, 5, 0 ); requester2 = new KURLRequester( grp2 ); requester2->setURL( obj->getDisappearSoundEffectFileName() ); lowerRow->addWidget( requester2, 5, 1 ); connect( requester2, TQT_SIGNAL( openFileDialog( KURLRequester * ) ), this, TQT_SLOT( slotRequesterClicked( KURLRequester * ) ) ); connect( requester2, TQT_SIGNAL( textChanged( const TQString& ) ), this, TQT_SLOT( slotDisappearFileChanged( const TQString& ) ) ); buttonTestPlaySoundEffect2 = new TQPushButton( grp2 ); buttonTestPlaySoundEffect2->setIconSet( SmallIconSet("1rightarrow") ); TQToolTip::add( buttonTestPlaySoundEffect2, i18n("Play") ); lowerRow->addWidget( buttonTestPlaySoundEffect2, 5, 2 ); connect( buttonTestPlaySoundEffect2, TQT_SIGNAL( clicked() ), this, TQT_SLOT( playSound2() ) ); buttonTestStopSoundEffect2 = new TQPushButton( grp2 ); buttonTestStopSoundEffect2->setIconSet( SmallIconSet("player_stop") ); TQToolTip::add( buttonTestStopSoundEffect2, i18n("Stop") ); lowerRow->addWidget( buttonTestStopSoundEffect2, 5, 3 ); connect( buttonTestStopSoundEffect2, TQT_SIGNAL( clicked() ), this, TQT_SLOT( stopSound2() ) ); topLayout->activate(); connect( this, TQT_SIGNAL( okClicked() ), this, TQT_SLOT( slotEffectDiaOk() ) ); connect( this, TQT_SIGNAL( okClicked() ), this, TQT_SLOT( accept() ) ); connect( disappear, TQT_SIGNAL( clicked() ), this, TQT_SLOT( disappearChanged() ) ); disappearChanged(); appearSoundEffectChanged(); } KPrEffectDia::~KPrEffectDia() { stopSound1(); stopSound2(); delete soundPlayer1; delete soundPlayer2; } void KPrEffectDia::slotEffectDiaOk() { TQValueList<KPrEffectCmd::EffectStruct> oldEffects; for ( unsigned int i = 0; i < objs.count(); ++i ) { KPrObject *o = objs.at( i ); KPrEffectCmd::EffectStruct e; e.appearStep = o->getAppearStep(); e.disappearStep = o->getDisappearStep(); e.effect = o->getEffect(); e.effect2 = o->getEffect2(); e.effect3 = o->getEffect3(); e.m_appearSpeed = o->getAppearSpeed(); e.m_disappearSpeed = o->getDisappearSpeed(); e.disappear = o->getDisappear(); e.appearTimer = o->getAppearTimer(); e.disappearTimer = o->getDisappearTimer(); e.appearSoundEffect = o->getAppearSoundEffect(); e.disappearSoundEffect = o->getDisappearSoundEffect(); e.a_fileName = o->getAppearSoundEffectFileName(); e.d_fileName = o->getDisappearSoundEffectFileName(); oldEffects << e; } KPrEffectCmd::EffectStruct eff; eff.appearStep = eAppearStep->value(); eff.disappearStep = eDisappearStep->value(); eff.effect = ( Effect )cEffect->currentItem(); eff.effect2 = ( Effect2 )cEffect2->currentItem(); eff.effect3 = ( Effect3 )cDisappear->currentItem(); eff.m_appearSpeed = ( EffectSpeed )cAppearSpeed->currentItem(); eff.m_disappearSpeed = ( EffectSpeed )cDisappearSpeed->currentItem(); eff.disappear = disappear->isChecked(); eff.appearTimer = timerOfAppear->value(); eff.disappearTimer = timerOfDisappear->value(); eff.appearSoundEffect = (requester1->url().isEmpty() ? false : appearSoundEffect->isChecked()); eff.disappearSoundEffect = (requester2->url().isEmpty() ? false : disappearSoundEffect->isChecked()); eff.a_fileName = requester1->url(); eff.d_fileName = requester2->url(); KPrEffectCmd *effectCmd = new KPrEffectCmd( i18n( "Assign Object Effects" ), objs, oldEffects, eff ); effectCmd->execute(); view->kPresenterDoc()->addCommand( effectCmd ); accept(); } void KPrEffectDia::resizeEvent( TQResizeEvent *e ) { TQDialog::resizeEvent( e ); //topLayout->resize( size() ); } void KPrEffectDia::disappearChanged() { cDisappear->setEnabled( disappear->isChecked() ); eDisappearStep->setEnabled( disappear->isChecked() ); disappearSoundEffect->setEnabled( disappear->isChecked() ); disappearSoundEffectChanged(); disappearEffectChanged( cDisappear->currentItem() ); if ( !view->kPresenterDoc()->spManualSwitch() ) timerOfDisappear->setEnabled( disappear->isChecked() ); } void KPrEffectDia::appearEffectChanged( int /*num*/ ) { bool b = ( cEffect->currentItem() != 0 ); lAppearSpeed->setEnabled( b ); cAppearSpeed->setEnabled( b ); } void KPrEffectDia::disappearEffectChanged( int /*num*/ ) { bool b = ( cDisappear->currentItem() !=0 && disappear->isChecked() ); lDisappearSpeed->setEnabled( b ); cDisappearSpeed->setEnabled( b ); } void KPrEffectDia::appearSoundEffectChanged() { lSoundEffect1->setEnabled( appearSoundEffect->isChecked() ); requester1->setEnabled( appearSoundEffect->isChecked() ); if ( !requester1->url().isEmpty() ) { buttonTestPlaySoundEffect1->setEnabled( appearSoundEffect->isChecked() ); buttonTestStopSoundEffect1->setEnabled( appearSoundEffect->isChecked() ); } else { buttonTestPlaySoundEffect1->setEnabled( false ); buttonTestStopSoundEffect1->setEnabled( false ); } } void KPrEffectDia::disappearSoundEffectChanged() { lSoundEffect2->setEnabled( disappear->isChecked() && disappearSoundEffect->isChecked() ); requester2->setEnabled( disappear->isChecked() && disappearSoundEffect->isChecked() ); if ( !requester2->url().isEmpty() ) { buttonTestPlaySoundEffect2->setEnabled( disappear->isChecked() && disappearSoundEffect->isChecked() ); buttonTestStopSoundEffect2->setEnabled( disappear->isChecked() && disappearSoundEffect->isChecked() ); } else { buttonTestPlaySoundEffect2->setEnabled( false ); buttonTestStopSoundEffect2->setEnabled( false ); } } void KPrEffectDia::slotRequesterClicked( KURLRequester *requester ) { TQString filter = getSoundFileFilter(); requester->fileDialog()->setFilter( filter ); // find the first "sound"-resource that contains files TQStringList soundDirs = KGlobal::dirs()->resourceDirs( "sound" ); if ( !soundDirs.isEmpty() ) { KURL soundURL; TQDir dir; dir.setFilter( TQDir::Files | TQDir::Readable ); TQStringList::ConstIterator it = soundDirs.begin(); while ( it != soundDirs.end() ) { dir = *it; if ( dir.isReadable() && dir.count() > 2 ) { soundURL.setPath( *it ); requester->fileDialog()->setURL( soundURL ); break; } ++it; } } } void KPrEffectDia::slotAppearFileChanged( const TQString &text ) { buttonTestPlaySoundEffect1->setEnabled( !text.isEmpty() ); buttonTestStopSoundEffect1->setEnabled( !text.isEmpty() ); } void KPrEffectDia::slotDisappearFileChanged( const TQString &text ) { buttonTestPlaySoundEffect2->setEnabled( !text.isEmpty() ); buttonTestStopSoundEffect2->setEnabled( !text.isEmpty() ); } void KPrEffectDia::playSound1() { delete soundPlayer1; soundPlayer1 = new KPrSoundPlayer( requester1->url() ); soundPlayer1->play(); buttonTestPlaySoundEffect1->setEnabled( false ); buttonTestStopSoundEffect1->setEnabled( true ); } void KPrEffectDia::playSound2() { delete soundPlayer2; soundPlayer2 = new KPrSoundPlayer( requester2->url() ); soundPlayer2->play(); buttonTestPlaySoundEffect2->setEnabled( false ); buttonTestStopSoundEffect2->setEnabled( true ); } void KPrEffectDia::stopSound1() { if ( soundPlayer1 ) { soundPlayer1->stop(); delete soundPlayer1; soundPlayer1 = 0; buttonTestPlaySoundEffect1->setEnabled( true ); buttonTestStopSoundEffect1->setEnabled( false ); } } void KPrEffectDia::stopSound2() { if ( soundPlayer2 ) { soundPlayer2->stop(); delete soundPlayer2; soundPlayer2 = 0; buttonTestPlaySoundEffect2->setEnabled( true ); buttonTestStopSoundEffect2->setEnabled( false ); } } TQString KPrEffectDia::getSoundFileFilter() const { TQStringList fileList; fileList << "wav" << "au" << "mp3" << "mp1" << "mp2" << "mpg" << "dat" << "mpeg" << "ogg" << "cdda" << "cda " << "vcd" << "null"; fileList.sort(); bool comma = false; TQString full, str; for ( TQStringList::ConstIterator it = fileList.begin(); it != fileList.end(); ++it ) { if ( comma ) str += '\n'; comma = true; str += TQString( i18n( "*.%1|%2 Files" ) ).arg( *it ).arg( (*it).upper() ); full += TQString( "*.") + (*it) + ' '; } str = full + '|' + i18n( "All Supported Files" ) + '\n' + str; str += "\n*|" + i18n( "All Files" ); return str; } #include "KPrEffectDia.moc"