diff --git a/src/k3btempdirselectionwidget.cpp b/src/k3btempdirselectionwidget.cpp index ea382acfb..c3d0bd9be 100644 --- a/src/k3btempdirselectionwidget.cpp +++ b/src/k3btempdirselectionwidget.cpp @@ -1,269 +1,273 @@ /* * * Copyright (C) 2003-2008 Sebastian Trueg * Copyright (C) 2010 Michal Malek * * This file is part of the K3b project. * Copyright (C) 1998-2008 Sebastian Trueg * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * See the file "COPYING" for the exact licensing terms. */ #include "k3btempdirselectionwidget.h" #include "k3bcore.h" #include "k3bglobalsettings.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include K3b::TempDirSelectionWidget::TempDirSelectionWidget( QWidget *parent ) : QGroupBox( parent ), m_labelCdSize(0), m_requestedSize(0), m_defaultImageFileName( "k3b_image.iso" ) { QGridLayout* layout = new QGridLayout( this ); m_imageFileLabel = new QLabel( this ); m_editDirectory = new KUrlRequester( this ); m_imageFileLabel->setBuddy( m_editDirectory ); QLabel* freeSpaceLabel = new QLabel( i18n( "Free space in temporary folder:" ), this ); m_labelFreeSpace = new QLabel( this ); m_labelFreeSpace->setAlignment( Qt::AlignVCenter | Qt::AlignRight ); layout->addWidget( m_imageFileLabel, 0, 0, 1, 2 ); layout->addWidget( m_editDirectory, 1, 0, 1, 2 ); layout->addWidget( freeSpaceLabel, 2, 0 ); layout->addWidget( m_labelFreeSpace, 2, 1 ); // do not use row 3 here since that could be used in setNeededSize below layout->setRowStretch( 4, 1 ); connect( m_editDirectory, SIGNAL(textChanged(QString)), this, SLOT(slotUpdateFreeTempSpace()) ); connect( m_editDirectory->lineEdit(), SIGNAL(lostFocus()), this, SLOT(slotFixTempPath()) ); // choose a default setSelectionMode( DIR ); m_editDirectory->setUrl( QUrl::fromLocalFile( k3bcore->globalSettings()->defaultTempPath() ) ); slotUpdateFreeTempSpace(); // ToolTips // -------------------------------------------------------------------------------- m_editDirectory->setToolTip( i18n("The folder in which to save the image files") ); // What's This info // -------------------------------------------------------------------------------- m_editDirectory->setWhatsThis( i18n("

This is the folder in which K3b will save the image files." "

