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"