File indexing completed on 2024-10-06 04:26:04
0001 /* 0002 SPDX-FileCopyrightText: 1998-2009 Sebastian Trueg <trueg@k3b.org> 0003 SPDX-License-Identifier: GPL-2.0-or-later 0004 */ 0005 #include "k3bwritingmodewidget.h" 0006 #include "k3bmediacache.h" 0007 #include "k3bapplication.h" 0008 0009 #include "k3bglobals.h" 0010 0011 #include <KConfig> 0012 #include <KLocalizedString> 0013 0014 #include <QToolTip> 0015 0016 static const KLocalizedString s_autoHelp = 0017 ki18n("Let K3b select the best-suited mode. This is the recommended selection."); 0018 static const KLocalizedString s_daoHelp = 0019 ki18n("<em>Disk At Once</em> or more properly <em>Session At Once</em>. " 0020 "The laser is never turned off while writing the CD or DVD. " 0021 "This is the preferred mode to write audio CDs since it allows " 0022 "pregaps other than 2 seconds. Not all writers support DAO.<br>" 0023 "DVD-R(W)s written in DAO provide the best DVD-Video compatibility."); 0024 static const KLocalizedString s_taoHelp = 0025 ki18n("<em>Track At Once</em> should be supported by every CD writer. " 0026 "The laser will be turned off after every track.<br>" 0027 "Most CD writers need this mode for writing multisession CDs."); 0028 // TODO: add something like: "No CD-TEXT writing in TAO mode." 0029 0030 static const KLocalizedString s_rawHelp = 0031 ki18n("RAW writing mode. The error correction data is created by the " 0032 "software instead of the writer device.<br>" 0033 "Try this if your CD writer fails to write in DAO and TAO."); 0034 static const KLocalizedString s_seqHelp = 0035 ki18n("Incremental sequential is the default writing mode for DVD-R(W). " 0036 "It allows multisession DVD-R(W)s. It only applies to DVD-R(W)."); 0037 static const KLocalizedString s_ovwHelp = 0038 ki18n("Restricted Overwrite allows one to use a DVD-RW just like a DVD-RAM " 0039 "or a DVD+RW. The media may just be overwritten. It is not possible " 0040 "to write multisession DVD-RWs in this mode but K3b uses growisofs " 0041 "to grow an ISO 9660 filesystem within the first session, thus allowing " 0042 "new files to be added to an already burned disk."); 0043 0044 0045 class K3b::WritingModeWidget::Private 0046 { 0047 public: 0048 // modes set via setSupportedModes 0049 WritingModes supportedModes; 0050 0051 // filtered modes 0052 WritingModes selectedModes; 0053 0054 Device::Device* device; 0055 0056 void _k_writingModeChanged( int mode ) { 0057 emit q->writingModeChanged( WritingMode( mode ) ); 0058 } 0059 0060 WritingModeWidget* q; 0061 }; 0062 0063 0064 K3b::WritingModeWidget::WritingModeWidget( WritingModes modes, QWidget* parent ) 0065 : IntMapComboBox( parent ) 0066 { 0067 init(); 0068 setSupportedModes( modes ); 0069 } 0070 0071 0072 K3b::WritingModeWidget::WritingModeWidget( QWidget* parent ) 0073 : IntMapComboBox( parent ) 0074 { 0075 init(); 0076 setSupportedModes( WritingModeSao | WritingModeTao | WritingModeRaw ); // default: support all CD-R(W) modes 0077 } 0078 0079 0080 K3b::WritingModeWidget::~WritingModeWidget() 0081 { 0082 delete d; 0083 } 0084 0085 0086 void K3b::WritingModeWidget::init() 0087 { 0088 d = new Private(); 0089 d->q = this; 0090 d->device = 0; 0091 0092 connect( this, SIGNAL(valueChanged(int)), this, SLOT(_k_writingModeChanged(int)) ); 0093 0094 setToolTip( i18n("Select the writing mode to use") ); 0095 addGlobalWhatsThisText( "<p><b>" + i18n("Writing mode") + "</b></p>", 0096 i18n("Be aware that the writing mode is ignored when writing DVD+R(W) and BD-R(E) since " 0097 "there is only one way to write them.") 0098 + "<p><i>" 0099 + i18n("The selection of writing modes depends on the inserted burning medium.") 0100 + "</i>" ); 0101 } 0102 0103 0104 K3b::WritingMode K3b::WritingModeWidget::writingMode() const 0105 { 0106 return WritingMode( selectedValue() ); 0107 } 0108 0109 0110 K3b::WritingModes K3b::WritingModeWidget::supportedWritingModes() const 0111 { 0112 return d->selectedModes; 0113 } 0114 0115 0116 void K3b::WritingModeWidget::setWritingMode( WritingMode m ) 0117 { 0118 if( m & d->selectedModes ) { 0119 setSelectedValue( m ); 0120 } 0121 else { 0122 setSelectedValue( WritingModeAuto ); 0123 } 0124 } 0125 0126 0127 void K3b::WritingModeWidget::setSupportedModes( WritingModes m ) 0128 { 0129 d->supportedModes = m|WritingModeAuto; // we always support the Auto mode 0130 updateModes(); 0131 } 0132 0133 0134 void K3b::WritingModeWidget::setDevice( Device::Device* dev ) 0135 { 0136 d->device = dev; 0137 updateModes(); 0138 } 0139 0140 0141 void K3b::WritingModeWidget::updateModes() 0142 { 0143 // save current mode 0144 int currentMode = writingMode(); 0145 0146 clear(); 0147 0148 if( d->device ) 0149 d->selectedModes = d->supportedModes & d->device->writingModes(); 0150 else 0151 d->selectedModes = d->supportedModes; 0152 0153 insertItem( WritingModeAuto, i18n("Auto"), s_autoHelp.toString() ); 0154 if( d->selectedModes & WritingModeSao ) 0155 insertItem( WritingModeSao, i18n("DAO"), s_daoHelp.toString() ); 0156 if( d->selectedModes & WritingModeTao ) 0157 insertItem( WritingModeTao, i18n("TAO"), s_taoHelp.toString() ); 0158 if( d->selectedModes & WritingModeRaw ) 0159 insertItem( WritingModeRaw, i18n("RAW"), s_rawHelp.toString() ); 0160 if( d->selectedModes & WritingModeRestrictedOverwrite ) 0161 insertItem( WritingModeRestrictedOverwrite, i18n("Restricted Overwrite"), s_ovwHelp.toString() ); 0162 if( d->selectedModes & WritingModeIncrementalSequential ) 0163 insertItem( WritingModeIncrementalSequential, i18n("Incremental"), s_seqHelp.toString() ); 0164 0165 setWritingMode( currentMode != -1 ? WritingMode( currentMode ) : WritingModeAuto ); 0166 } 0167 0168 0169 void K3b::WritingModeWidget::saveConfig( KConfigGroup c ) 0170 { 0171 switch( writingMode() ) { 0172 case WritingModeSao: 0173 c.writeEntry( "writing_mode", "dao" ); 0174 break; 0175 case WritingModeTao: 0176 c.writeEntry( "writing_mode", "tao" ); 0177 break; 0178 case WritingModeRaw: 0179 c.writeEntry( "writing_mode", "raw" ); 0180 break; 0181 case WritingModeIncrementalSequential: 0182 c.writeEntry( "writing_mode", "incremental" ); 0183 break; 0184 case WritingModeRestrictedOverwrite: 0185 c.writeEntry( "writing_mode", "overwrite" ); 0186 break; 0187 default: 0188 c.writeEntry( "writing_mode", "auto" ); 0189 break; 0190 } 0191 } 0192 0193 void K3b::WritingModeWidget::loadConfig( const KConfigGroup& c ) 0194 { 0195 QString mode = c.readEntry( "writing_mode" ); 0196 if ( mode == "dao" ) 0197 setWritingMode( WritingModeSao ); 0198 else if( mode == "tao" ) 0199 setWritingMode( WritingModeTao ); 0200 else if( mode == "raw" ) 0201 setWritingMode( WritingModeRaw ); 0202 else if( mode == "incremental" ) 0203 setWritingMode( WritingModeIncrementalSequential ); 0204 else if( mode == "overwrite" ) 0205 setWritingMode( WritingModeRestrictedOverwrite ); 0206 else 0207 setWritingMode( WritingModeAuto ); 0208 } 0209 0210 0211 void K3b::WritingModeWidget::determineSupportedModesFromMedium( const Medium& m ) 0212 { 0213 WritingModes modes = WritingModeAuto; 0214 0215 if( m.diskInfo().mediaType() & (Device::MEDIA_CD_R|Device::MEDIA_CD_RW) ) { 0216 modes |= WritingModeTao; 0217 if( m.device()->supportsWritingMode( Device::WRITINGMODE_SAO ) ) 0218 modes |= WritingModeSao; 0219 if( m.device()->supportsWritingMode( Device::WRITINGMODE_RAW ) ) 0220 modes |= WritingModeRaw; 0221 } 0222 0223 if( m.diskInfo().mediaType() & Device::MEDIA_DVD_MINUS_ALL ) { 0224 modes |= WritingModeSao; 0225 if ( !k3bcore->deviceBlocked( m.device() ) ) 0226 if( m.device()->featureCurrent( Device::FEATURE_INCREMENTAL_STREAMING_WRITABLE ) != 0 ) 0227 modes |= WritingModeIncrementalSequential; 0228 } 0229 0230 if( m.diskInfo().mediaType() & (Device::MEDIA_DVD_RW| 0231 Device::MEDIA_DVD_RW_SEQ| 0232 Device::MEDIA_DVD_RW_OVWR) ) { 0233 modes |= WritingModeRestrictedOverwrite; 0234 } 0235 0236 setSupportedModes( modes ); 0237 setDevice( m.device() ); 0238 } 0239 0240 0241 void K3b::WritingModeWidget::determineSupportedModesFromMedium( K3b::Device::Device* dev ) 0242 { 0243 if( dev ) 0244 determineSupportedModesFromMedium( k3bappcore->mediaCache()->medium( dev ) ); 0245 else 0246 determineSupportedModesFromMedium( Medium() ); // no medium 0247 } 0248 0249 #include "moc_k3bwritingmodewidget.cpp"