Please make sure that it resides on a partition that has enough free space.") ); } K3b::TempDirSelectionWidget::~TempDirSelectionWidget() { } KIO::filesize_t K3b::TempDirSelectionWidget::freeTempSpace() const { QString path = m_editDirectory->url().toLocalFile(); if( !QFile::exists( path ) ) path.truncate( path.lastIndexOf('/') ); KDiskFreeSpaceInfo diskFreeSpaceInfo = KDiskFreeSpaceInfo::freeSpaceInfo( path ); return diskFreeSpaceInfo.available(); } void K3b::TempDirSelectionWidget::slotUpdateFreeTempSpace() { // update the temp space KIO::filesize_t tempFreeSpace = freeTempSpace(); KColorScheme::ForegroundRole role; if( tempFreeSpace < m_requestedSize ) role = KColorScheme::NegativeText; else role = KColorScheme::NormalText; QPalette pal( m_labelFreeSpace->palette() ); pal.setBrush( QPalette::Disabled, QPalette::WindowText, KColorScheme( QPalette::Disabled, KColorScheme::Window ).foreground( role ) ); pal.setBrush( QPalette::Active, QPalette::WindowText, KColorScheme( QPalette::Active, KColorScheme::Window ).foreground( role ) ); pal.setBrush( QPalette::Inactive, QPalette::WindowText, KColorScheme( QPalette::Inactive, KColorScheme::Window ).foreground( role ) ); pal.setBrush( QPalette::Normal, QPalette::WindowText, KColorScheme( QPalette::Normal, KColorScheme::Window ).foreground( role ) ); m_labelFreeSpace->setPalette( pal ); m_labelFreeSpace->setText( KIO::convertSize(tempFreeSpace) ); QTimer::singleShot( 1000, this, SLOT(slotUpdateFreeTempSpace()) ); } void K3b::TempDirSelectionWidget::setTempPath( const QString& dir ) { m_editDirectory->setUrl( QUrl::fromLocalFile( dir ) ); slotUpdateFreeTempSpace(); } QString K3b::TempDirSelectionWidget::tempPath() const { QFileInfo fi( m_editDirectory->url().toLocalFile() ); if( fi.exists() ) { if( m_mode == DIR ) { if( fi.isDir() ) return fi.absoluteFilePath(); else return fi.absolutePath(); } else { if( fi.isFile() ) return fi.absoluteFilePath(); else return fi.absoluteFilePath() + "/k3b_image.iso"; } } else { return fi.absoluteFilePath(); } } QString K3b::TempDirSelectionWidget::plainTempPath() const { return m_editDirectory->url().toLocalFile(); } QString K3b::TempDirSelectionWidget::tempDirectory() const { QString td( m_editDirectory->url().toLocalFile() ); // remove a trailing slash while( !td.isEmpty() && td[td.length()-1] == '/' ) td.truncate( td.length()-1 ); QFileInfo fi( td ); if( fi.exists() && fi.isDir() ) return td + '/'; // now we treat the last section as a filename and return the path // in front of it td.truncate( td.lastIndexOf( '/' ) + 1 ); return td; } void K3b::TempDirSelectionWidget::setSelectionMode( int mode ) { m_mode = mode; if( m_mode == DIR ) { m_editDirectory->setWindowTitle( i18n("Select Temporary Folder") ); m_editDirectory->setMode( KFile::Directory | KFile::ExistingOnly | KFile::LocalOnly ); m_imageFileLabel->setText( i18n( "Wri&te image files to:" ) ); setTitle( i18n("Temporary Folder") ); } else { m_editDirectory->setWindowTitle( i18n("Select Temporary File") ); m_editDirectory->setMode( KFile::File | KFile::LocalOnly ); m_imageFileLabel->setText( i18n( "Wri&te image file to:" ) ); setTitle( i18n("Temporary File") ); } } void K3b::TempDirSelectionWidget::setNeededSize( KIO::filesize_t bytes ) { m_requestedSize = bytes; if( !m_labelCdSize ) { QGridLayout* grid = static_cast( layout() ); grid->addWidget( new QLabel( i18n( "Size of project:" ), this ), 3, 0 ); m_labelCdSize = new QLabel( KIO::convertSize(m_requestedSize), this ); m_labelCdSize->setAlignment( Qt::AlignVCenter | Qt::AlignRight ); grid->addWidget( m_labelCdSize, 3, 1 ); } m_labelCdSize->setText( KIO::convertSize(m_requestedSize) ); } void K3b::TempDirSelectionWidget::saveConfig() { k3bcore->globalSettings()->setDefaultTempPath( tempDirectory() ); } void K3b::TempDirSelectionWidget::readConfig( const KConfigGroup& c ) { setTempPath( c.readPathEntry( "image path", k3bcore->globalSettings()->defaultTempPath() ) ); } void K3b::TempDirSelectionWidget::saveConfig( KConfigGroup c ) { c.writePathEntry( "image path", tempPath() ); } void K3b::TempDirSelectionWidget::setDefaultImageFileName( const QString& name, bool changeImageName ) { if ( !name.isEmpty() ) { if ( selectionMode() == FILE ) { if ( plainTempPath().section( '/', -1 ) == m_defaultImageFileName ) { changeImageName = true; } } m_defaultImageFileName = name; if ( !m_defaultImageFileName.contains( '.' ) ) { m_defaultImageFileName += ".iso"; } fixTempPath( changeImageName ); } } void K3b::TempDirSelectionWidget::slotFixTempPath() { fixTempPath( false ); } void K3b::TempDirSelectionWidget::fixTempPath( bool forceNewImageName ) { // if in file selection mode and no image file is specified or // forceNewImageName is true set the default image file name if ( selectionMode() == FILE ) { if ( forceNewImageName || QFileInfo( plainTempPath() ).isDir() ) { setTempPath( tempDirectory() + m_defaultImageFileName ); } } } +void K3b::TempDirSelectionWidget::setImageFileLabel(const QString &label) +{ + m_imageFileLabel->setText(label); +} diff --git a/src/k3btempdirselectionwidget.h b/src/k3btempdirselectionwidget.h index dedd183f1..4ebb84b05 100644 --- a/src/k3btempdirselectionwidget.h +++ b/src/k3btempdirselectionwidget.h @@ -1,98 +1,100 @@ /* * * Copyright (C) 2003-2008 Sebastian Trueg * * This file is part of the K3b project. * Copyright (C) 1998-2008 Sebastian Trueg * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * See the file "COPYING" for the exact licensing terms. */ #ifndef K3BTEMPDIRSELECTIONWIDGET_H #define K3BTEMPDIRSELECTIONWIDGET_H #include #include #include #include class QLabel; class KUrlRequester; /** *@author Sebastian Trueg */ namespace K3b { class TempDirSelectionWidget : public QGroupBox { Q_OBJECT public: TempDirSelectionWidget( QWidget *parent = 0 ); ~TempDirSelectionWidget(); /** determines if the selection dialog should ask for a dir or a file */ enum mode { DIR, FILE }; int selectionMode() const { return m_mode; } /** * \return Free space in bytes */ KIO::filesize_t freeTempSpace() const; QString tempPath() const; QString tempDirectory() const; /** * Use this if you don't want TempDirSelectionWidget to modify the * user input based on the mode. */ QString plainTempPath() const; + void setImageFileLabel(const QString &label); + public Q_SLOTS: void setTempPath( const QString& ); void setSelectionMode( int mode ); void setNeededSize( KIO::filesize_t bytes ); /** * In file selection mode if the user enters a directory name it will * automatically be expended to this filename. * Default is k3b_image.iso */ void setDefaultImageFileName( const QString& name, bool forceChange = false ); /** * saves the current path as the global default temp dir. */ void saveConfig(); void readConfig( const KConfigGroup& ); void saveConfig( KConfigGroup ); private Q_SLOTS: void slotUpdateFreeTempSpace(); void slotFixTempPath(); private: void fixTempPath( bool forceNewImageName ); QLabel* m_imageFileLabel; QLabel* m_labelCdSize; QLabel* m_labelFreeSpace; KUrlRequester* m_editDirectory; KIO::filesize_t m_requestedSize; int m_mode; QString m_defaultImageFileName; }; } #endif diff --git a/src/projects/k3baudioburndialog.cpp b/src/projects/k3baudioburndialog.cpp index 41d1eb50b..36773f5e5 100644 --- a/src/projects/k3baudioburndialog.cpp +++ b/src/projects/k3baudioburndialog.cpp @@ -1,326 +1,332 @@ /* * * Copyright (C) 2003-2009 Sebastian Trueg * * This file is part of the K3b project. * Copyright (C) 1998-2009 Sebastian Trueg * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * See the file "COPYING" for the exact licensing terms. */ #include "k3baudioburndialog.h" #include "k3baudioview.h" #include "k3baudiotrack.h" #include "k3baudiocdtracksource.h" #include "k3bcore.h" #include "k3baudiodoc.h" #include "k3bdevice.h" #include "k3bwriterselectionwidget.h" #include "k3btempdirselectionwidget.h" #include "k3baudiocdtextwidget.h" #include "k3bglobals.h" #include "k3bstdguiitems.h" #include "k3bwritingmodewidget.h" #include "k3bexternalbinmanager.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include K3b::AudioBurnDialog::AudioBurnDialog(K3b::AudioDoc* _doc, QWidget *parent ) : K3b::ProjectBurnDialog( _doc, parent ), m_doc(_doc) { prepareGui(); setTitle( i18n("Audio Project"), i18np("1 track (%2 minutes)", "%1 tracks (%2 minutes)", m_doc->numOfTracks(),m_doc->length().toString()) ); QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding ); m_optionGroupLayout->addItem( spacer ); // create cd-text page m_cdtextWidget = new K3b::AudioCdTextWidget( this ); addPage( m_cdtextWidget, i18n("CD-Text") ); // create advanced tab // ---------------------------------------------------------- QWidget* advancedTab = new QWidget( this ); QGridLayout* advancedTabGrid = new QGridLayout( advancedTab ); QGroupBox* advancedSettingsGroup = new QGroupBox( i18n("Settings"), advancedTab ); m_checkNormalize = K3b::StdGuiItems::normalizeCheckBox( advancedSettingsGroup ); QVBoxLayout* advancedSettingsGroupLayout = new QVBoxLayout( advancedSettingsGroup ); advancedSettingsGroupLayout->addWidget( m_checkNormalize ); QGroupBox* advancedGimmickGroup = new QGroupBox( i18n("Gimmicks"), advancedTab ); m_checkHideFirstTrack = new QCheckBox( i18n( "Hide first track" ), advancedGimmickGroup ); QVBoxLayout* advancedGimmickGroupLayout = new QVBoxLayout( advancedGimmickGroup ); advancedGimmickGroupLayout->addWidget( m_checkHideFirstTrack ); m_audioRippingGroup = new QGroupBox( i18n("Audio Ripping"), advancedTab ); m_comboParanoiaMode = K3b::StdGuiItems::paranoiaModeComboBox( m_audioRippingGroup ); QHBoxLayout* paranoiaModeLayout = new QHBoxLayout; paranoiaModeLayout->addWidget( new QLabel( i18n("Paranoia mode:"), m_audioRippingGroup ), 1 ); paranoiaModeLayout->addWidget( m_comboParanoiaMode ); m_spinAudioRippingReadRetries = new QSpinBox( m_audioRippingGroup ); m_spinAudioRippingReadRetries->setRange( 1, 128 ); m_checkAudioRippingIgnoreReadErrors = new QCheckBox( i18n("Ignore read errors"), m_audioRippingGroup ); QHBoxLayout* readRetriesLayout = new QHBoxLayout; readRetriesLayout->addWidget( new QLabel( i18n("Read retries:" ), m_audioRippingGroup ), 1 ); readRetriesLayout->addWidget( m_spinAudioRippingReadRetries ); QVBoxLayout* audioRippingGroupLayout = new QVBoxLayout( m_audioRippingGroup ); audioRippingGroupLayout->addLayout( paranoiaModeLayout ); audioRippingGroupLayout->addLayout( readRetriesLayout ); audioRippingGroupLayout->addWidget( m_checkAudioRippingIgnoreReadErrors ); advancedTabGrid->addWidget( advancedSettingsGroup, 0, 0 ); advancedTabGrid->addWidget( advancedGimmickGroup, 1, 0 ); advancedTabGrid->addWidget( m_audioRippingGroup, 2, 0 ); advancedTabGrid->setRowStretch( 3, 1 ); addPage( advancedTab, i18n("Advanced") ); connect( m_checkNormalize, SIGNAL(toggled(bool)), this, SLOT(slotNormalizeToggled(bool)) ); connect( m_checkCacheImage, SIGNAL(toggled(bool)), this, SLOT(slotCacheImageToggled(bool)) ); // ToolTips // ------------------------------------------------------------------------- m_checkHideFirstTrack->setToolTip( i18n("Hide the first track in the first pregap") ); // What's This info // ------------------------------------------------------------------------- m_checkHideFirstTrack->setWhatsThis( i18n("

