File indexing completed on 2024-05-05 04:51:47
0001 /* 0002 SPDX-FileCopyrightText: 1998-2008 Sebastian Trueg <trueg@k3b.org> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 0008 #include "k3bprojectburndialog.h" 0009 #include "k3bdoc.h" 0010 #include "k3bburnprogressdialog.h" 0011 #include "k3bjob.h" 0012 #include "k3btempdirselectionwidget.h" 0013 #include "k3bwriterselectionwidget.h" 0014 #include "k3bstdguiitems.h" 0015 #include "k3bwritingmodewidget.h" 0016 #include "k3bapplication.h" 0017 #include "k3bmediacache.h" 0018 #include "k3bmedium.h" 0019 0020 #include "k3bdevice.h" 0021 #include "k3bdevicemanager.h" 0022 #include "k3bglobals.h" 0023 #include "k3bcore.h" 0024 0025 #include <QDir> 0026 #include <QString> 0027 #include <QPushButton> 0028 #include <QToolTip> 0029 0030 #include <KConfig> 0031 #include <KIconLoader> 0032 #include <KLocalizedString> 0033 #include <KMessageBox> 0034 #include <KGuiItem> 0035 #include <KStandardGuiItem> 0036 0037 #include <QDebug> 0038 #include <QLayout> 0039 #include <QWhatsThis> 0040 #include <QCheckBox> 0041 #include <QTabWidget> 0042 #include <QGroupBox> 0043 #include <QSpinBox> 0044 #include <QLabel> 0045 #include <QGridLayout> 0046 #include <QVBoxLayout> 0047 0048 0049 K3b::ProjectBurnDialog::ProjectBurnDialog( K3b::Doc* doc, QWidget *parent ) 0050 : K3b::InteractionDialog( parent, 0051 i18n("Project"), 0052 QString(), 0053 START_BUTTON|SAVE_BUTTON|CANCEL_BUTTON, 0054 START_BUTTON, 0055 "default " + doc->typeString() + " settings" ), 0056 m_writerSelectionWidget(0), 0057 m_tempDirSelectionWidget(0), 0058 m_imageTipText(i18n("Use the 'Image' tab to optionally adjust the path of the image.")) 0059 { 0060 m_doc = doc; 0061 0062 KGuiItem closeItem = KStandardGuiItem::close(); 0063 closeItem.setToolTip( i18n("Save Settings and close") ); 0064 closeItem.setWhatsThis( i18n("Saves the settings to the project and closes the dialog.") ); 0065 setButtonGui( SAVE_BUTTON, closeItem ); 0066 KGuiItem cancelItem = KStandardGuiItem::cancel(); 0067 cancelItem.setToolTip( i18n("Discard all changes and close") ); 0068 cancelItem.setWhatsThis( i18n("Discards all changes made in the dialog and closes it.") ); 0069 setButtonGui( CANCEL_BUTTON, cancelItem ); 0070 0071 m_job = 0; 0072 } 0073 0074 0075 K3b::ProjectBurnDialog::~ProjectBurnDialog(){ 0076 } 0077 0078 0079 void K3b::ProjectBurnDialog::init() 0080 { 0081 readSettingsFromProject(); 0082 // if( !m_writerSelectionWidget->writerDevice() ) 0083 // m_checkOnlyCreateImage->setChecked(true); 0084 } 0085 0086 0087 void K3b::ProjectBurnDialog::slotWriterChanged() 0088 { 0089 slotToggleAll(); 0090 } 0091 0092 0093 void K3b::ProjectBurnDialog::slotWritingAppChanged( K3b::WritingApp ) 0094 { 0095 slotToggleAll(); 0096 } 0097 0098 0099 void K3b::ProjectBurnDialog::toggleAll() 0100 { 0101 K3b::Device::Device* dev = m_writerSelectionWidget->writerDevice(); 0102 if( dev ) { 0103 K3b::Medium burnMedium = k3bappcore->mediaCache()->medium( dev ); 0104 0105 if( burnMedium.diskInfo().mediaType() & K3b::Device::MEDIA_DVD_PLUS_ALL ) { 0106 // no simulation support for DVD+R(W) 0107 m_checkSimulate->setChecked(false); 0108 m_checkSimulate->setEnabled(false); 0109 } 0110 else { 0111 m_checkSimulate->setEnabled(true); 0112 } 0113 0114 setButtonEnabled( START_BUTTON, true ); 0115 } 0116 else 0117 setButtonEnabled( START_BUTTON, false ); 0118 0119 m_writingModeWidget->determineSupportedModesFromMedium( dev ); 0120 0121 m_writingModeWidget->setDisabled( m_checkOnlyCreateImage->isChecked() ); 0122 m_checkSimulate->setDisabled( m_checkOnlyCreateImage->isChecked() ); 0123 m_checkCacheImage->setDisabled( m_checkOnlyCreateImage->isChecked() ); 0124 m_checkRemoveBufferFiles->setDisabled( m_checkOnlyCreateImage->isChecked() || !m_checkCacheImage->isChecked() ); 0125 if( m_checkOnlyCreateImage->isChecked() ) { 0126 m_checkRemoveBufferFiles->setChecked(false); 0127 setButtonEnabled( START_BUTTON, true ); 0128 } 0129 m_tempDirSelectionWidget->setDisabled( !m_checkCacheImage->isChecked() && !m_checkOnlyCreateImage->isChecked() ); 0130 m_writerSelectionWidget->setDisabled( m_checkOnlyCreateImage->isChecked() ); 0131 m_spinCopies->setDisabled( m_checkSimulate->isChecked() || m_checkOnlyCreateImage->isChecked() ); 0132 0133 // we only support DAO with cdrdao 0134 if( m_writerSelectionWidget->writingApp() == K3b::WritingAppCdrdao ) 0135 m_writingModeWidget->setSupportedModes( K3b::WritingModeSao ); 0136 0137 if( m_checkOnlyCreateImage->isChecked() ) 0138 setButtonText( START_BUTTON, 0139 i18n("Start"), 0140 i18n("Start the image creation") ); 0141 else 0142 setButtonText( START_BUTTON, i18n("Burn"), 0143 i18n("Start the burning process") ); 0144 } 0145 0146 0147 int K3b::ProjectBurnDialog::execBurnDialog( bool burn ) 0148 { 0149 if( burn && m_job == 0 ) { 0150 setButtonShown( START_BUTTON, true ); 0151 setDefaultButton( START_BUTTON ); 0152 } 0153 else { 0154 setButtonShown( START_BUTTON, false ); 0155 setDefaultButton( SAVE_BUTTON ); 0156 } 0157 0158 return K3b::InteractionDialog::exec(); 0159 } 0160 0161 0162 void K3b::ProjectBurnDialog::slotSaveClicked() 0163 { 0164 saveSettingsToProject(); 0165 done( Saved ); 0166 } 0167 0168 0169 void K3b::ProjectBurnDialog::slotCancelClicked() 0170 { 0171 done( Canceled ); 0172 } 0173 0174 0175 void K3b::ProjectBurnDialog::slotStartClicked() 0176 { 0177 saveSettingsToProject(); 0178 0179 if( m_tempDirSelectionWidget ) { 0180 if( !doc()->onTheFly() || doc()->onlyCreateImages() ) { 0181 // 0182 // check if the temp dir exists 0183 // 0184 QString tempDir = m_tempDirSelectionWidget->tempDirectory(); 0185 if( !QFile::exists( tempDir ) ) { 0186 if( KMessageBox::warningTwoActions( this, 0187 i18n("Image folder '%1' does not exist. Do you want K3b to create it?", tempDir ), 0188 i18n("Create folder?"), 0189 KGuiItem(i18n("Create")), 0190 KStandardGuiItem::cancel() ) == KMessageBox::PrimaryAction ) { 0191 if( !QDir().mkpath( tempDir ) ) { 0192 KMessageBox::error( this, i18n("Failed to create folder '%1'.", tempDir ) ); 0193 return; 0194 } 0195 } 0196 else 0197 return; 0198 } 0199 0200 // 0201 // check if enough space in tempdir if not on-the-fly 0202 // 0203 if( doc()->burningSize() > m_tempDirSelectionWidget->freeTempSpace() ) { 0204 if( KMessageBox::warningContinueCancel( this, i18n("There does not seem to be enough free space in the temporary folder. " 0205 "Write anyway?") ) == KMessageBox::Cancel ) 0206 return; 0207 } 0208 } 0209 } 0210 0211 K3b::JobProgressDialog* dlg = 0; 0212 if( m_checkOnlyCreateImage && m_checkOnlyCreateImage->isChecked() ) 0213 dlg = new K3b::JobProgressDialog( parentWidget() ); 0214 else 0215 dlg = new K3b::BurnProgressDialog( parentWidget() ); 0216 0217 m_job = m_doc->newBurnJob( dlg ); 0218 0219 if( m_writerSelectionWidget ) 0220 m_job->setWritingApp( m_writerSelectionWidget->writingApp() ); 0221 prepareJob( m_job ); 0222 0223 hideTemporarily(); 0224 0225 dlg->startJob(m_job); 0226 0227 qDebug() << "(K3b::ProjectBurnDialog) job done. cleaning up."; 0228 0229 delete m_job; 0230 m_job = 0; 0231 delete dlg; 0232 0233 done( Burn ); 0234 } 0235 0236 0237 void K3b::ProjectBurnDialog::prepareGui() 0238 { 0239 QVBoxLayout* mainLay = new QVBoxLayout( mainWidget() ); 0240 mainLay->setContentsMargins( 0, 0, 0, 0 ); 0241 0242 m_writerSelectionWidget = new K3b::WriterSelectionWidget( mainWidget() ); 0243 m_writerSelectionWidget->setWantedMediumType( m_doc->supportedMediaTypes() ); 0244 m_writerSelectionWidget->setWantedMediumState( K3b::Device::STATE_EMPTY ); 0245 m_writerSelectionWidget->setWantedMediumSize( m_doc->length() ); 0246 mainLay->addWidget( m_writerSelectionWidget ); 0247 0248 m_tabWidget = new QTabWidget( mainWidget() ); 0249 mainLay->addWidget( m_tabWidget ); 0250 0251 QWidget* w = new QWidget( m_tabWidget ); 0252 m_tabWidget->addTab( w, i18n("Writing") ); 0253 0254 QGroupBox* groupWritingMode = new QGroupBox( i18n("Writing Mode"), w ); 0255 m_writingModeWidget = new K3b::WritingModeWidget( groupWritingMode ); 0256 QVBoxLayout* groupWritingModeLayout = new QVBoxLayout( groupWritingMode ); 0257 groupWritingModeLayout->addWidget( m_writingModeWidget ); 0258 0259 m_optionGroup = new QGroupBox( i18n("Settings"), w ); 0260 m_optionGroupLayout = new QVBoxLayout( m_optionGroup ); 0261 0262 // add the options 0263 m_checkCacheImage = K3b::StdGuiItems::createCacheImageCheckbox( m_optionGroup ); 0264 m_checkSimulate = K3b::StdGuiItems::simulateCheckbox( m_optionGroup ); 0265 m_checkRemoveBufferFiles = K3b::StdGuiItems::removeImagesCheckbox( m_optionGroup ); 0266 m_checkOnlyCreateImage = K3b::StdGuiItems::onlyCreateImagesCheckbox( m_optionGroup ); 0267 0268 m_optionGroupLayout->addWidget(m_checkSimulate); 0269 m_optionGroupLayout->addWidget(m_checkCacheImage); 0270 m_optionGroupLayout->addWidget(m_checkOnlyCreateImage); 0271 m_optionGroupLayout->addWidget(m_checkRemoveBufferFiles); 0272 0273 QGroupBox* groupCopies = new QGroupBox( i18n("Copies"), w ); 0274 QLabel* pixLabel = new QLabel( groupCopies ); 0275 pixLabel->setPixmap( QIcon::fromTheme("tools-media-optical-copy").pixmap(KIconLoader::SizeMedium) ); 0276 pixLabel->setScaledContents( false ); 0277 m_spinCopies = new QSpinBox( groupCopies ); 0278 m_spinCopies->setRange( 1, 999 ); 0279 QHBoxLayout* groupCopiesLayout = new QHBoxLayout( groupCopies ); 0280 groupCopiesLayout->addWidget( pixLabel ); 0281 groupCopiesLayout->addWidget( m_spinCopies ); 0282 0283 // arrange it 0284 QGridLayout* grid = new QGridLayout( w ); 0285 0286 grid->addWidget( groupWritingMode, 0, 0 ); 0287 grid->addWidget( m_optionGroup, 0, 1, 3, 1 ); 0288 grid->addWidget( groupCopies, 2, 0 ); 0289 // grid->addWidget( m_tempDirSelectionWidget, 1, 1, 3, 1 ); 0290 grid->setRowStretch( 1, 1 ); 0291 grid->setColumnStretch( 1, 1 ); 0292 0293 QWidget *tempW = new QWidget( m_tabWidget ); 0294 grid = new QGridLayout( tempW ); 0295 m_tabWidget->addTab( tempW, i18n("Image") ); 0296 m_tempDirSelectionWidget = new K3b::TempDirSelectionWidget( tempW ); 0297 grid->addWidget( m_tempDirSelectionWidget, 0, 0 ); 0298 m_tempDirSelectionWidget->setNeededSize( doc()->size() ); 0299 0300 // tab order 0301 setTabOrder( m_writerSelectionWidget, m_writingModeWidget ); 0302 setTabOrder( m_writingModeWidget, groupCopies ); 0303 setTabOrder( groupCopies, m_optionGroup ); 0304 0305 // some default connections that should always be useful 0306 connect( m_writerSelectionWidget, SIGNAL(writerChanged()), this, SLOT(slotWriterChanged()) ); 0307 connect( m_writerSelectionWidget, SIGNAL(writerChanged(K3b::Device::Device*)), 0308 m_writingModeWidget, SLOT(determineSupportedModesFromMedium(K3b::Device::Device*)) ); 0309 connect( m_writerSelectionWidget, SIGNAL(writingAppChanged(K3b::WritingApp)), this, SLOT(slotWritingAppChanged(K3b::WritingApp)) ); 0310 connect( m_checkCacheImage, SIGNAL(toggled(bool)), this, SLOT(slotToggleAll()) ); 0311 connect( m_checkSimulate, SIGNAL(toggled(bool)), this, SLOT(slotToggleAll()) ); 0312 connect( m_checkOnlyCreateImage, SIGNAL(toggled(bool)), this, SLOT(slotToggleAll()) ); 0313 connect( m_writingModeWidget, SIGNAL(writingModeChanged(WritingMode)), this, SLOT(slotToggleAll()) ); 0314 0315 connect( m_checkOnlyCreateImage, SIGNAL(toggled(bool)), this, SLOT(slotShowImageTip(bool)) ); 0316 connect( m_checkCacheImage, SIGNAL(toggled(bool)), this, SLOT(slotShowImageTip(bool)) ); 0317 } 0318 0319 0320 void K3b::ProjectBurnDialog::addPage( QWidget* page, const QString& title ) 0321 { 0322 m_tabWidget->addTab( page, title ); 0323 } 0324 0325 0326 void K3b::ProjectBurnDialog::saveSettingsToProject() 0327 { 0328 m_doc->setDummy( m_checkSimulate->isChecked() ); 0329 m_doc->setOnTheFly( !m_checkCacheImage->isChecked() ); 0330 m_doc->setOnlyCreateImages( m_checkOnlyCreateImage->isChecked() ); 0331 m_doc->setRemoveImages( m_checkRemoveBufferFiles->isChecked() ); 0332 m_doc->setSpeed( m_writerSelectionWidget->writerSpeed() ); 0333 m_doc->setBurner( m_writerSelectionWidget->writerDevice() ); 0334 m_doc->setWritingMode( m_writingModeWidget->writingMode() ); 0335 m_doc->setWritingApp( m_writerSelectionWidget->writingApp() ); 0336 m_doc->setCopies( m_spinCopies->value() ); 0337 } 0338 0339 0340 void K3b::ProjectBurnDialog::readSettingsFromProject() 0341 { 0342 m_checkSimulate->setChecked( doc()->dummy() ); 0343 m_checkCacheImage->setChecked( !doc()->onTheFly() ); 0344 m_checkOnlyCreateImage->setChecked( m_doc->onlyCreateImages() ); 0345 m_checkRemoveBufferFiles->setChecked( m_doc->removeImages() ); 0346 m_writingModeWidget->setWritingMode( doc()->writingMode() ); 0347 m_writerSelectionWidget->setWriterDevice( doc()->burner() ); 0348 m_writerSelectionWidget->setSpeed( doc()->speed() ); 0349 m_writerSelectionWidget->setWritingApp( doc()->writingApp() ); 0350 m_writerSelectionWidget->setWantedMediumType( doc()->supportedMediaTypes() ); 0351 m_spinCopies->setValue( m_doc->copies() ); 0352 } 0353 0354 0355 void K3b::ProjectBurnDialog::saveSettings( KConfigGroup c ) 0356 { 0357 m_writingModeWidget->saveConfig( c ); 0358 c.writeEntry( "simulate", m_checkSimulate->isChecked() ); 0359 c.writeEntry( "on_the_fly", !m_checkCacheImage->isChecked() ); 0360 c.writeEntry( "remove_image", m_checkRemoveBufferFiles->isChecked() ); 0361 c.writeEntry( "only_create_image", m_checkOnlyCreateImage->isChecked() ); 0362 c.writeEntry( "copies", m_spinCopies->value() ); 0363 0364 m_tempDirSelectionWidget->saveConfig( c ); 0365 m_writerSelectionWidget->saveConfig( c ); 0366 } 0367 0368 0369 void K3b::ProjectBurnDialog::loadSettings( const KConfigGroup& c ) 0370 { 0371 m_writingModeWidget->loadConfig( c ); 0372 m_checkSimulate->setChecked( c.readEntry( "simulate", false ) ); 0373 m_checkCacheImage->setChecked( !c.readEntry( "on_the_fly", true ) ); 0374 m_checkRemoveBufferFiles->setChecked( c.readEntry( "remove_image", true ) ); 0375 m_checkOnlyCreateImage->setChecked( c.readEntry( "only_create_image", false ) ); 0376 m_spinCopies->setValue( c.readEntry( "copies", 1 ) ); 0377 0378 m_tempDirSelectionWidget->readConfig( c ); 0379 m_writerSelectionWidget->loadConfig( c ); 0380 } 0381 0382 0383 void K3b::ProjectBurnDialog::slotShowImageTip( bool buttonActivated ) 0384 { 0385 if (buttonActivated && isVisible()) { 0386 // FIXME: use the tab bar's position 0387 QWhatsThis::showText(mapToGlobal(QPoint(rect().center().x(), rect().top())), m_imageTipText); 0388 } 0389 } 0390 0391 #include "moc_k3bprojectburndialog.cpp"