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"