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