If this option is checked K3b will hide the first track." "

The audio CD standard uses pregaps before every track on the CD. " "By default these last for 2 seconds and are silent. In DAO mode it " "is possible to have longer pregaps that contain some audio. In this case " "the first pregap will contain the complete first track." "

You will need to seek back from the beginning of the CD to listen to " "the first track. Try it, it is quite amusing." "

This feature is only available in DAO mode when writing with cdrdao.") ); + + // TODO: AudioDoc doesn't have IsoOptions, so it could NOT create iso image like DataDoc. + m_tabWidget->setTabText(1, i18n("Rip Audio")); + m_checkCacheImage->setText(i18n("Rip Audio")); + m_checkOnlyCreateImage->setText(i18n("Only Rip Audio")); + m_imageTipText = i18n("Use the 'Rip Audio' tab to optionally adjust the path of the audio."); + m_tempDirSelectionWidget->setImageFileLabel(i18n("Wri&te Rip Audio files to:")); } K3b::AudioBurnDialog::~AudioBurnDialog(){ } void K3b::AudioBurnDialog::slotStartClicked() { -// static_cast(m_doc->view())->player()->stop(); K3b::ProjectBurnDialog::slotStartClicked(); } void K3b::AudioBurnDialog::saveSettingsToProject() { K3b::ProjectBurnDialog::saveSettingsToProject(); m_doc->setTempDir( m_tempDirSelectionWidget->tempPath() ); m_doc->setHideFirstTrack( m_checkHideFirstTrack->isChecked() ); m_doc->setNormalize( m_checkNormalize->isChecked() ); // -- save Cd-Text ------------------------------------------------ m_cdtextWidget->save( m_doc ); // audio ripping m_doc->setAudioRippingParanoiaMode( m_comboParanoiaMode->currentText().toInt() ); m_doc->setAudioRippingRetries( m_spinAudioRippingReadRetries->value() ); m_doc->setAudioRippingIgnoreReadErrors( m_checkAudioRippingIgnoreReadErrors->isChecked() ); doc()->setTempDir( m_tempDirSelectionWidget->tempPath() ); } void K3b::AudioBurnDialog::readSettingsFromProject() { K3b::ProjectBurnDialog::readSettingsFromProject(); m_checkHideFirstTrack->setChecked( m_doc->hideFirstTrack() ); m_checkNormalize->setChecked( m_doc->normalize() ); // read CD-Text ------------------------------------------------------------ m_cdtextWidget->load( m_doc ); // audio ripping m_comboParanoiaMode->setCurrentIndex( m_doc->audioRippingParanoiaMode() ); m_checkAudioRippingIgnoreReadErrors->setChecked( m_doc->audioRippingIgnoreReadErrors() ); m_spinAudioRippingReadRetries->setValue( m_doc->audioRippingRetries() ); if( !doc()->tempDir().isEmpty() ) m_tempDirSelectionWidget->setTempPath( doc()->tempDir() ); toggleAll(); } void K3b::AudioBurnDialog::loadSettings( const KConfigGroup& c ) { K3b::ProjectBurnDialog::loadSettings( c ); m_cdtextWidget->setChecked( c.readEntry( "cd_text", true ) ); m_checkHideFirstTrack->setChecked( c.readEntry( "hide_first_track", false ) ); m_checkNormalize->setChecked( c.readEntry( "normalize", false ) ); m_comboParanoiaMode->setCurrentIndex( c.readEntry( "paranoia mode", 0 ) ); m_checkAudioRippingIgnoreReadErrors->setChecked( c.readEntry( "ignore read errors", true ) ); m_spinAudioRippingReadRetries->setValue( c.readEntry( "read retries", 5 ) ); toggleAll(); } void K3b::AudioBurnDialog::saveSettings( KConfigGroup c ) { K3b::ProjectBurnDialog::saveSettings( c ); c.writeEntry( "cd_text", m_cdtextWidget->isChecked() ); c.writeEntry( "hide_first_track", m_checkHideFirstTrack->isChecked() ); c.writeEntry( "normalize", m_checkNormalize->isChecked() ); c.writeEntry( "paranoia mode", m_comboParanoiaMode->currentText() ); c.writeEntry( "ignore read errors", m_checkAudioRippingIgnoreReadErrors->isChecked() ); c.writeEntry( "read retries", m_spinAudioRippingReadRetries->value() ); } void K3b::AudioBurnDialog::toggleAll() { K3b::ProjectBurnDialog::toggleAll(); bool cdrecordOnTheFly = false; bool cdrecordCdText = false; if ( k3bcore->externalBinManager()->binObject("cdrecord") ) { cdrecordOnTheFly = k3bcore->externalBinManager()->binObject("cdrecord")->hasFeature( "audio-stdin" ); cdrecordCdText = k3bcore->externalBinManager()->binObject("cdrecord")->hasFeature( "cdtext" ); } // cdrdao always knows onthefly and cdtext bool onTheFly = true; bool cdText = true; if( m_writingModeWidget->writingMode() == K3b::WritingModeTao || m_writingModeWidget->writingMode() == K3b::WritingModeRaw || m_writerSelectionWidget->writingApp() == K3b::WritingAppCdrecord ) { onTheFly = cdrecordOnTheFly; cdText = cdrecordCdText; m_checkHideFirstTrack->setChecked(false); m_checkHideFirstTrack->setEnabled(false); } else { m_checkHideFirstTrack->setEnabled( !m_checkOnlyCreateImage->isChecked() ); m_cdtextWidget->setEnabled( !m_checkOnlyCreateImage->isChecked() ); } m_checkCacheImage->setEnabled( !m_checkOnlyCreateImage->isChecked() && onTheFly ); if( !onTheFly ) m_checkCacheImage->setChecked( true ); m_cdtextWidget->setEnabled( !m_checkOnlyCreateImage->isChecked() && cdText && m_writingModeWidget->writingMode() != K3b::WritingModeTao ); if( !cdText || m_writingModeWidget->writingMode() == K3b::WritingModeTao ) m_cdtextWidget->setChecked(false); } void K3b::AudioBurnDialog::showEvent( QShowEvent* e ) { // we only show the audio ripping options when there are audio cd track sources bool showRipOptions = false; if( m_doc->firstTrack() ) { K3b::AudioTrack* track = m_doc->firstTrack(); K3b::AudioDataSource* source = track->firstSource(); while( source ) { if( dynamic_cast(source) ) { showRipOptions = true; break; } // next source source = source->next(); if( !source ) { track = track->next(); if( track ) source = track->firstSource(); } } } m_audioRippingGroup->setVisible( showRipOptions ); K3b::ProjectBurnDialog::showEvent(e); } void K3b::AudioBurnDialog::slotNormalizeToggled( bool on ) { if( on ) { // we are not able to normalize in on-the-fly mode if( !k3bcore->externalBinManager()->foundBin( "normalize" ) ) { KMessageBox::sorry( this, i18n("

