1 /*
2     SPDX-FileCopyrightText: 1998-2009 Sebastian Trueg <trueg@k3b.org>
3     SPDX-License-Identifier: GPL-2.0-or-later
4 */
5 #include "k3bmixedburndialog.h"
6 #include "k3bmixeddoc.h"
7 #include "k3bmixedview.h"
8 
9 #include "k3bdataimagesettingswidget.h"
10 #include "k3bdatadoc.h"
11 #include "k3baudiodoc.h"
12 #include "k3bdevice.h"
13 #include "k3bwriterselectionwidget.h"
14 #include "k3btempdirselectionwidget.h"
15 #include "k3bisooptions.h"
16 #include "k3bglobals.h"
17 #include "k3baudiocdtextwidget.h"
18 #include "k3bdatamodewidget.h"
19 #include "k3bmsf.h"
20 #include "k3bstdguiitems.h"
21 #include "k3bwritingmodewidget.h"
22 #include "k3bexternalbinmanager.h"
23 #include "k3bversion.h"
24 #include "k3bcore.h"
25 #include "k3bintmapcombobox.h"
26 
27 #include <KConfig>
28 #include <KLocalizedString>
29 #include <KMessageBox>
30 
31 #include <QDebug>
32 #include <QVariant>
33 #include <QCheckBox>
34 #include <QGridLayout>
35 #include <QGroupBox>
36 #include <QLabel>
37 #include <QLayout>
38 #include <QLineEdit>
39 #include <QPushButton>
40 #include <QRadioButton>
41 #include <QTabWidget>
42 #include <QToolButton>
43 #include <QToolTip>
44 
45 
MixedBurnDialog(K3b::MixedDoc * doc,QWidget * parent)46 K3b::MixedBurnDialog::MixedBurnDialog( K3b::MixedDoc* doc, QWidget *parent )
47     : K3b::ProjectBurnDialog( doc, parent ),
48       m_doc(doc)
49 {
50     prepareGui();
51 
52     setTitle( i18n("Mixed Project"), i18np("1 track (%2 minutes)",
53                                            "%1 tracks (%2 minutes)",
54                                            m_doc->numOfTracks(),m_doc->length().toString()) );
55 
56     m_checkOnlyCreateImage->hide();
57 
58     // create cd-text page
59     m_cdtextWidget = new K3b::AudioCdTextWidget( this );
60     addPage( m_cdtextWidget, i18n("CD-Text") );
61 
62     // create image settings tab
63     m_imageSettingsWidget = new K3b::DataImageSettingsWidget( this );
64     addPage( m_imageSettingsWidget, i18n("Filesystem") );
65 
66     setupSettingsPage();
67 
68     QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding );
69     m_optionGroupLayout->addItem( spacer );
70 
71     connect( m_checkNormalize, SIGNAL(toggled(bool)), this, SLOT(slotNormalizeToggled(bool)) );
72     connect( m_checkCacheImage, SIGNAL(toggled(bool)), this, SLOT(slotCacheImageToggled(bool)) );
73     connect( m_writerSelectionWidget, SIGNAL(writingAppChanged(K3b::WritingApp)), this, SLOT(slotToggleAll()) );
74     connect( m_writingModeWidget, SIGNAL(writingModeChanged(WritingMode)), this, SLOT(slotToggleAll()) );
75 }
76 
77 
setupSettingsPage()78 void K3b::MixedBurnDialog::setupSettingsPage()
79 {
80     QWidget* w = new QWidget( this );
81 
82     QGroupBox* groupDataMode = new QGroupBox( i18n("Datatrack Mode"), w );
83     m_dataModeWidget = new K3b::DataModeWidget( groupDataMode );
84 
85     QGroupBox* groupNormalize = new QGroupBox( i18n("Misc"), w );
86     m_checkNormalize = K3b::StdGuiItems::normalizeCheckBox( groupNormalize );
87 
88     QGroupBox* groupMixedType = new QGroupBox( i18n("Mixed Mode Type"), w );
89     m_comboMixedModeType = new K3b::IntMapComboBox( groupMixedType );
90 
91     m_comboMixedModeType->insertItem( K3b::MixedDoc::DATA_SECOND_SESSION,
92                                       i18n("Data in second session (CD-Extra)"),
93                                       i18n("<em>Blue book CD</em>"
94                                            "<br>K3b will create a multisession CD with "
95                                            "2 sessions. The first session will contain all "
96                                            "audio tracks and the second session will contain "
97                                            "a mode 2 form 1 data track."
98                                            "<br>This mode is based on the <em>Blue book</em> "
99                                            "standard (also known as <em>Extended Audio CD</em>, "
100                                            "<em>CD-Extra</em>, or <em>CD Plus</em>) "
101                                            "and has the advantage that a hifi audio "
102                                            "CD player will only recognize the first session "
103                                            "and ignore the second session with the data track."
104                                            "<br>If the CD is intended to be used in a hifi audio CD player "
105                                            "this is the recommended mode."
106                                            "<br>Some older CD-ROMs may have problems reading "
107                                            "a blue book CD since it is a multisession CD.") );
108     m_comboMixedModeType->insertItem( K3b::MixedDoc::DATA_FIRST_TRACK,
109                                       i18n("Data in first track"),
110                                       i18n("K3b will write the data track before all "
111                                            "audio tracks.") );
112     m_comboMixedModeType->insertItem( K3b::MixedDoc::DATA_LAST_TRACK,
113                                       i18n("Data in last track"),
114                                       i18n("K3b will write the data track after all "
115                                            "audio tracks.") );
116     m_comboMixedModeType->addGlobalWhatsThisText( QString(),
117                                                   i18n("<b>Caution:</b> The last two modes should only be used for CDs that are unlikely to "
118                                                        "be played on a hifi audio CD player."
119                                                        "<br>It could lead to problems with some older "
120                                                        "hifi audio CD players that try to play the data track.") );
121 
122     QGridLayout* grid = new QGridLayout( w );
123     grid->addWidget( groupMixedType, 0, 0 );
124     grid->addWidget( groupDataMode, 1, 0 );
125     grid->addWidget( groupNormalize, 2, 0 );
126     grid->setRowStretch( 3, 1 );
127 
128     addPage( w, i18n("Misc") );
129 }
130 
131 
slotStartClicked()132 void K3b::MixedBurnDialog::slotStartClicked()
133 {
134     // FIXME: this should not be done via the doc. So remove all gui stuff from the doc
135 //  static_cast<K3b::MixedView*>(m_doc->view())->player()->stop();
136     K3b::ProjectBurnDialog::slotStartClicked();
137 }
138 
139 
saveSettingsToProject()140 void K3b::MixedBurnDialog::saveSettingsToProject()
141 {
142     K3b::ProjectBurnDialog::saveSettingsToProject();
143 
144     m_doc->setMixedType( (K3b::MixedDoc::MixedType)m_comboMixedModeType->selectedValue() );
145 
146     m_cdtextWidget->save( m_doc->audioDoc() );
147 
148     m_doc->audioDoc()->setNormalize( m_checkNormalize->isChecked() );
149 
150     // save iso image settings
151     K3b::IsoOptions o = m_doc->dataDoc()->isoOptions();
152     m_imageSettingsWidget->save( o );
153     m_doc->dataDoc()->setIsoOptions( o );
154 
155     m_doc->dataDoc()->setDataMode( m_dataModeWidget->dataMode() );
156 
157     // save image file path
158     m_doc->setTempDir( m_tempDirSelectionWidget->tempPath() );
159 }
160 
161 
readSettingsFromProject()162 void K3b::MixedBurnDialog::readSettingsFromProject()
163 {
164     K3b::ProjectBurnDialog::readSettingsFromProject();
165 
166     m_checkNormalize->setChecked( m_doc->audioDoc()->normalize() );
167 
168     if( !m_doc->tempDir().isEmpty() )
169         m_tempDirSelectionWidget->setTempPath( m_doc->tempDir() );
170 
171     m_comboMixedModeType->setSelectedValue( m_doc->mixedType() );
172 
173     m_cdtextWidget->load( m_doc->audioDoc() );
174 
175     m_imageSettingsWidget->load( m_doc->dataDoc()->isoOptions() );
176 
177     m_dataModeWidget->setDataMode( m_doc->dataDoc()->dataMode() );
178 
179     toggleAll();
180 }
181 
182 
loadSettings(const KConfigGroup & c)183 void K3b::MixedBurnDialog::loadSettings( const KConfigGroup& c )
184 {
185     K3b::ProjectBurnDialog::loadSettings( c );
186 
187     m_cdtextWidget->setChecked( c.readEntry( "cd_text", false ) );
188     m_checkNormalize->setChecked( c.readEntry( "normalize", false ) );
189 
190     // load mixed type
191     if( c.readEntry( "mixed_type" ) == "last_track" )
192         m_comboMixedModeType->setSelectedValue( K3b::MixedDoc::DATA_LAST_TRACK );
193     else if( c.readEntry( "mixed_type" ) == "first_track" )
194         m_comboMixedModeType->setSelectedValue( K3b::MixedDoc::DATA_FIRST_TRACK );
195     else
196         m_comboMixedModeType->setSelectedValue( K3b::MixedDoc::DATA_SECOND_SESSION );
197 
198     m_dataModeWidget->loadConfig(c);
199 
200     K3b::IsoOptions o = K3b::IsoOptions::load( c );
201     m_imageSettingsWidget->load( o );
202 
203     toggleAll();
204 }
205 
206 
saveSettings(KConfigGroup c)207 void K3b::MixedBurnDialog::saveSettings( KConfigGroup c )
208 {
209     K3b::ProjectBurnDialog::saveSettings(c);
210 
211     c.writeEntry( "cd_text", m_cdtextWidget->isChecked() );
212     c.writeEntry( "normalize", m_checkNormalize->isChecked() );
213 
214     // save mixed type
215     switch( m_comboMixedModeType->selectedValue() ) {
216     case K3b::MixedDoc::DATA_LAST_TRACK:
217         c.writeEntry( "mixed_type", "last_track" );
218         break;
219     case K3b::MixedDoc::DATA_FIRST_TRACK:
220         c.writeEntry( "mixed_type", "first_track" );
221         break;
222     default:
223         c.writeEntry( "mixed_type", "second_session" );
224     }
225 
226     m_dataModeWidget->saveConfig(c);
227 
228     K3b::IsoOptions o;
229     m_imageSettingsWidget->save( o );
230     o.save( c );
231 
232     if( m_tempDirSelectionWidget->isEnabled() ) {
233         m_tempDirSelectionWidget->saveConfig();
234     }
235 }
236 
237 
toggleAll()238 void K3b::MixedBurnDialog::toggleAll()
239 {
240     K3b::ProjectBurnDialog::toggleAll();
241 
242     bool cdrecordOnTheFly = false;
243     bool cdrecordCdText = false;
244     if ( k3bcore->externalBinManager()->binObject("cdrecord") ) {
245         cdrecordOnTheFly = k3bcore->externalBinManager()->binObject("cdrecord")->hasFeature( "audio-stdin" );
246         cdrecordCdText = k3bcore->externalBinManager()->binObject("cdrecord")->hasFeature( "cdtext" );
247     }
248 
249     // cdrdao always knows onthefly and cdtext
250     bool onTheFly = true;
251     bool cdText = true;
252     if( m_writingModeWidget->writingMode() == K3b::WritingModeTao ||
253         m_writingModeWidget->writingMode() == K3b::WritingModeRaw ||
254         m_writerSelectionWidget->writingApp() == K3b::WritingAppCdrecord ) {
255         onTheFly = cdrecordOnTheFly;
256         cdText = cdrecordCdText;
257     }
258 
259     m_checkCacheImage->setEnabled( !m_checkOnlyCreateImage->isChecked() &&
260                                    onTheFly );
261     if( !onTheFly )
262         m_checkCacheImage->setChecked( true );
263 
264     m_cdtextWidget->setEnabled( !m_checkOnlyCreateImage->isChecked() &&
265                                 cdText &&
266                                 m_writingModeWidget->writingMode() != K3b::WritingModeTao );
267     if( !cdText || m_writingModeWidget->writingMode() == K3b::WritingModeTao  )
268         m_cdtextWidget->setChecked( false );
269 }
270 
271 
slotNormalizeToggled(bool on)272 void K3b::MixedBurnDialog::slotNormalizeToggled( bool on )
273 {
274     if( on ) {
275         // we are not able to normalize in on-the-fly mode
276         if( !k3bcore->externalBinManager()->foundBin( "normalize" ) ) {
277             KMessageBox::sorry( this, i18n("<p><b>External program <em>normalize</em> is not installed.</b>"
278                                            "<p>K3b uses <em>normalize</em> (http://normalize.nongnu.org/) "
279                                            "to normalize audio tracks. In order to "
280                                            "use this functionality, please install it first.") );
281             m_checkNormalize->setChecked( false );
282         }
283         else if( !m_checkCacheImage->isChecked() && !m_checkOnlyCreateImage->isChecked() ) {
284             if( KMessageBox::warningYesNo( this, i18n("<p>K3b is not able to normalize audio tracks when burning on-the-fly. "
285                                                       "The external program used for this task only supports normalizing a set "
286                                                       "of audio files."),
287                                            QString(),
288                                            KGuiItem( i18n("Disable normalization") ),
289                                            KGuiItem( i18n("Disable on-the-fly burning") ),
290                                            "audioProjectNormalizeOrOnTheFly" ) == KMessageBox::Yes )
291                 m_checkNormalize->setChecked( false );
292             else
293                 m_checkCacheImage->setChecked( true );
294         }
295     }
296 }
297 
298 
slotCacheImageToggled(bool on)299 void K3b::MixedBurnDialog::slotCacheImageToggled( bool on )
300 {
301     if( on ) {
302         if( m_checkNormalize->isChecked() ) {
303             if( KMessageBox::warningYesNo( this, i18n("<p>K3b is not able to normalize audio tracks when burning on-the-fly. "
304                                                       "The external program used for this task only supports normalizing a set "
305                                                       "of audio files."),
306                                            QString(),
307                                            KGuiItem( i18n("Disable normalization") ),
308                                            KGuiItem( i18n("Disable on-the-fly burning") ),
309                                            "audioProjectNormalizeOrOnTheFly" ) == KMessageBox::Yes )
310                 m_checkNormalize->setChecked( false );
311             else
312                 m_checkCacheImage->setChecked( true );
313         }
314     }
315 }
316 
317 
318 
319 
320