File indexing completed on 2024-05-05 04:51:46

0001 /*
0002     SPDX-FileCopyrightText: 1998-2009 Sebastian Trueg <trueg@k3b.org>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 #include "k3bmixedburndialog.h"
0006 #include "k3bmixeddoc.h"
0007 #include "k3bmixedview.h"
0008 
0009 #include "k3bdataimagesettingswidget.h"
0010 #include "k3bdatadoc.h"
0011 #include "k3baudiodoc.h"
0012 #include "k3bdevice.h"
0013 #include "k3bwriterselectionwidget.h"
0014 #include "k3btempdirselectionwidget.h"
0015 #include "k3bisooptions.h"
0016 #include "k3bglobals.h"
0017 #include "k3baudiocdtextwidget.h"
0018 #include "k3bdatamodewidget.h"
0019 #include "k3bmsf.h"
0020 #include "k3bstdguiitems.h"
0021 #include "k3bwritingmodewidget.h"
0022 #include "k3bexternalbinmanager.h"
0023 #include "k3bversion.h"
0024 #include "k3bcore.h"
0025 #include "k3bintmapcombobox.h"
0026 
0027 #include <KConfig>
0028 #include <KLocalizedString>
0029 #include <KMessageBox>
0030 
0031 #include <QDebug>
0032 #include <QVariant>
0033 #include <QCheckBox>
0034 #include <QGridLayout>
0035 #include <QGroupBox>
0036 #include <QLabel>
0037 #include <QLayout>
0038 #include <QLineEdit>
0039 #include <QPushButton>
0040 #include <QRadioButton>
0041 #include <QTabWidget>
0042 #include <QToolButton>
0043 #include <QToolTip>
0044 
0045 
0046 K3b::MixedBurnDialog::MixedBurnDialog( K3b::MixedDoc* doc, QWidget *parent )
0047     : K3b::ProjectBurnDialog( doc, parent ),
0048       m_doc(doc)
0049 {
0050     prepareGui();
0051 
0052     setTitle( i18n("Mixed Project"), i18np("1 track (%2 minutes)",
0053                                            "%1 tracks (%2 minutes)",
0054                                            m_doc->numOfTracks(),m_doc->length().toString()) );
0055 
0056     m_checkOnlyCreateImage->hide();
0057 
0058     // create cd-text page
0059     m_cdtextWidget = new K3b::AudioCdTextWidget( this );
0060     addPage( m_cdtextWidget, i18n("CD-Text") );
0061 
0062     // create image settings tab
0063     m_imageSettingsWidget = new K3b::DataImageSettingsWidget( this );
0064     addPage( m_imageSettingsWidget, i18n("Filesystem") );
0065 
0066     setupSettingsPage();
0067 
0068     QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding );
0069     m_optionGroupLayout->addItem( spacer );
0070 
0071     connect( m_checkNormalize, SIGNAL(toggled(bool)), this, SLOT(slotNormalizeToggled(bool)) );
0072     connect( m_checkCacheImage, SIGNAL(toggled(bool)), this, SLOT(slotCacheImageToggled(bool)) );
0073     connect( m_writerSelectionWidget, SIGNAL(writingAppChanged(K3b::WritingApp)), this, SLOT(slotToggleAll()) );
0074     connect( m_writingModeWidget, SIGNAL(writingModeChanged(WritingMode)), this, SLOT(slotToggleAll()) );
0075 }
0076 
0077 
0078 void K3b::MixedBurnDialog::setupSettingsPage()
0079 {
0080     QWidget* w = new QWidget( this );
0081 
0082     QGroupBox* groupDataMode = new QGroupBox( i18n("Datatrack Mode"), w );
0083     m_dataModeWidget = new K3b::DataModeWidget( groupDataMode );
0084     QVBoxLayout* groupDataModeLayout = new QVBoxLayout( groupDataMode );
0085     groupDataModeLayout->addWidget( m_dataModeWidget );
0086 
0087     QGroupBox* groupNormalize = new QGroupBox( i18n("Misc"), w );
0088     m_checkNormalize = K3b::StdGuiItems::normalizeCheckBox( groupNormalize );
0089     QVBoxLayout* groupNormalizeLayout = new QVBoxLayout( groupNormalize );
0090     groupNormalizeLayout->addWidget( m_checkNormalize );
0091 
0092     QGroupBox* groupMixedType = new QGroupBox( i18n("Mixed Mode Type"), w );
0093     m_comboMixedModeType = new K3b::IntMapComboBox( groupMixedType );
0094     QVBoxLayout* groupMixedTypeLayout = new QVBoxLayout( groupMixedType );
0095     groupMixedTypeLayout->addWidget( m_comboMixedModeType );
0096 
0097     m_comboMixedModeType->insertItem( K3b::MixedDoc::DATA_SECOND_SESSION,
0098                                       i18n("Data in second session (CD-Extra)"),
0099                                       i18n("<em>Blue book CD</em>"
0100                                            "<br>K3b will create a multisession CD with "
0101                                            "2 sessions. The first session will contain all "
0102                                            "audio tracks and the second session will contain "
0103                                            "a mode 2 form 1 data track."
0104                                            "<br>This mode is based on the <em>Blue book</em> "
0105                                            "standard (also known as <em>Extended Audio CD</em>, "
0106                                            "<em>CD-Extra</em>, or <em>CD Plus</em>) "
0107                                            "and has the advantage that a hifi audio "
0108                                            "CD player will only recognize the first session "
0109                                            "and ignore the second session with the data track."
0110                                            "<br>If the CD is intended to be used in a hifi audio CD player "
0111                                            "this is the recommended mode."
0112                                            "<br>Some older CD-ROMs may have problems reading "
0113                                            "a blue book CD since it is a multisession CD.") );
0114     m_comboMixedModeType->insertItem( K3b::MixedDoc::DATA_FIRST_TRACK,
0115                                       i18n("Data in first track"),
0116                                       i18n("K3b will write the data track before all "
0117                                            "audio tracks.") );
0118     m_comboMixedModeType->insertItem( K3b::MixedDoc::DATA_LAST_TRACK,
0119                                       i18n("Data in last track"),
0120                                       i18n("K3b will write the data track after all "
0121                                            "audio tracks.") );
0122     m_comboMixedModeType->addGlobalWhatsThisText( QString(),
0123                                                   i18n("<b>Caution:</b> The last two modes should only be used for CDs that are unlikely to "
0124                                                        "be played on a hifi audio CD player."
0125                                                        "<br>It could lead to problems with some older "
0126                                                        "hifi audio CD players that try to play the data track.") );
0127 
0128     QGridLayout* grid = new QGridLayout( w );
0129     grid->addWidget( groupMixedType, 0, 0 );
0130     grid->addWidget( groupDataMode, 1, 0 );
0131     grid->addWidget( groupNormalize, 2, 0 );
0132     grid->setRowStretch( 3, 1 );
0133 
0134     addPage( w, i18n("Misc") );
0135 }
0136 
0137 
0138 void K3b::MixedBurnDialog::slotStartClicked()
0139 {
0140     // FIXME: this should not be done via the doc. So remove all gui stuff from the doc
0141 //  static_cast<K3b::MixedView*>(m_doc->view())->player()->stop();
0142     K3b::ProjectBurnDialog::slotStartClicked();
0143 }
0144 
0145 
0146 void K3b::MixedBurnDialog::saveSettingsToProject()
0147 {
0148     K3b::ProjectBurnDialog::saveSettingsToProject();
0149 
0150     m_doc->setMixedType( (K3b::MixedDoc::MixedType)m_comboMixedModeType->selectedValue() );
0151 
0152     m_cdtextWidget->save( m_doc->audioDoc() );
0153 
0154     m_doc->audioDoc()->setNormalize( m_checkNormalize->isChecked() );
0155 
0156     // save iso image settings
0157     K3b::IsoOptions o = m_doc->dataDoc()->isoOptions();
0158     m_imageSettingsWidget->save( o );
0159     m_doc->dataDoc()->setIsoOptions( o );
0160 
0161     m_doc->dataDoc()->setDataMode( m_dataModeWidget->dataMode() );
0162 
0163     // save image file path
0164     m_doc->setTempDir( m_tempDirSelectionWidget->tempPath() );
0165 }
0166 
0167 
0168 void K3b::MixedBurnDialog::readSettingsFromProject()
0169 {
0170     K3b::ProjectBurnDialog::readSettingsFromProject();
0171 
0172     m_checkNormalize->setChecked( m_doc->audioDoc()->normalize() );
0173 
0174     if( !m_doc->tempDir().isEmpty() )
0175         m_tempDirSelectionWidget->setTempPath( m_doc->tempDir() );
0176 
0177     m_comboMixedModeType->setSelectedValue( m_doc->mixedType() );
0178 
0179     m_cdtextWidget->load( m_doc->audioDoc() );
0180 
0181     m_imageSettingsWidget->load( m_doc->dataDoc()->isoOptions() );
0182 
0183     m_dataModeWidget->setDataMode( m_doc->dataDoc()->dataMode() );
0184 
0185     toggleAll();
0186 }
0187 
0188 
0189 void K3b::MixedBurnDialog::loadSettings( const KConfigGroup& c )
0190 {
0191     K3b::ProjectBurnDialog::loadSettings( c );
0192 
0193     m_cdtextWidget->setChecked( c.readEntry( "cd_text", false ) );
0194     m_checkNormalize->setChecked( c.readEntry( "normalize", false ) );
0195 
0196     // load mixed type
0197     if( c.readEntry( "mixed_type" ) == "last_track" )
0198         m_comboMixedModeType->setSelectedValue( K3b::MixedDoc::DATA_LAST_TRACK );
0199     else if( c.readEntry( "mixed_type" ) == "first_track" )
0200         m_comboMixedModeType->setSelectedValue( K3b::MixedDoc::DATA_FIRST_TRACK );
0201     else
0202         m_comboMixedModeType->setSelectedValue( K3b::MixedDoc::DATA_SECOND_SESSION );
0203 
0204     m_dataModeWidget->loadConfig(c);
0205 
0206     K3b::IsoOptions o = K3b::IsoOptions::load( c );
0207     m_imageSettingsWidget->load( o );
0208 
0209     toggleAll();
0210 }
0211 
0212 
0213 void K3b::MixedBurnDialog::saveSettings( KConfigGroup c )
0214 {
0215     K3b::ProjectBurnDialog::saveSettings(c);
0216 
0217     c.writeEntry( "cd_text", m_cdtextWidget->isChecked() );
0218     c.writeEntry( "normalize", m_checkNormalize->isChecked() );
0219 
0220     // save mixed type
0221     switch( m_comboMixedModeType->selectedValue() ) {
0222     case K3b::MixedDoc::DATA_LAST_TRACK:
0223         c.writeEntry( "mixed_type", "last_track" );
0224         break;
0225     case K3b::MixedDoc::DATA_FIRST_TRACK:
0226         c.writeEntry( "mixed_type", "first_track" );
0227         break;
0228     default:
0229         c.writeEntry( "mixed_type", "second_session" );
0230     }
0231 
0232     m_dataModeWidget->saveConfig(c);
0233 
0234     K3b::IsoOptions o;
0235     m_imageSettingsWidget->save( o );
0236     o.save( c );
0237 
0238     if( m_tempDirSelectionWidget->isEnabled() ) {
0239         m_tempDirSelectionWidget->saveConfig();
0240     }
0241 }
0242 
0243 
0244 void K3b::MixedBurnDialog::toggleAll()
0245 {
0246     K3b::ProjectBurnDialog::toggleAll();
0247 
0248     bool cdrecordOnTheFly = false;
0249     bool cdrecordCdText = false;
0250     const K3b::ExternalBin* cdrecordBin = k3bcore->externalBinManager()->binObject("cdrecord");
0251     if ( cdrecordBin ) {
0252         cdrecordOnTheFly = cdrecordBin->hasFeature( "audio-stdin" );
0253         cdrecordCdText = cdrecordBin->hasFeature( "cdtext" );
0254     }
0255 
0256     // cdrdao always knows onthefly and cdtext
0257     bool onTheFly = true;
0258     bool cdText = true;
0259     if( m_writingModeWidget->writingMode() == K3b::WritingModeTao ||
0260         m_writingModeWidget->writingMode() == K3b::WritingModeRaw ||
0261         m_writerSelectionWidget->writingApp() == K3b::WritingAppCdrecord ) {
0262         onTheFly = cdrecordOnTheFly;
0263         cdText = cdrecordCdText;
0264     }
0265 
0266     m_checkCacheImage->setEnabled( !m_checkOnlyCreateImage->isChecked() &&
0267                                    onTheFly );
0268     if( !onTheFly )
0269         m_checkCacheImage->setChecked( true );
0270 
0271     m_cdtextWidget->setEnabled( !m_checkOnlyCreateImage->isChecked() &&
0272                                 cdText &&
0273                                 m_writingModeWidget->writingMode() != K3b::WritingModeTao );
0274     if( !cdText || m_writingModeWidget->writingMode() == K3b::WritingModeTao  )
0275         m_cdtextWidget->setChecked( false );
0276 }
0277 
0278 
0279 void K3b::MixedBurnDialog::slotNormalizeToggled( bool on )
0280 {
0281     if( on ) {
0282         // we are not able to normalize in on-the-fly mode
0283         if( !k3bcore->externalBinManager()->foundBin( "normalize" ) ) {
0284             KMessageBox::error( this, i18n("<p><b>External program <em>normalize</em> is not installed.</b>"
0285                                            "<p>K3b uses <em>normalize</em> (http://normalize.nongnu.org/) "
0286                                            "to normalize audio tracks. In order to "
0287                                            "use this functionality, please install it first.") );
0288             m_checkNormalize->setChecked( false );
0289         }
0290         else if( !m_checkCacheImage->isChecked() && !m_checkOnlyCreateImage->isChecked() ) {
0291             if( KMessageBox::warningTwoActions( this, i18n("<p>K3b is not able to normalize audio tracks when burning on-the-fly. "
0292                                                            "The external program used for this task only supports normalizing a set "
0293                                                            "of audio files."),
0294                                                 QString(),
0295                                                 KGuiItem( i18n("Disable normalization") ),
0296                                                 KGuiItem( i18n("Disable on-the-fly burning") ),
0297                                                 "audioProjectNormalizeOrOnTheFly" ) == KMessageBox::PrimaryAction )
0298                 m_checkNormalize->setChecked( false );
0299             else
0300                 m_checkCacheImage->setChecked( true );
0301         }
0302     }
0303 }
0304 
0305 
0306 void K3b::MixedBurnDialog::slotCacheImageToggled( bool on )
0307 {
0308     if( on ) {
0309         if( m_checkNormalize->isChecked() ) {
0310             if( KMessageBox::warningTwoActions( this, i18n("<p>K3b is not able to normalize audio tracks when burning on-the-fly. "
0311                                                            "The external program used for this task only supports normalizing a set "
0312                                                            "of audio files."),
0313                                                 QString(),
0314                                                 KGuiItem( i18n("Disable normalization") ),
0315                                                 KGuiItem( i18n("Disable on-the-fly burning") ),
0316                                                 "audioProjectNormalizeOrOnTheFly" ) == KMessageBox::PrimaryAction )
0317                 m_checkNormalize->setChecked( false );
0318             else
0319                 m_checkCacheImage->setChecked( true );
0320         }
0321     }
0322 }
0323 
0324 #include "moc_k3bmixedburndialog.cpp"