External program normalize is not installed." "

K3b uses normalize (http://normalize.nongnu.org/) " "to normalize audio tracks. In order to " "use this functionality, please install it first.") ); m_checkNormalize->setChecked( false ); } else if( !m_checkCacheImage->isChecked() && !m_checkOnlyCreateImage->isChecked() ) { if( KMessageBox::warningYesNo( this, i18n("

K3b is not able to normalize audio tracks when burning on-the-fly. " "The external program used for this task only supports normalizing a set " "of audio files."), QString(), KGuiItem( i18n("Disable normalization") ), KGuiItem( i18n("Disable on-the-fly burning") ), "audioProjectNormalizeOrOnTheFly" ) == KMessageBox::Yes ) m_checkNormalize->setChecked( false ); else m_checkCacheImage->setChecked( true ); } } } void K3b::AudioBurnDialog::slotCacheImageToggled( bool on ) { if( !on ) { if( m_checkNormalize->isChecked() ) { if( KMessageBox::warningYesNo( this, i18n("

K3b is not able to normalize audio tracks when burning on-the-fly. " "The external program used for this task only supports normalizing a set " "of audio files."), QString(), KGuiItem( i18n("Disable normalization") ), KGuiItem( i18n("Disable on-the-fly burning") ), "audioProjectNormalizeOrOnTheFly" ) == KMessageBox::Yes ) m_checkNormalize->setChecked( false ); else m_checkCacheImage->setChecked( true ); } } } diff --git a/src/projects/k3bprojectburndialog.cpp b/src/projects/k3bprojectburndialog.cpp index ff346259b..a52aedbb6 100644 --- a/src/projects/k3bprojectburndialog.cpp +++ b/src/projects/k3bprojectburndialog.cpp @@ -1,395 +1,396 @@ /* * * Copyright (C) 2003-2008 Sebastian Trueg * * This file is part of the K3b project. * Copyright (C) 1998-2008 Sebastian Trueg * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * See the file "COPYING" for the exact licensing terms. */ #include "k3bprojectburndialog.h" #include "k3bdoc.h" #include "k3bburnprogressdialog.h" #include "k3bjob.h" #include "k3btempdirselectionwidget.h" #include "k3bwriterselectionwidget.h" #include "k3bstdguiitems.h" #include "k3bwritingmodewidget.h" #include "k3bapplication.h" #include "k3bmediacache.h" #include "k3bmedium.h" #include "k3bdevice.h" #include "k3bdevicemanager.h" #include "k3bglobals.h" #include "k3bcore.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include K3b::ProjectBurnDialog::ProjectBurnDialog( K3b::Doc* doc, QWidget *parent ) : K3b::InteractionDialog( parent, i18n("Project"), QString(), START_BUTTON|SAVE_BUTTON|CANCEL_BUTTON, START_BUTTON, "default " + doc->typeString() + " settings" ), m_writerSelectionWidget(0), - m_tempDirSelectionWidget(0) + m_tempDirSelectionWidget(0), + m_imageTipText(i18n("Use the 'Image' tab to optionally adjust the path of the image.")) { m_doc = doc; KGuiItem closeItem = KStandardGuiItem::close(); closeItem.setToolTip( i18n("Save Settings and close") ); closeItem.setWhatsThis( i18n("Saves the settings to the project and closes the dialog.") ); setButtonGui( SAVE_BUTTON, closeItem ); KGuiItem cancelItem = KStandardGuiItem::cancel(); cancelItem.setToolTip( i18n("Discard all changes and close") ); cancelItem.setWhatsThis( i18n("Discards all changes made in the dialog and closes it.") ); setButtonGui( CANCEL_BUTTON, cancelItem ); m_job = 0; } K3b::ProjectBurnDialog::~ProjectBurnDialog(){ } void K3b::ProjectBurnDialog::init() { readSettingsFromProject(); // if( !m_writerSelectionWidget->writerDevice() ) // m_checkOnlyCreateImage->setChecked(true); } void K3b::ProjectBurnDialog::slotWriterChanged() { slotToggleAll(); } void K3b::ProjectBurnDialog::slotWritingAppChanged( K3b::WritingApp ) { slotToggleAll(); } void K3b::ProjectBurnDialog::toggleAll() { K3b::Device::Device* dev = m_writerSelectionWidget->writerDevice(); if( dev ) { K3b::Medium burnMedium = k3bappcore->mediaCache()->medium( dev ); if( burnMedium.diskInfo().mediaType() & K3b::Device::MEDIA_DVD_PLUS_ALL ) { // no simulation support for DVD+R(W) m_checkSimulate->setChecked(false); m_checkSimulate->setEnabled(false); } else { m_checkSimulate->setEnabled(true); } setButtonEnabled( START_BUTTON, true ); } else setButtonEnabled( START_BUTTON, false ); m_writingModeWidget->determineSupportedModesFromMedium( dev ); m_writingModeWidget->setDisabled( m_checkOnlyCreateImage->isChecked() ); m_checkSimulate->setDisabled( m_checkOnlyCreateImage->isChecked() ); m_checkCacheImage->setDisabled( m_checkOnlyCreateImage->isChecked() ); m_checkRemoveBufferFiles->setDisabled( m_checkOnlyCreateImage->isChecked() || !m_checkCacheImage->isChecked() ); if( m_checkOnlyCreateImage->isChecked() ) { m_checkRemoveBufferFiles->setChecked(false); setButtonEnabled( START_BUTTON, true ); } m_tempDirSelectionWidget->setDisabled( !m_checkCacheImage->isChecked() && !m_checkOnlyCreateImage->isChecked() ); m_writerSelectionWidget->setDisabled( m_checkOnlyCreateImage->isChecked() ); m_spinCopies->setDisabled( m_checkSimulate->isChecked() || m_checkOnlyCreateImage->isChecked() ); // we only support DAO with cdrdao if( m_writerSelectionWidget->writingApp() == K3b::WritingAppCdrdao ) m_writingModeWidget->setSupportedModes( K3b::WritingModeSao ); if( m_checkOnlyCreateImage->isChecked() ) setButtonText( START_BUTTON, i18n("Start"), i18n("Start the image creation") ); else setButtonText( START_BUTTON, i18n("Burn"), i18n("Start the burning process") ); } int K3b::ProjectBurnDialog::execBurnDialog( bool burn ) { if( burn && m_job == 0 ) { setButtonShown( START_BUTTON, true ); setDefaultButton( START_BUTTON ); } else { setButtonShown( START_BUTTON, false ); setDefaultButton( SAVE_BUTTON ); } return K3b::InteractionDialog::exec(); } void K3b::ProjectBurnDialog::slotSaveClicked() { saveSettingsToProject(); done( Saved ); } void K3b::ProjectBurnDialog::slotCancelClicked() { done( Canceled ); } void K3b::ProjectBurnDialog::slotStartClicked() { saveSettingsToProject(); if( m_tempDirSelectionWidget ) { if( !doc()->onTheFly() || doc()->onlyCreateImages() ) { // // check if the temp dir exists // QString tempDir = m_tempDirSelectionWidget->tempDirectory(); if( !QFile::exists( tempDir ) ) { if( KMessageBox::warningYesNo( this, i18n("Image folder '%1' does not exist. Do you want K3b to create it?", tempDir ) ) == KMessageBox::Yes ) { if( !QDir().mkpath( tempDir ) ) { KMessageBox::error( this, i18n("Failed to create folder '%1'.", tempDir ) ); return; } } else return; } // // check if enough space in tempdir if not on-the-fly // if( doc()->burningSize() > m_tempDirSelectionWidget->freeTempSpace() ) { if( KMessageBox::warningContinueCancel( this, i18n("There does not seem to be enough free space in the temporary folder. " "Write anyway?") ) == KMessageBox::Cancel ) return; } } } K3b::JobProgressDialog* dlg = 0; if( m_checkOnlyCreateImage && m_checkOnlyCreateImage->isChecked() ) dlg = new K3b::JobProgressDialog( parentWidget() ); else dlg = new K3b::BurnProgressDialog( parentWidget() ); m_job = m_doc->newBurnJob( dlg ); if( m_writerSelectionWidget ) m_job->setWritingApp( m_writerSelectionWidget->writingApp() ); prepareJob( m_job ); hideTemporarily(); dlg->startJob(m_job); qDebug() << "(K3b::ProjectBurnDialog) job done. cleaning up."; delete m_job; m_job = 0; delete dlg; done( Burn ); } void K3b::ProjectBurnDialog::prepareGui() { QVBoxLayout* mainLay = new QVBoxLayout( mainWidget() ); mainLay->setContentsMargins( 0, 0, 0, 0 ); m_writerSelectionWidget = new K3b::WriterSelectionWidget( mainWidget() ); m_writerSelectionWidget->setWantedMediumType( m_doc->supportedMediaTypes() ); m_writerSelectionWidget->setWantedMediumState( K3b::Device::STATE_EMPTY ); m_writerSelectionWidget->setWantedMediumSize( m_doc->length() ); mainLay->addWidget( m_writerSelectionWidget ); m_tabWidget = new QTabWidget( mainWidget() ); mainLay->addWidget( m_tabWidget ); QWidget* w = new QWidget( m_tabWidget ); m_tabWidget->addTab( w, i18n("Writing") ); QGroupBox* groupWritingMode = new QGroupBox( i18n("Writing Mode"), w ); m_writingModeWidget = new K3b::WritingModeWidget( groupWritingMode ); QVBoxLayout* groupWritingModeLayout = new QVBoxLayout( groupWritingMode ); groupWritingModeLayout->addWidget( m_writingModeWidget ); m_optionGroup = new QGroupBox( i18n("Settings"), w ); m_optionGroupLayout = new QVBoxLayout( m_optionGroup ); // add the options m_checkCacheImage = K3b::StdGuiItems::createCacheImageCheckbox( m_optionGroup ); m_checkSimulate = K3b::StdGuiItems::simulateCheckbox( m_optionGroup ); m_checkRemoveBufferFiles = K3b::StdGuiItems::removeImagesCheckbox( m_optionGroup ); m_checkOnlyCreateImage = K3b::StdGuiItems::onlyCreateImagesCheckbox( m_optionGroup ); m_optionGroupLayout->addWidget(m_checkSimulate); m_optionGroupLayout->addWidget(m_checkCacheImage); m_optionGroupLayout->addWidget(m_checkOnlyCreateImage); m_optionGroupLayout->addWidget(m_checkRemoveBufferFiles); QGroupBox* groupCopies = new QGroupBox( i18n("Copies"), w ); QLabel* pixLabel = new QLabel( groupCopies ); pixLabel->setPixmap( SmallIcon( "tools-media-optical-copy", KIconLoader::SizeMedium ) ); pixLabel->setScaledContents( false ); m_spinCopies = new QSpinBox( groupCopies ); m_spinCopies->setRange( 1, 999 ); QHBoxLayout* groupCopiesLayout = new QHBoxLayout( groupCopies ); groupCopiesLayout->addWidget( pixLabel ); groupCopiesLayout->addWidget( m_spinCopies ); // arrange it QGridLayout* grid = new QGridLayout( w ); grid->addWidget( groupWritingMode, 0, 0 ); grid->addWidget( m_optionGroup, 0, 1, 3, 1 ); grid->addWidget( groupCopies, 2, 0 ); // grid->addWidget( m_tempDirSelectionWidget, 1, 1, 3, 1 ); grid->setRowStretch( 1, 1 ); grid->setColumnStretch( 1, 1 ); - QWidget* tempW = new QWidget( m_tabWidget ); + QWidget *tempW = new QWidget( m_tabWidget ); grid = new QGridLayout( tempW ); m_tabWidget->addTab( tempW, i18n("Image") ); m_tempDirSelectionWidget = new K3b::TempDirSelectionWidget( tempW ); grid->addWidget( m_tempDirSelectionWidget, 0, 0 ); m_tempDirSelectionWidget->setNeededSize( doc()->size() ); // tab order setTabOrder( m_writerSelectionWidget, m_writingModeWidget ); setTabOrder( m_writingModeWidget, groupCopies ); setTabOrder( groupCopies, m_optionGroup ); // some default connections that should always be useful connect( m_writerSelectionWidget, SIGNAL(writerChanged()), this, SLOT(slotWriterChanged()) ); connect( m_writerSelectionWidget, SIGNAL(writerChanged(K3b::Device::Device*)), m_writingModeWidget, SLOT(determineSupportedModesFromMedium(K3b::Device::Device*)) ); connect( m_writerSelectionWidget, SIGNAL(writingAppChanged(K3b::WritingApp)), this, SLOT(slotWritingAppChanged(K3b::WritingApp)) ); connect( m_checkCacheImage, SIGNAL(toggled(bool)), this, SLOT(slotToggleAll()) ); connect( m_checkSimulate, SIGNAL(toggled(bool)), this, SLOT(slotToggleAll()) ); connect( m_checkOnlyCreateImage, SIGNAL(toggled(bool)), this, SLOT(slotToggleAll()) ); connect( m_writingModeWidget, SIGNAL(writingModeChanged(WritingMode)), this, SLOT(slotToggleAll()) ); connect( m_checkOnlyCreateImage, SIGNAL(toggled(bool)), this, SLOT(slotShowImageTip(bool)) ); connect( m_checkCacheImage, SIGNAL(toggled(bool)), this, SLOT(slotShowImageTip(bool)) ); } void K3b::ProjectBurnDialog::addPage( QWidget* page, const QString& title ) { m_tabWidget->addTab( page, title ); } void K3b::ProjectBurnDialog::saveSettingsToProject() { m_doc->setDummy( m_checkSimulate->isChecked() ); m_doc->setOnTheFly( !m_checkCacheImage->isChecked() ); m_doc->setOnlyCreateImages( m_checkOnlyCreateImage->isChecked() ); m_doc->setRemoveImages( m_checkRemoveBufferFiles->isChecked() ); m_doc->setSpeed( m_writerSelectionWidget->writerSpeed() ); m_doc->setBurner( m_writerSelectionWidget->writerDevice() ); m_doc->setWritingMode( m_writingModeWidget->writingMode() ); m_doc->setWritingApp( m_writerSelectionWidget->writingApp() ); m_doc->setCopies( m_spinCopies->value() ); } void K3b::ProjectBurnDialog::readSettingsFromProject() { m_checkSimulate->setChecked( doc()->dummy() ); m_checkCacheImage->setChecked( !doc()->onTheFly() ); m_checkOnlyCreateImage->setChecked( m_doc->onlyCreateImages() ); m_checkRemoveBufferFiles->setChecked( m_doc->removeImages() ); m_writingModeWidget->setWritingMode( doc()->writingMode() ); m_writerSelectionWidget->setWriterDevice( doc()->burner() ); m_writerSelectionWidget->setSpeed( doc()->speed() ); m_writerSelectionWidget->setWritingApp( doc()->writingApp() ); m_writerSelectionWidget->setWantedMediumType( doc()->supportedMediaTypes() ); m_spinCopies->setValue( m_doc->copies() ); } void K3b::ProjectBurnDialog::saveSettings( KConfigGroup c ) { m_writingModeWidget->saveConfig( c ); c.writeEntry( "simulate", m_checkSimulate->isChecked() ); c.writeEntry( "on_the_fly", !m_checkCacheImage->isChecked() ); c.writeEntry( "remove_image", m_checkRemoveBufferFiles->isChecked() ); c.writeEntry( "only_create_image", m_checkOnlyCreateImage->isChecked() ); c.writeEntry( "copies", m_spinCopies->value() ); m_tempDirSelectionWidget->saveConfig( c ); m_writerSelectionWidget->saveConfig( c ); } void K3b::ProjectBurnDialog::loadSettings( const KConfigGroup& c ) { m_writingModeWidget->loadConfig( c ); m_checkSimulate->setChecked( c.readEntry( "simulate", false ) ); m_checkCacheImage->setChecked( !c.readEntry( "on_the_fly", true ) ); m_checkRemoveBufferFiles->setChecked( c.readEntry( "remove_image", true ) ); m_checkOnlyCreateImage->setChecked( c.readEntry( "only_create_image", false ) ); m_spinCopies->setValue( c.readEntry( "copies", 1 ) ); m_tempDirSelectionWidget->readConfig( c ); m_writerSelectionWidget->loadConfig( c ); } void K3b::ProjectBurnDialog::slotShowImageTip( bool buttonActivated ) { - if ( buttonActivated && isVisible() ) { + if (buttonActivated && isVisible()) { // FIXME: use the tab bar's position - QWhatsThis::showText( mapToGlobal( QPoint( rect().center().x(), rect().top() ) ),i18n( "Use the 'Image' tab to optionally adjust the path of the image." )); + QWhatsThis::showText(mapToGlobal(QPoint(rect().center().x(), rect().top())), m_imageTipText); } } diff --git a/src/projects/k3bprojectburndialog.h b/src/projects/k3bprojectburndialog.h index 904d2dcc5..e5691760a 100644 --- a/src/projects/k3bprojectburndialog.h +++ b/src/projects/k3bprojectburndialog.h @@ -1,183 +1,184 @@ /* * * Copyright (C) 2003-2009 Sebastian Trueg * * This file is part of the K3b project. * Copyright (C) 1998-2009 Sebastian Trueg * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * See the file "COPYING" for the exact licensing terms. */ #ifndef K3BPROJECTBURNDIALOG_H #define K3BPROJECTBURNDIALOG_H #include "k3binteractiondialog.h" #include "k3bglobals.h" #include class QGroupBox; class QCheckBox; class QTabWidget; class QSpinBox; class QVBoxLayout; namespace K3b { class Doc; class BurnJob; class WriterSelectionWidget; class TempDirSelectionWidget; class WritingModeWidget; /** *@author Sebastian Trueg */ class ProjectBurnDialog : public InteractionDialog { Q_OBJECT public: ProjectBurnDialog( Doc* doc, QWidget *parent=0 ); ~ProjectBurnDialog(); enum resultCode { Canceled = 0, Saved = 1, Burn = 2 }; /** * shows the dialog with exec(). * Use this instead of InteractionDialog::exec * \param burn If true the dialog shows the Burn-button */ int execBurnDialog( bool burn ); Doc* doc() const { return m_doc; } protected Q_SLOTS: /** burn */ virtual void slotStartClicked(); /** save */ virtual void slotSaveClicked(); virtual void slotCancelClicked(); /** * gets called if the user changed the writer * default implementation just calls * toggleAllOptions() */ virtual void slotWriterChanged(); /** * gets called if the user changed the writing app * default implementation just calls * toggleAllOptions() */ virtual void slotWritingAppChanged( K3b::WritingApp ); Q_SIGNALS: void writerChanged(); protected: /** * The default implementation loads the following settings from the KConfig. * May be used in subclasses. *

    *
  • Writing mode
  • *
  • Simulate
  • *
  • on the fly
  • *
  • remove images
  • *
  • only create images
  • *
  • writer
  • *
  • writing speed
  • *
*/ virtual void loadSettings( const KConfigGroup& ); /** * The default implementation saves the following settings to the KConfig. * May be used in subclasses. *
    *
  • Writing mode
  • *
  • Simulate
  • *
  • on the fly
  • *
  • remove images
  • *
  • only create images
  • *
  • writer
  • *
  • writing speed
  • *
*/ virtual void saveSettings( KConfigGroup ); /** * The default implementation saves the following settings to the doc and may be called * in subclasses: *
    *
  • Writing mode
  • *
  • Simulate
  • *
  • on the fly
  • *
  • remove images
  • *
  • only create images
  • *
  • writer
  • *
  • writing speed
  • *
*/ virtual void saveSettingsToProject(); /** * The default implementation reads the following settings from the doc and may be called * in subclasses: *
    *
  • Writing mode
  • *
  • Simulate
  • *
  • on the fly
  • *
  • remove images
  • *
  • only create images
  • *
  • writer
  • *
  • writing speed
  • *
*/ virtual void readSettingsFromProject(); virtual void toggleAll(); /** * use this to set additionell stuff in the job */ virtual void prepareJob( BurnJob* ) {}; void prepareGui(); void addPage( QWidget*, const QString& title ); /** * Call this if you must reimplement it. * \reimplemented from InteractionDialog */ virtual void init(); WriterSelectionWidget* m_writerSelectionWidget; TempDirSelectionWidget* m_tempDirSelectionWidget; WritingModeWidget* m_writingModeWidget; QGroupBox* m_optionGroup; QVBoxLayout* m_optionGroupLayout; QCheckBox* m_checkCacheImage; QCheckBox* m_checkSimulate; QCheckBox* m_checkRemoveBufferFiles; QCheckBox* m_checkOnlyCreateImage; QSpinBox* m_spinCopies; + QTabWidget *m_tabWidget; + QString m_imageTipText; private Q_SLOTS: void slotShowImageTip( bool buttonActivated ); private: Doc* m_doc; BurnJob* m_job; - QTabWidget* m_tabWidget; }; } #endif