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"