You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
344 lines
11 KiB
344 lines
11 KiB
/*
|
|
*
|
|
* $Id: k3bblankingdialog.cpp 689551 2007-07-18 14:53:32Z trueg $
|
|
* Copyright (C) 2003 Sebastian Trueg <trueg@k3b.org>
|
|
*
|
|
* This file is part of the K3b project.
|
|
* Copyright (C) 1998-2007 Sebastian Trueg <trueg@k3b.org>
|
|
*
|
|
* 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 "k3bblankingdialog.h"
|
|
#include "k3bdebuggingoutputdialog.h"
|
|
#include "k3bdebuggingoutputfile.h"
|
|
|
|
#include <k3bdevice.h>
|
|
#include <k3bdevicemanager.h>
|
|
#include "k3bblankingjob.h"
|
|
#include "k3bwriterselectionwidget.h"
|
|
#include <k3bprogressdialog.h>
|
|
#include <k3bglobals.h>
|
|
#include <k3bcore.h>
|
|
#include <k3bemptydiscwaiter.h>
|
|
|
|
#include <klocale.h>
|
|
#include <kmessagebox.h>
|
|
#include <klistview.h>
|
|
#include <kiconloader.h>
|
|
#include <kguiitem.h>
|
|
#include <kstdguiitem.h>
|
|
#include <kconfig.h>
|
|
|
|
#include <tqgroupbox.h>
|
|
#include <tqpushbutton.h>
|
|
#include <tqcheckbox.h>
|
|
#include <tqlayout.h>
|
|
#include <tqtextview.h>
|
|
#include <tqcombobox.h>
|
|
#include <tqlabel.h>
|
|
#include <tqheader.h>
|
|
#include <tqmap.h>
|
|
#include <tqtooltip.h>
|
|
#include <tqwhatsthis.h>
|
|
|
|
|
|
|
|
class K3bBlankingDialog::Private
|
|
{
|
|
public:
|
|
Private()
|
|
: job(0),
|
|
erasingDlg(0) {
|
|
}
|
|
|
|
K3bBlankingJob* job;
|
|
K3bProgressDialog* erasingDlg;
|
|
K3bDebuggingOutputDialog* debugDialog;
|
|
K3bDebuggingOutputFile debugFile;
|
|
TQMap<int, int> comboTypeMap;
|
|
TQMap<int, int> typeComboMap;
|
|
|
|
bool jobRunning;
|
|
};
|
|
|
|
|
|
K3bBlankingDialog::K3bBlankingDialog( TQWidget* parent, const char* name )
|
|
: K3bInteractionDialog( parent, name,
|
|
i18n("Erase CD-RW"),
|
|
TQString(),
|
|
START_BUTTON|CANCEL_BUTTON,
|
|
START_BUTTON,
|
|
"CDRW Erasing" )
|
|
{
|
|
d = new Private();
|
|
d->debugDialog = new K3bDebuggingOutputDialog( this );
|
|
|
|
setupGui();
|
|
|
|
connect( m_writerSelectionWidget, TQT_SIGNAL(writerChanged()), this, TQT_SLOT(slotWriterChanged()) );
|
|
connect( m_writerSelectionWidget, TQT_SIGNAL(writingAppChanged(int)), this, TQT_SLOT(slotWritingAppChanged(int)) );
|
|
slotWriterChanged();
|
|
slotWritingAppChanged( m_writerSelectionWidget->writingApp() );
|
|
}
|
|
|
|
|
|
K3bBlankingDialog::~K3bBlankingDialog()
|
|
{
|
|
delete d;
|
|
}
|
|
|
|
|
|
void K3bBlankingDialog::setDevice( K3bDevice::Device* dev )
|
|
{
|
|
m_writerSelectionWidget->setWriterDevice( dev );
|
|
}
|
|
|
|
|
|
void K3bBlankingDialog::setupGui()
|
|
{
|
|
TQWidget* frame = mainWidget();
|
|
|
|
m_writerSelectionWidget = new K3bWriterSelectionWidget( frame );
|
|
m_writerSelectionWidget->setWantedMediumType( K3bDevice::MEDIA_CD_RW );
|
|
m_writerSelectionWidget->setWantedMediumState( K3bDevice::STATE_COMPLETE|K3bDevice::STATE_INCOMPLETE );
|
|
|
|
// --- setup the blanking type button group -----------------------------
|
|
TQGroupBox* groupBlankType = new TQGroupBox( 1, Qt::Vertical, i18n("&Erase Type"), frame );
|
|
groupBlankType->layout()->setSpacing( spacingHint() );
|
|
groupBlankType->layout()->setMargin( marginHint() );
|
|
|
|
m_comboEraseMode = new TQComboBox( groupBlankType );
|
|
// ----------------------------------------------------------------------
|
|
|
|
TQGridLayout* grid = new TQGridLayout( frame );
|
|
grid->setSpacing( spacingHint() );
|
|
grid->setMargin( 0 );
|
|
grid->addWidget( m_writerSelectionWidget, 0, 0 );
|
|
grid->addWidget( groupBlankType, 1, 0 );
|
|
}
|
|
|
|
|
|
void K3bBlankingDialog::slotStartClicked()
|
|
{
|
|
// start the blankingjob and connect to the info-signal
|
|
// disable the user1 button and enable the cancel button
|
|
d->debugDialog->clear();
|
|
d->debugFile.open();
|
|
|
|
if( d->job == 0 ) {
|
|
d->job = new K3bBlankingJob( this, TQT_TQOBJECT(this) );
|
|
connect( d->job, TQT_SIGNAL(debuggingOutput(const TQString&, const TQString&)),
|
|
d->debugDialog, TQT_SLOT(addOutput(const TQString&, const TQString&)) );
|
|
connect( d->job, TQT_SIGNAL(debuggingOutput(const TQString&, const TQString&)),
|
|
&d->debugFile, TQT_SLOT(addOutput(const TQString&, const TQString&)) );
|
|
connect( d->job, TQT_SIGNAL(finished(bool)),
|
|
this, TQT_SLOT(slotJobFinished(bool)) );
|
|
}
|
|
|
|
d->job->setDevice( m_writerSelectionWidget->writerDevice() );
|
|
d->job->setSpeed( m_writerSelectionWidget->writerSpeed() );
|
|
// why should one ever not want to force?
|
|
d->job->setForce( true );
|
|
d->job->setWritingApp(m_writerSelectionWidget->writingApp());
|
|
d->job->setMode( d->comboTypeMap[m_comboEraseMode->currentItem()] );
|
|
|
|
if( !d->erasingDlg )
|
|
d->erasingDlg = new K3bProgressDialog( i18n("Erasing CD-RW"), this );
|
|
|
|
connect( d->erasingDlg, TQT_SIGNAL(cancelClicked()), d->job, TQT_SLOT(cancel()) );
|
|
|
|
if( !exitLoopOnHide() )
|
|
hide();
|
|
|
|
d->jobRunning = true;
|
|
d->job->start();
|
|
if( d->jobRunning ) // in case the job already finished in the start slot
|
|
d->erasingDlg->exec(false);
|
|
|
|
if( KConfigGroup( k3bcore->config(), "General Options" ).readBoolEntry( "keep action dialogs open", false ) &&
|
|
!exitLoopOnHide() )
|
|
show();
|
|
else
|
|
close();
|
|
}
|
|
|
|
|
|
void K3bBlankingDialog::slotJobFinished( bool success )
|
|
{
|
|
d->jobRunning = false;
|
|
d->erasingDlg->hide();
|
|
d->debugFile.close();
|
|
|
|
if( success )
|
|
KMessageBox::information( this,
|
|
i18n("Successfully erased CD-RW."),
|
|
i18n("Success") );
|
|
else if( d->job->hasBeenCanceled() )
|
|
KMessageBox::information( this,
|
|
i18n("Erasing CD-RW canceled."),
|
|
i18n("Canceled") );
|
|
else if( KMessageBox::warningYesNo( this,
|
|
i18n("The Erasing process failed. Do you want to see the debugging output?"),
|
|
i18n("Erasing failed.") ) == KMessageBox::Yes )
|
|
d->debugDialog->exec();
|
|
}
|
|
|
|
|
|
void K3bBlankingDialog::slotWriterChanged()
|
|
{
|
|
// check if it is a cdrw writer
|
|
K3bDevice::Device* dev = m_writerSelectionWidget->writerDevice();
|
|
|
|
if( !dev )
|
|
setButtonEnabled( START_BUTTON, false );
|
|
else if( dev->writesCdrw() )
|
|
setButtonEnabled( START_BUTTON, true );
|
|
else {
|
|
setButtonEnabled( START_BUTTON, false );
|
|
KMessageBox::sorry( this, i18n("%1 does not support CD-RW writing.").arg(dev->devicename()) );
|
|
}
|
|
}
|
|
|
|
void K3bBlankingDialog::slotWritingAppChanged(int app)
|
|
{
|
|
TQWhatsThis::remove( m_comboEraseMode );
|
|
TQString whatsThisInfo;
|
|
|
|
static TQString wsComplete = i18n("Erases the complete disk. This takes as long "
|
|
"as writing the complete CD.");
|
|
static TQString wsFast = i18n("Erases just the TOC, the PMA, and the pregap.");
|
|
static TQString wsTrack = i18n("Erases just the last track.");
|
|
static TQString wsUnclose = i18n("Reopen the last session to make it possible to append "
|
|
"further data.");
|
|
static TQString wsSession = i18n("Erases the last session of a multisession CD.");
|
|
|
|
int lastMode = d->comboTypeMap[m_comboEraseMode->currentItem()];
|
|
|
|
m_comboEraseMode->clear();
|
|
d->comboTypeMap.clear();
|
|
d->typeComboMap.clear();
|
|
|
|
m_comboEraseMode->insertItem( i18n("Fast") );
|
|
d->comboTypeMap[0] = K3bBlankingJob::Fast;
|
|
d->typeComboMap[K3bBlankingJob::Fast] = 0;
|
|
m_comboEraseMode->insertItem( i18n("Complete") );
|
|
d->comboTypeMap[1] = K3bBlankingJob::Complete;
|
|
d->typeComboMap[K3bBlankingJob::Complete] = 1;
|
|
|
|
whatsThisInfo = "<p>" + i18n("Blanking mode:") +
|
|
"<p><b>" + i18n("Fast") + "</b><br>" + wsFast;
|
|
whatsThisInfo += "<p><b>" + i18n("Complete") + "</b><br>" + wsComplete;
|
|
|
|
if ( app != K3b::CDRDAO ) {
|
|
m_comboEraseMode->insertItem( i18n("Erase Last Track") );
|
|
d->comboTypeMap[2] = K3bBlankingJob::Track;
|
|
d->typeComboMap[K3bBlankingJob::Track] = 2;
|
|
whatsThisInfo += "<p><b>" + i18n("Erase Last Track") + "</b><br>" + wsTrack;
|
|
m_comboEraseMode->insertItem( i18n("Reopen Last Session") );
|
|
d->comboTypeMap[3] = K3bBlankingJob::Unclose;
|
|
d->typeComboMap[K3bBlankingJob::Unclose] = 3;
|
|
whatsThisInfo += "<p><b>" + i18n("Reopen Last Session") + "</b><br>" + wsUnclose;
|
|
m_comboEraseMode->insertItem( i18n("Erase Last Session") );
|
|
d->comboTypeMap[4] = K3bBlankingJob::Session;
|
|
d->typeComboMap[K3bBlankingJob::Session] = 4;
|
|
whatsThisInfo += "<p><b>" + i18n("Erase Last Session") + "</b><br>" + wsSession;
|
|
}
|
|
|
|
TQWhatsThis::add( m_comboEraseMode, whatsThisInfo );
|
|
|
|
// try to reset last mode
|
|
if( d->typeComboMap.contains( lastMode ) )
|
|
m_comboEraseMode->setCurrentItem( d->typeComboMap[lastMode] );
|
|
else
|
|
m_comboEraseMode->setCurrentItem( d->typeComboMap[K3bBlankingJob::Fast] );
|
|
}
|
|
|
|
|
|
void K3bBlankingDialog::loadK3bDefaults()
|
|
{
|
|
m_writerSelectionWidget->loadDefaults();
|
|
m_comboEraseMode->setCurrentItem( d->typeComboMap[K3bBlankingJob::Fast] );
|
|
}
|
|
|
|
void K3bBlankingDialog::loadUserDefaults( KConfigBase* c )
|
|
{
|
|
m_writerSelectionWidget->loadConfig( c );
|
|
slotWritingAppChanged( m_writerSelectionWidget->writingApp() );
|
|
|
|
TQString mode = c->readEntry( "erase_mode" );
|
|
kdDebug() << "(K3bBlankingDialog) slotWritingAppChanged mode: " << mode << endl;
|
|
m_comboEraseMode->setCurrentItem( d->typeComboMap[K3bBlankingJob::Fast] );
|
|
if( mode == "complete" )
|
|
m_comboEraseMode->setCurrentItem( d->typeComboMap[K3bBlankingJob::Complete] );
|
|
else if( d->typeComboMap.size() > 2 ) {
|
|
if( mode == "session" )
|
|
m_comboEraseMode->setCurrentItem( d->typeComboMap[K3bBlankingJob::Session] );
|
|
else if( mode == "track" )
|
|
m_comboEraseMode->setCurrentItem( d->typeComboMap[K3bBlankingJob::Track] );
|
|
else if( mode == "unclose_session" )
|
|
m_comboEraseMode->setCurrentItem( d->typeComboMap[K3bBlankingJob::Unclose] );
|
|
}
|
|
}
|
|
|
|
void K3bBlankingDialog::saveUserDefaults( KConfigBase* c )
|
|
{
|
|
TQString mode;
|
|
switch( d->comboTypeMap[m_comboEraseMode->currentItem()] ) {
|
|
case K3bBlankingJob::Complete:
|
|
mode = "complete";
|
|
break;
|
|
case K3bBlankingJob::Session:
|
|
mode = "session";
|
|
break;
|
|
case K3bBlankingJob::Track:
|
|
mode = "track";
|
|
break;
|
|
case K3bBlankingJob::Unclose:
|
|
mode = "unclose_session";
|
|
break;
|
|
default:
|
|
mode = "fast";
|
|
break;
|
|
}
|
|
c->writeEntry( "erase_mode", mode );
|
|
|
|
m_writerSelectionWidget->saveConfig( c );
|
|
}
|
|
|
|
|
|
int K3bBlankingDialog::waitForMedia( K3bDevice::Device* device,
|
|
int mediaState,
|
|
int mediaType,
|
|
const TQString& message )
|
|
{
|
|
// this is only needed for the formatting
|
|
return K3bEmptyDiscWaiter::wait( device, mediaState, mediaType, message, this );
|
|
}
|
|
|
|
|
|
bool K3bBlankingDialog::questionYesNo( const TQString& text,
|
|
const TQString& caption,
|
|
const TQString& yesText,
|
|
const TQString& noText )
|
|
{
|
|
return ( KMessageBox::questionYesNo( this,
|
|
text,
|
|
caption,
|
|
yesText.isEmpty() ? KStdGuiItem::yes() : KGuiItem(yesText),
|
|
noText.isEmpty() ? KStdGuiItem::no() : KGuiItem(noText) ) == KMessageBox::Yes );
|
|
}
|
|
|
|
|
|
void K3bBlankingDialog::blockingInformation( const TQString& text,
|
|
const TQString& caption )
|
|
{
|
|
KMessageBox::information( this, text, caption );
|
|
}
|
|
|
|
#include "k3bblankingdialog.moc"
|