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"