You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
koffice/kpresenter/KPrEffectDia.cpp

529 lines
19 KiB

// -*- 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->tqlayout()->setSpacing(KDialog::spacingHint());
grp1->tqlayout()->setMargin(KDialog::marginHint());
topLayout->addWidget(grp1);
TQGridLayout *upperRow = new TQGridLayout(grp1->tqlayout(), 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->tqlayout()->setSpacing(KDialog::spacingHint());
grp2->tqlayout()->setMargin(KDialog::marginHint());
topLayout->addWidget(grp2);
TQGridLayout *lowerRow = new TQGridLayout(grp2->tqlayout(), 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" ) ).tqarg( *it ).tqarg( (*it).upper() );
full += TQString( "*.") + (*it) + ' ';
}
str = full + '|' + i18n( "All Supported Files" ) + '\n' + str;
str += "\n*|" + i18n( "All Files" );
return str;
}
#include "KPrEffectDia.moc"