File indexing completed on 2024-04-28 04:50:20

0001 /*
0002     SPDX-FileCopyrightText: 2004-2009 Sebastian Trueg <trueg@k3b.org>
0003     SPDX-FileCopyrightText: 2009-2011 Michal Malek <michalm@jabster.pl>
0004     SPDX-FileCopyrightText: 1998-2009 Sebastian Trueg <trueg@k3b.org>
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008 
0009 #include "k3baudioconvertingoptionwidget.h"
0010 
0011 #include "k3bpluginmanager.h"
0012 #include "k3baudioencoder.h"
0013 #include "k3bcore.h"
0014 
0015 #include <KComboBox>
0016 #include <KConfig>
0017 #include <KConfigGroup>
0018 #include <KColorScheme>
0019 #include <KLocalizedString>
0020 #include <KUrlRequester>
0021 #include <KIconLoader>
0022 
0023 #include <QCheckBox>
0024 #include <QLabel>
0025 #include <QList>
0026 #include <QStandardPaths>
0027 #include <QTimer>
0028 #include <QToolButton>
0029 #include <QStorageInfo>
0030 
0031 
0032 
0033 class K3b::AudioConvertingOptionWidget::Private
0034 {
0035 public:
0036     QList<AudioEncoder*> encoders;
0037     QList<QString> extensions;
0038 
0039     QTimer freeSpaceUpdateTimer;
0040 
0041     qint64 neededSize;
0042     
0043     AudioEncoder* encoderForIndex( int index ) const;
0044     QString pluginNameForIndex( int index ) const;
0045     QString extForIndex( int index ) const;
0046     int indexForFileType( const QString& pluginName, const QString& ext ) const;
0047     
0048     QString defaultPluginName() const;
0049     QString defaultExtension() const;
0050 };
0051 
0052 
0053 K3b::AudioEncoder* K3b::AudioConvertingOptionWidget::Private::encoderForIndex( int index ) const
0054 {
0055     if( index >= 0 && index < encoders.size() )
0056         return encoders.at( index );
0057     else
0058         return 0;
0059 }
0060 
0061 
0062 QString K3b::AudioConvertingOptionWidget::Private::pluginNameForIndex( int index ) const
0063 {
0064     if( AudioEncoder* encoder = encoderForIndex( index ) )
0065         return encoder->pluginMetaData().pluginId();
0066     else
0067         return QString();
0068 }
0069 
0070 
0071 QString K3b::AudioConvertingOptionWidget::Private::extForIndex( int index ) const
0072 {
0073     if( index >= 0 && index < extensions.size() )
0074         return extensions.at( index );
0075     else
0076         return "wav";
0077 }
0078 
0079 
0080 int K3b::AudioConvertingOptionWidget::Private::indexForFileType( const QString& pluginName, const QString& ext ) const
0081 {
0082     if( pluginName.isEmpty() ) {
0083         int i = extensions.indexOf( ext );
0084         if( i >= 0 )
0085             return i;
0086     }
0087     
0088     for( int i = 0; i < encoders.size(); ++i ) {
0089         AudioEncoder* encoder = encoders.at( i );
0090         if( encoder != 0 &&
0091             encoder->pluginMetaData().pluginId() == pluginName &&
0092             extensions.at( i ) == ext ) {
0093             return i;
0094         }
0095     }
0096     return 0;
0097 }
0098 
0099 
0100 QString K3b::AudioConvertingOptionWidget::Private::defaultPluginName() const
0101 {
0102     QString defaultExt = defaultExtension();
0103     for( int i = 0; i < extensions.size(); ++i ) {
0104         AudioEncoder* encoder = encoders.at( i );
0105         if( extensions.at( i ) == defaultExt && encoder != 0 ) {
0106             return encoder->pluginMetaData().pluginId();
0107         }
0108     }
0109     return QString();
0110 }
0111 
0112 
0113 QString K3b::AudioConvertingOptionWidget::Private::defaultExtension() const
0114 {
0115     // we prefer formats in this order:
0116     // 1. ogg
0117     // 2. mp3
0118     // 3. flac
0119     // 4. wave
0120     bool ogg = false;
0121     bool mp3 = false;
0122     bool flac = false;
0123     Q_FOREACH( const QString& ext, extensions ) {
0124         if( ext == "ogg" )
0125             ogg = true;
0126         else if( ext == "mp3" )
0127             mp3 = true;
0128         else if( ext == "flac" )
0129             flac = true;
0130     }
0131     
0132     if( ogg )
0133         return "ogg";
0134     else if( mp3 )
0135         return "mp3";
0136     else if( flac )
0137         return "flac";
0138     else
0139         return "wav";
0140 }
0141 
0142 
0143 K3b::AudioConvertingOptionWidget::AudioConvertingOptionWidget( QWidget* parent )
0144     : QWidget( parent )
0145 {
0146     setupUi( this );
0147 
0148     d = new Private();
0149 
0150     connect( m_editBaseDir, SIGNAL(textChanged(QString)),
0151              this, SLOT(slotUpdateFreeTempSpace()) );
0152     connect( m_comboFileType, SIGNAL(activated(int)),
0153              this, SLOT(slotEncoderChanged()) );
0154     connect( &d->freeSpaceUpdateTimer, SIGNAL(timeout()),
0155              this, SLOT(slotUpdateFreeTempSpace()) );
0156     connect( m_checkCreatePlaylist, SIGNAL(toggled(bool)), this, SIGNAL(changed()) );
0157     connect( m_checkSingleFile, SIGNAL(toggled(bool)), this, SIGNAL(changed()) );
0158     connect( m_checkWriteCueFile, SIGNAL(toggled(bool)), this, SIGNAL(changed()) );
0159     connect( m_comboFileType, SIGNAL(activated(int)), this, SIGNAL(changed()) );
0160     connect( m_editBaseDir, SIGNAL(textChanged(QString)), this, SIGNAL(changed()) );
0161     connect( m_buttonConfigurePlugin, SIGNAL(clicked()), this, SLOT(slotConfigurePlugin()) );
0162 
0163     m_editBaseDir->setMode( KFile::Directory | KFile::ExistingOnly | KFile::LocalOnly );
0164     m_buttonConfigurePlugin->setIcon( QIcon::fromTheme( "configure" ) );
0165     
0166     // FIXME: see if sox and the sox encoder are installed and if so do not put the internal wave
0167     //        writer in the list of encoders.
0168     m_comboFileType->addItem( i18n("Wave") );
0169     d->encoders.append( 0 );
0170     d->extensions.append( "wav" );
0171 
0172     // check the available encoding plugins
0173     QList<K3b::Plugin*> fl = k3bcore->pluginManager()->plugins( "AudioEncoder" );
0174     for( QList<K3b::Plugin *>::const_iterator it = fl.constBegin(); it != fl.constEnd(); ++it ) {
0175         if( AudioEncoder* encoder = qobject_cast<AudioEncoder*>( *it ) ) {
0176             QStringList ext = encoder->extensions();
0177 
0178             for( QStringList::const_iterator exIt = ext.constBegin();
0179                 exIt != ext.constEnd(); ++exIt ) {
0180                 m_comboFileType->addItem( encoder->fileTypeComment(*exIt) );
0181                 d->encoders.append( encoder );
0182                 d->extensions.append( *exIt );
0183             }
0184         }
0185     }
0186 
0187     // refresh every 2 seconds
0188     d->freeSpaceUpdateTimer.start(2000);
0189     slotUpdateFreeTempSpace();
0190 }
0191 
0192 
0193 K3b::AudioConvertingOptionWidget::~AudioConvertingOptionWidget()
0194 {
0195     delete d;
0196 }
0197 
0198 
0199 QString K3b::AudioConvertingOptionWidget::baseDir() const
0200 {
0201     return m_editBaseDir->url().toLocalFile();
0202 }
0203 
0204 
0205 void K3b::AudioConvertingOptionWidget::setBaseDir( const QString& path )
0206 {
0207     m_editBaseDir->setUrl( QUrl::fromLocalFile( path ) );
0208 }
0209 
0210 
0211 void K3b::AudioConvertingOptionWidget::setNeededSize( KIO::filesize_t size )
0212 {
0213     d->neededSize = size;
0214     if( d->neededSize > 0 )
0215         m_labelNeededSpace->setText( KIO::convertSize( d->neededSize ) );
0216     else
0217         m_labelNeededSpace->setText( i18n("unknown") );
0218 
0219     slotUpdateFreeTempSpace();
0220 }
0221 
0222 
0223 void K3b::AudioConvertingOptionWidget::slotConfigurePlugin()
0224 {
0225     // 0 for wave
0226     if( AudioEncoder* enc = encoder() )
0227     {
0228         int ret = k3bcore->pluginManager()->execPluginDialog( enc, this );
0229         if( ret == QDialog::Accepted )
0230         {
0231             emit changed();
0232         }
0233     }
0234 }
0235 
0236 
0237 void K3b::AudioConvertingOptionWidget::slotUpdateFreeTempSpace()
0238 {
0239     KColorScheme::ForegroundRole textColor;
0240 
0241     const QStorageInfo diskInfo( m_editBaseDir->url().toLocalFile() );
0242     if( diskInfo.isValid() ) {
0243         m_labelFreeSpace->setText( KIO::convertSize(diskInfo.bytesFree()) );
0244 
0245         if( d->neededSize > diskInfo.bytesFree() )
0246             textColor = KColorScheme::NegativeText;
0247         else
0248             textColor = KColorScheme::NormalText;
0249     }
0250     else {
0251         m_labelFreeSpace->setText( i18n("unknown") );
0252         textColor = KColorScheme::NormalText;
0253     }
0254 
0255     QPalette pal( m_labelFreeSpace->palette() );
0256     pal.setBrush( QPalette::Disabled, QPalette::WindowText, KColorScheme( QPalette::Disabled, KColorScheme::Window ).foreground( textColor ) );
0257     pal.setBrush( QPalette::Active,   QPalette::WindowText, KColorScheme( QPalette::Active,   KColorScheme::Window ).foreground( textColor ) );
0258     pal.setBrush( QPalette::Inactive, QPalette::WindowText, KColorScheme( QPalette::Inactive, KColorScheme::Window ).foreground( textColor ) );
0259     pal.setBrush( QPalette::Normal,   QPalette::WindowText, KColorScheme( QPalette::Normal,   KColorScheme::Window ).foreground( textColor ) );
0260     m_labelFreeSpace->setPalette( pal );
0261 }
0262 
0263 
0264 void K3b::AudioConvertingOptionWidget::slotEncoderChanged()
0265 {
0266     if( Plugin* plugin = encoder() )
0267         m_buttonConfigurePlugin->setEnabled( k3bcore->pluginManager()->hasPluginDialog( plugin ) );
0268     else
0269         m_buttonConfigurePlugin->setEnabled( false );
0270 }
0271 
0272 
0273 K3b::AudioEncoder* K3b::AudioConvertingOptionWidget::encoder() const
0274 {
0275     return d->encoderForIndex( m_comboFileType->currentIndex() );  // 0 for wave
0276 }
0277 
0278 
0279 QString K3b::AudioConvertingOptionWidget::extension() const
0280 {
0281     return d->extForIndex( m_comboFileType->currentIndex() );
0282 }
0283 
0284 
0285 void K3b::AudioConvertingOptionWidget::loadConfig( const KConfigGroup& c )
0286 {
0287     m_editBaseDir->setUrl( QUrl::fromLocalFile( c.readEntry( "last ripping directory", QStandardPaths::writableLocation(QStandardPaths::MusicLocation) ) ) );
0288 
0289     m_checkSingleFile->setChecked( c.readEntry( "single_file", false ) );
0290     m_checkWriteCueFile->setChecked( c.readEntry( "write_cue_file", false ) );
0291 
0292     m_checkCreatePlaylist->setChecked( c.readEntry( "create_playlist", false ) );
0293     m_checkPlaylistRelative->setChecked( c.readEntry( "relative_path_in_playlist", false ) );
0294 
0295     QString encoder;
0296     QString filetype;
0297     if( c.hasKey( "encoder" ) && c.hasKey( "filetype" ) ) {
0298         encoder = c.readEntry( "encoder" );
0299         filetype = c.readEntry( "filetype" );
0300     }
0301     else {
0302         encoder = d->defaultPluginName();
0303         filetype = d->defaultExtension();
0304     }
0305     m_comboFileType->setCurrentIndex( d->indexForFileType( encoder, filetype ) );
0306 
0307     slotEncoderChanged();
0308 }
0309 
0310 
0311 void K3b::AudioConvertingOptionWidget::saveConfig( KConfigGroup c )
0312 {
0313     c.writePathEntry( "last ripping directory", m_editBaseDir->url().url() );
0314 
0315     c.writeEntry( "single_file", m_checkSingleFile->isChecked() );
0316     c.writeEntry( "write_cue_file", m_checkWriteCueFile->isChecked() );
0317 
0318     c.writeEntry( "create_playlist", m_checkCreatePlaylist->isChecked() );
0319     c.writeEntry( "relative_path_in_playlist", m_checkPlaylistRelative->isChecked() );
0320     
0321     c.writeEntry( "encoder", d->pluginNameForIndex( m_comboFileType->currentIndex() ) );
0322     c.writeEntry( "filetype", d->extForIndex( m_comboFileType->currentIndex() ) );
0323 }
0324 
0325 #include "moc_k3baudioconvertingoptionwidget.cpp"