File indexing completed on 2024-05-05 04:51:43

0001 /*
0002     SPDX-FileCopyrightText: 1998-2009 Sebastian Trueg <trueg@k3b.org>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #include "k3bdataburndialog.h"
0007 #include "k3bdataimagesettingswidget.h"
0008 #include "k3bdatamultisessioncombobox.h"
0009 #include "k3bdataview.h"
0010 #include "../k3bapplication.h"
0011 
0012 #include "k3bisooptions.h"
0013 #include "k3bdatadoc.h"
0014 #include "k3bdevice.h"
0015 #include "k3bwriterselectionwidget.h"
0016 #include "k3btempdirselectionwidget.h"
0017 #include "k3bjob.h"
0018 #include "k3bcore.h"
0019 #include "k3bstdguiitems.h"
0020 #include "k3bdatamodewidget.h"
0021 #include "k3bglobals.h"
0022 #include "k3bwritingmodewidget.h"
0023 #include "k3bmediacache.h"
0024 #include "k3bfilecompilationsizehandler.h"
0025 
0026 #include <QFile>
0027 #include <QFileInfo>
0028 #include <QPoint>
0029 #include <QVariant>
0030 #include <QCheckBox>
0031 #include <QGroupBox>
0032 #include <QLabel>
0033 #include <QLineEdit>
0034 #include <QPushButton>
0035 #include <QToolButton>
0036 #include <QLayout>
0037 #include <QToolTip>
0038 #include <QRadioButton>
0039 #include <QTabWidget>
0040 #include <QSpinBox>
0041 #include <QGridLayout>
0042 
0043 #include <KConfig>
0044 #include <KComboBox>
0045 #include <KLineEdit>
0046 #include <KLocalizedString>
0047 #include <KIO/Global>
0048 #include <KMessageBox>
0049 
0050 
0051 K3b::DataBurnDialog::DataBurnDialog(K3b::DataDoc* _doc, QWidget *parent )
0052     : K3b::ProjectBurnDialog( _doc, parent )
0053 {
0054     prepareGui();
0055 
0056     setTitle( i18n("Data Project"), i18n("Size: %1", KIO::convertSize(_doc->size()) ) );
0057 
0058     // for now we just put the verify checkbox on the main page...
0059     m_checkVerify = K3b::StdGuiItems::verifyCheckBox( m_optionGroup );
0060     m_optionGroupLayout->addWidget( m_checkVerify );
0061 
0062     QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding );
0063     m_optionGroupLayout->addItem( spacer );
0064 
0065     // create image settings tab
0066     m_imageSettingsWidget = new K3b::DataImageSettingsWidget( this );
0067     addPage( m_imageSettingsWidget, i18n("Filesystem") );
0068 
0069     setupSettingsTab();
0070 
0071     connect( m_comboMultisession, SIGNAL(activated(int)),
0072              this, SLOT(slotMultiSessionModeChanged()) );
0073 
0074     m_writerSelectionWidget->setWantedMediumState( K3b::Device::STATE_EMPTY|K3b::Device::STATE_INCOMPLETE );
0075 
0076     m_tempDirSelectionWidget->setSelectionMode( K3b::TempDirSelectionWidget::FILE );
0077     QString path = _doc->tempDir();
0078     if( !path.isEmpty() ) {
0079         m_tempDirSelectionWidget->setTempPath( path );
0080     }
0081     if( !_doc->isoOptions().volumeID().isEmpty() ) {
0082         m_tempDirSelectionWidget->setDefaultImageFileName( _doc->isoOptions().volumeID() + ".iso" );
0083     }
0084 
0085     connect( m_imageSettingsWidget->m_editVolumeName, SIGNAL(textChanged(QString)),
0086              m_tempDirSelectionWidget, SLOT(setDefaultImageFileName(QString)) );
0087 }
0088 
0089 K3b::DataBurnDialog::~DataBurnDialog(){
0090 }
0091 
0092 
0093 void K3b::DataBurnDialog::saveSettingsToProject()
0094 {
0095     K3b::ProjectBurnDialog::saveSettingsToProject();
0096 
0097     // save iso image settings
0098     K3b::IsoOptions o = ((K3b::DataDoc*)doc())->isoOptions();
0099     m_imageSettingsWidget->save( o );
0100     ((K3b::DataDoc*)doc())->setIsoOptions( o );
0101 
0102     // save image file path
0103     ((K3b::DataDoc*)doc())->setTempDir( m_tempDirSelectionWidget->tempPath() );
0104 
0105     // save multisession settings
0106     ((K3b::DataDoc*)doc())->setMultiSessionMode( m_comboMultisession->multiSessionMode() );
0107 
0108     ((K3b::DataDoc*)doc())->setDataMode( m_dataModeWidget->dataMode() );
0109 
0110     ((K3b::DataDoc*)doc())->setVerifyData( m_checkVerify->isChecked() );
0111 }
0112 
0113 
0114 void K3b::DataBurnDialog::readSettingsFromProject()
0115 {
0116     K3b::ProjectBurnDialog::readSettingsFromProject();
0117 
0118     // read multisession
0119     m_comboMultisession->setMultiSessionMode( ((K3b::DataDoc*)doc())->multiSessionMode() );
0120 
0121     if( !doc()->tempDir().isEmpty() )
0122         m_tempDirSelectionWidget->setTempPath( doc()->tempDir() );
0123     else
0124         m_tempDirSelectionWidget->setTempPath( K3b::defaultTempPath() + doc()->name() + ".iso" );
0125 
0126     m_checkVerify->setChecked( ((K3b::DataDoc*)doc())->verifyData() );
0127 
0128     m_imageSettingsWidget->load( ((K3b::DataDoc*)doc())->isoOptions() );
0129 
0130     m_dataModeWidget->setDataMode( ((K3b::DataDoc*)doc())->dataMode() );
0131 
0132     toggleAll();
0133     slotMultiSessionModeChanged();
0134 }
0135 
0136 
0137 void K3b::DataBurnDialog::setupSettingsTab()
0138 {
0139     QWidget* frame = new QWidget( this );
0140     QGridLayout* frameLayout = new QGridLayout( frame );
0141 
0142     m_groupDataMode = new QGroupBox( i18n("Datatrack Mode"), frame );
0143     m_dataModeWidget = new K3b::DataModeWidget( m_groupDataMode );
0144     QVBoxLayout* groupDataModeLayout = new QVBoxLayout( m_groupDataMode );
0145     groupDataModeLayout->addWidget( m_dataModeWidget );
0146 
0147     QGroupBox* groupMultiSession = new QGroupBox( i18n("Multisession Mode"), frame );
0148     m_comboMultisession = new K3b::DataMultiSessionCombobox( groupMultiSession );
0149     QVBoxLayout* groupMultiSessionLayout = new QVBoxLayout( groupMultiSession );
0150     groupMultiSessionLayout->addWidget( m_comboMultisession );
0151 
0152     frameLayout->addWidget( m_groupDataMode, 0, 0 );
0153     frameLayout->addWidget( groupMultiSession, 1, 0 );
0154     frameLayout->setRowStretch( 2, 1 );
0155 
0156     addPage( frame, i18n("Misc") );
0157 }
0158 
0159 
0160 void K3b::DataBurnDialog::slotStartClicked()
0161 {
0162     if( m_checkOnlyCreateImage->isChecked() ||
0163         m_checkCacheImage->isChecked() ) {
0164         QFileInfo fi( m_tempDirSelectionWidget->tempPath() );
0165         if( fi.isDir() )
0166             m_tempDirSelectionWidget->setTempPath( fi.filePath() + "/image.iso" );
0167 
0168         if( QFile::exists( m_tempDirSelectionWidget->tempPath() ) ) {
0169             if( KMessageBox::warningContinueCancel( this,
0170                                                     i18n("Do you want to overwrite %1?",m_tempDirSelectionWidget->tempPath()),
0171                                                     i18n("File Exists"), KStandardGuiItem::overwrite() )
0172                 == KMessageBox::Continue ) {
0173                 // delete the file here to avoid problems with free space in K3b::ProjectBurnDialog::slotStartClicked
0174                 QFile::remove( m_tempDirSelectionWidget->tempPath() );
0175             }
0176             else
0177                 return;
0178         }
0179     }
0180 
0181     if( m_writingModeWidget->writingMode() == K3b::WritingModeSao &&
0182         m_comboMultisession->multiSessionMode() != K3b::DataDoc::NONE &&
0183         m_writerSelectionWidget->writingApp() == K3b::WritingAppCdrecord )
0184         if( KMessageBox::warningContinueCancel( this,
0185                                                 i18n("Most writers do not support writing "
0186                                                      "multisession CDs in DAO mode.") )
0187             == KMessageBox::Cancel )
0188             return;
0189 
0190 
0191     K3b::ProjectBurnDialog::slotStartClicked();
0192 }
0193 
0194 
0195 void K3b::DataBurnDialog::loadSettings( const KConfigGroup& c )
0196 {
0197     K3b::ProjectBurnDialog::loadSettings(c);
0198 
0199     m_dataModeWidget->loadConfig(c);
0200     m_comboMultisession->loadConfig( c );
0201 
0202     K3b::IsoOptions o = K3b::IsoOptions::load( c );
0203     m_imageSettingsWidget->load( o );
0204 
0205     m_checkVerify->setChecked( c.readEntry( "verify data", false ) );
0206 
0207     toggleAll();
0208 }
0209 
0210 
0211 void K3b::DataBurnDialog::saveSettings( KConfigGroup c )
0212 {
0213     K3b::ProjectBurnDialog::saveSettings(c);
0214 
0215     m_dataModeWidget->saveConfig(c);
0216     m_comboMultisession->saveConfig( c );
0217 
0218     K3b::IsoOptions o;
0219     m_imageSettingsWidget->save( o );
0220     o.save( c );
0221 
0222     c.writeEntry( "verify data", m_checkVerify->isChecked() );
0223 }
0224 
0225 
0226 void K3b::DataBurnDialog::toggleAll()
0227 {
0228     K3b::ProjectBurnDialog::toggleAll();
0229 
0230     if( m_checkSimulate->isChecked() || m_checkOnlyCreateImage->isChecked() ) {
0231         m_checkVerify->setChecked(false);
0232         m_checkVerify->setEnabled(false);
0233     }
0234     else
0235         m_checkVerify->setEnabled(true);
0236 
0237     m_comboMultisession->setDisabled( m_checkOnlyCreateImage->isChecked() );
0238     // we can only select the data mode for CD media
0239     // IDEA: why not give GUI elements like this a slot that reacts on media changes?
0240     m_dataModeWidget->setDisabled( m_checkOnlyCreateImage->isChecked() ||
0241                                    !K3b::Device::isCdMedia( k3bappcore->mediaCache()->diskInfo( m_writerSelectionWidget->writerDevice() ).mediaType() ) );
0242 
0243     // Multisession in DAO is not possible
0244     if( m_writingModeWidget->writingMode() == K3b::WritingModeSao ) {
0245         if( m_comboMultisession->multiSessionMode() == K3b::DataDoc::START ||
0246             m_comboMultisession->multiSessionMode() == K3b::DataDoc::CONTINUE ||
0247             m_comboMultisession->multiSessionMode() == K3b::DataDoc::FINISH )
0248             KMessageBox::information( this, i18n("It is not possible to write multisession media in DAO mode. "
0249                                                  "Multisession has been disabled."),
0250                                       i18n("Multisession Problem"),
0251                                       "multisession_no_dao" );
0252 
0253         m_comboMultisession->setEnabled(false);
0254     }
0255     else {
0256         m_comboMultisession->setEnabled(true);
0257     }
0258 }
0259 
0260 
0261 void K3b::DataBurnDialog::slotMultiSessionModeChanged()
0262 {
0263     if( m_comboMultisession->multiSessionMode() == K3b::DataDoc::CONTINUE ||
0264         m_comboMultisession->multiSessionMode() == K3b::DataDoc::FINISH )
0265         m_spinCopies->setEnabled(false);
0266 
0267     // wait for the proper medium
0268     // we have to do this in another slot than toggleAll to avoid an endless loop
0269     // FIXME: K3b::InteractionDialog::slotToggleAll is endless loop protected
0270     if( m_comboMultisession->multiSessionMode() == K3b::DataDoc::NONE )
0271         m_writerSelectionWidget->setWantedMediumState( K3b::Device::STATE_EMPTY );
0272     else if( m_comboMultisession->multiSessionMode() == K3b::DataDoc::CONTINUE ||
0273              m_comboMultisession->multiSessionMode() == K3b::DataDoc::FINISH )
0274         m_writerSelectionWidget->setWantedMediumState( K3b::Device::STATE_INCOMPLETE );
0275     else
0276         m_writerSelectionWidget->setWantedMediumState( K3b::Device::STATE_EMPTY|K3b::Device::STATE_INCOMPLETE );
0277 }
0278 
0279 #include "moc_k3bdataburndialog.cpp"