diff options
Diffstat (limited to 'src/k3btempdirselectionwidget.cpp')
-rw-r--r-- | src/k3btempdirselectionwidget.cpp | 277 |
1 files changed, 277 insertions, 0 deletions
diff --git a/src/k3btempdirselectionwidget.cpp b/src/k3btempdirselectionwidget.cpp new file mode 100644 index 0000000..ae850e1 --- /dev/null +++ b/src/k3btempdirselectionwidget.cpp @@ -0,0 +1,277 @@ +/* + * + * $Id: k3btempdirselectionwidget.cpp 690207 2007-07-20 10:40:19Z trueg $ + * Copyright (C) 2003 Sebastian Trueg <[email protected]> + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg <[email protected]> + * + * 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 <k3bglobals.h> +#include <k3bcore.h> + +#include <qlabel.h> +#include <qgroupbox.h> +#include <qlayout.h> +#include <qtimer.h> +#include <qhbox.h> +#include <qtooltip.h> +#include <qwhatsthis.h> +#include <qfileinfo.h> + +#include <kconfig.h> +#include <klocale.h> +#include <kfiledialog.h> +#include <kdialog.h> +#include <kstandarddirs.h> +#include <kiconloader.h> +#include <kurlrequester.h> +#include <kio/global.h> +#include <kconfig.h> +#include <klineedit.h> + + +K3bTempDirSelectionWidget::K3bTempDirSelectionWidget( QWidget *parent, const char *name ) + : QGroupBox( 4, Qt::Vertical, parent, name ), + m_labelCdSize(0), + m_defaultImageFileName( "k3b_image.iso" ) +{ + layout()->setSpacing( KDialog::spacingHint() ); + layout()->setMargin( KDialog::marginHint() ); + + m_imageFileLabel = new QLabel( this ); + m_editDirectory = new KURLRequester( this, "m_editDirectory" ); + + m_imageFileLabel->setBuddy( m_editDirectory ); + + QHBox* freeTempSpaceBox = new QHBox( this ); + freeTempSpaceBox->setSpacing( KDialog::spacingHint() ); + (void)new QLabel( i18n( "Free space in temporary directory:" ), freeTempSpaceBox, "TextLabel2" ); + m_labelFreeSpace = new QLabel( " ",freeTempSpaceBox, "m_labelFreeSpace" ); + m_labelFreeSpace->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) ); + + + connect( m_editDirectory, SIGNAL(openFileDialog(KURLRequester*)), + this, SLOT(slotTempDirButtonPressed(KURLRequester*)) ); + connect( m_editDirectory, SIGNAL(textChanged(const QString&)), + this, SLOT(slotUpdateFreeTempSpace()) ); + connect( m_editDirectory->lineEdit(), SIGNAL(lostFocus()), + this, SLOT(slotFixTempPath()) ); + + // choose a default + setSelectionMode( DIR ); + + m_editDirectory->setURL( K3b::defaultTempPath() ); + slotUpdateFreeTempSpace(); + + // ToolTips + // -------------------------------------------------------------------------------- + QToolTip::add( m_editDirectory, i18n("The directory in which to save the image files") ); + + // What's This info + // -------------------------------------------------------------------------------- + QWhatsThis::add( m_editDirectory, i18n("<p>This is the directory in which K3b will save the <em>image files</em>." + "<p>Please make sure that it resides on a partition that has enough free space.") ); +} + + +K3bTempDirSelectionWidget::~K3bTempDirSelectionWidget() +{ +} + + +unsigned long K3bTempDirSelectionWidget::freeTempSpace() const +{ + QString path = m_editDirectory->url(); + + if( !QFile::exists( path ) ) + path.truncate( path.findRev('/') ); + + unsigned long size; + K3b::kbFreeOnFs( path, size, m_freeTempSpace ); + + return m_freeTempSpace; +} + + +void K3bTempDirSelectionWidget::slotUpdateFreeTempSpace() +{ + // update the temp space + freeTempSpace(); + + m_labelFreeSpace->setText( KIO::convertSizeFromKB(m_freeTempSpace) ); + + if( m_labelCdSize ) { + if( m_freeTempSpace < m_requestedSize/1024 ) + m_labelCdSize->setPaletteForegroundColor( red ); + else + m_labelCdSize->setPaletteForegroundColor( m_labelFreeSpace->paletteForegroundColor() ); + } + QTimer::singleShot( 1000, this, SLOT(slotUpdateFreeTempSpace()) ); +} + + +void K3bTempDirSelectionWidget::slotTempDirButtonPressed( KURLRequester* r ) +{ + // set the correct mode for the filedialog + if( m_mode == DIR ) { + r->setCaption( i18n("Select Temporary Directory") ); + r->setMode( KFile::Directory | KFile::ExistingOnly | KFile::LocalOnly ); + } + else { + r->setCaption( i18n("Select Temporary File") ); + r->setMode( KFile::File | KFile::LocalOnly ); + } +} + + +void K3bTempDirSelectionWidget::setTempPath( const QString& dir ) +{ + m_editDirectory->setURL( dir ); + slotUpdateFreeTempSpace(); +} + + +QString K3bTempDirSelectionWidget::tempPath() const +{ + QFileInfo fi( m_editDirectory->url() ); + + if( fi.exists() ) { + if( m_mode == DIR ) { + if( fi.isDir() ) + return fi.absFilePath(); + else + return fi.dirPath( true ); + } + else { + if( fi.isFile() ) + return fi.absFilePath(); + else + return fi.absFilePath() + "/k3b_image.iso"; + } + } + else { + return fi.absFilePath(); + } +} + + +QString K3bTempDirSelectionWidget::plainTempPath() const +{ + return m_editDirectory->url(); +} + + +QString K3bTempDirSelectionWidget::tempDirectory() const +{ + QString td( m_editDirectory->url() ); + + // 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.findRev( '/' ) + 1 ); + return td; +} + + +void K3bTempDirSelectionWidget::setSelectionMode( int mode ) +{ + m_mode = mode; + + if( m_mode == DIR ) { + m_imageFileLabel->setText( i18n( "Wri&te image files to:" ) ); + setTitle( i18n("Temporary Directory") ); + } + else { + m_imageFileLabel->setText( i18n( "Wri&te image file to:" ) ); + setTitle( i18n("Temporary File") ); + } +} + + +void K3bTempDirSelectionWidget::setNeededSize( KIO::filesize_t bytes ) +{ + m_requestedSize = bytes; + if( !m_labelCdSize ) { + QHBox* cdSizeBox = new QHBox( this ); + cdSizeBox->setSpacing( KDialog::spacingHint() ); + (void)new QLabel( i18n( "Size of project:" ), cdSizeBox, "TextLabel4" ); + m_labelCdSize = new QLabel( KIO::convertSize(bytes), cdSizeBox, "m_labelCdSize" ); + m_labelCdSize->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) ); + } + m_labelCdSize->setText( KIO::convertSize(bytes) ); +} + + +void K3bTempDirSelectionWidget::saveConfig() +{ + KConfigGroup grp( k3bcore->config(), "General Options" ); + grp.writePathEntry( "Temp Dir", tempDirectory() ); +} + + +void K3bTempDirSelectionWidget::readConfig( KConfigBase* c ) +{ + setTempPath( c->readPathEntry( "image path", K3b::defaultTempPath() ) ); +} + + +void K3bTempDirSelectionWidget::saveConfig( KConfigBase* c ) +{ + c->writePathEntry( "image path", tempPath() ); +} + + +void K3bTempDirSelectionWidget::setDefaultImageFileName( const QString& name ) +{ + if ( !name.isEmpty() ) { + bool changeImageName = false; + if ( selectionMode() == FILE ) { + if ( plainTempPath().section( '/', -1 ) == m_defaultImageFileName ) { + changeImageName = true; + } + } + + m_defaultImageFileName = name; + if ( !m_defaultImageFileName.contains( '.' ) ) { + m_defaultImageFileName += ".iso"; + } + fixTempPath( changeImageName ); + } +} + + +void K3bTempDirSelectionWidget::slotFixTempPath() +{ + fixTempPath( false ); +} + + +void K3bTempDirSelectionWidget::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 ); + } + } +} + +#include "k3btempdirselectionwidget.moc" |