From b6887381d7062e2150c5511d50ac03421bcc211d Mon Sep 17 00:00:00 2001 From: Michele Calgaro Date: Sun, 20 Nov 2016 23:58:22 +0900 Subject: Trash limit: add "fixed size" configuration option and code improvements. This relates to bug 1923. Signed-off-by: Michele Calgaro --- tdeioslave/trash/Makefile.am | 2 +- tdeioslave/trash/ktrashpropsdlgplugin.cpp | 337 +++++++++++++++------- tdeioslave/trash/ktrashpropsdlgplugin.h | 26 +- tdeioslave/trash/tdefile-plugin/tdefile_trash.cpp | 5 +- tdeioslave/trash/tdeio_trash.h | 1 + tdeioslave/trash/trash_constant.h | 41 +++ tdeioslave/trash/trashimpl.cpp | 51 ++-- tdeioslave/trash/trashimpl.h | 3 - 8 files changed, 328 insertions(+), 138 deletions(-) create mode 100644 tdeioslave/trash/trash_constant.h diff --git a/tdeioslave/trash/Makefile.am b/tdeioslave/trash/Makefile.am index a3c8253e0..ee27b3d2a 100644 --- a/tdeioslave/trash/Makefile.am +++ b/tdeioslave/trash/Makefile.am @@ -30,7 +30,7 @@ messages: $(XGETTEXT) `find . -name "*.cc" -o -name "*.cpp" -o -name "*.h"` -o $(podir)/tdeio_trash.pot # ktrashpropsdlgplugin target -noinst_HEADERS = ktrashpropsdlgplugin.h discspaceutil.h +noinst_HEADERS = ktrashpropsdlgplugin.h discspaceutil.h trash_constant.h ktrashpropsdlgplugin_la_SOURCES = ktrashpropsdlgplugin.cpp discspaceutil.cpp trashimpl.cpp ktrashpropsdlgplugin_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN) diff --git a/tdeioslave/trash/ktrashpropsdlgplugin.cpp b/tdeioslave/trash/ktrashpropsdlgplugin.cpp index 157790c5f..87a70ae45 100644 --- a/tdeioslave/trash/ktrashpropsdlgplugin.cpp +++ b/tdeioslave/trash/ktrashpropsdlgplugin.cpp @@ -22,13 +22,16 @@ #include "ktrashpropsdlgplugin.h" #include "discspaceutil.h" +#include "trash_constant.h" #include "trashimpl.h" +#include #include #include #include #include #include +#include #include #include @@ -40,6 +43,8 @@ #include +using namespace TrashConstant; + typedef KGenericFactory Factory; K_EXPORT_COMPONENT_FACTORY( ktrashpropsdlgplugin, Factory( "ktrashpropsdlgplugin" ) ) @@ -69,14 +74,25 @@ KTrashPropsDlgPlugin::KTrashPropsDlgPlugin( KPropertiesDialog *dialog, const cha TQFrame *frame = dialog->addPage( i18n( "Size Limits" ) ); setupGui( frame ); - mUseTimeLimit->setChecked( mConfigMap[ mCurrentTrash ].useTimeLimit ); mUseSizeLimit->setChecked( mConfigMap[ mCurrentTrash ].useSizeLimit ); + mSizeLimitType = mConfigMap[ mCurrentTrash ].sizeLimitType; + if ( mSizeLimitType == SIZE_LIMIT_FIXED ) + { + mRbFixedSize->setChecked( true ); + } + else + { + mRbPercentSize->setChecked( true ); + } + mDays->setValue( mConfigMap[ mCurrentTrash ].days ); - mPercent->setValue( mConfigMap[ mCurrentTrash ].percent ); - mPercent->setPrecision(3); + mPercentSize->setValue( mConfigMap[ mCurrentTrash ].percent ); + mFixedSize->setValue( mConfigMap[ mCurrentTrash ].fixedSize ); + mFixedSizeUnit->setCurrentItem( mConfigMap[ mCurrentTrash ].fixedSizeUnit ); mLimitReachedAction->setCurrentItem( mConfigMap[ mCurrentTrash ].actionType ); - percentChanged(mPercent->value()); + percentSizeChanged(mPercentSize->value()); + fixedSizeChanged(mFixedSize->value()); useTypeChanged(); @@ -90,20 +106,112 @@ KTrashPropsDlgPlugin::KTrashPropsDlgPlugin( KPropertiesDialog *dialog, const cha this, TQT_SLOT( setDirty() ) ); connect( mUseSizeLimit, TQT_SIGNAL( toggled( bool ) ), this, TQT_SLOT( useTypeChanged() ) ); - connect( mPercent, TQT_SIGNAL( valueChanged( double ) ), - this, TQT_SLOT( percentChanged( double ) ) ); - connect( mPercent, TQT_SIGNAL( valueChanged( double ) ), + connect( mPercentSize, TQT_SIGNAL( valueChanged( double ) ), + this, TQT_SLOT( percentSizeChanged( double ) ) ); + connect( mFixedSize, TQT_SIGNAL( valueChanged( double ) ), + this, TQT_SLOT( fixedSizeChanged( double ) ) ); + connect( mPercentSize, TQT_SIGNAL( valueChanged( double ) ), + this, TQT_SLOT( setDirty() ) ); + connect( mFixedSize, TQT_SIGNAL( valueChanged( double ) ), + this, TQT_SLOT( setDirty() ) ); + connect( mFixedSizeUnit, TQT_SIGNAL( activated( int ) ), + this, TQT_SLOT( fixedSizeUnitActivated( int ) ) ); + connect( mRbPercentSize, TQT_SIGNAL( toggled( bool ) ), + this, TQT_SLOT( rbPercentSizeToggled( bool ) ) ); + connect( mRbPercentSize, TQT_SIGNAL( toggled( bool ) ), + this, TQT_SLOT( setDirty() ) ); + connect( mRbFixedSize, TQT_SIGNAL( toggled( bool ) ), + this, TQT_SLOT( rbFixedSizeToggled( bool ) ) ); + connect( mRbFixedSize, TQT_SIGNAL( toggled( bool ) ), this, TQT_SLOT( setDirty() ) ); connect( mLimitReachedAction, TQT_SIGNAL( activated( int ) ), this, TQT_SLOT( setDirty() ) ); - trashChanged( 0 ); + trashChanged( 0 ); } KTrashPropsDlgPlugin::~KTrashPropsDlgPlugin() { } +void KTrashPropsDlgPlugin::setupGui( TQFrame *frame ) +{ + TQVBoxLayout *layout = new TQVBoxLayout( frame, 11, 6 ); + + TrashImpl::TrashDirMap map = mTrashImpl->trashDirectories(); + if ( map.count() != 1 ) { + // If we have multiple trashes, we setup a widget to choose + // which trash to configure + TQListBox *mountPoints = new TQListBox( frame ); + layout->addWidget( mountPoints ); + + const TQPixmap folderPixmap = TDEGlobal::iconLoader()->loadIcon( "folder", TDEIcon::Small ); + TQMapConstIterator it; + for ( it = map.begin(); it != map.end(); ++it ) { + DiscSpaceUtil util( it.data() ); + mountPoints->insertItem( folderPixmap, util.mountPoint(), it.key() ); + } + + mountPoints->setCurrentItem( 0 ); + + connect( mountPoints, TQT_SIGNAL( highlighted( int ) ), TQT_SLOT( trashChanged( int ) ) ); + } else { + mCurrentTrash = map[0]; + } + + TQHBoxLayout *daysLayout = new TQHBoxLayout( layout ); + + mUseTimeLimit = new TQCheckBox( i18n( "Delete files older than:" ), frame ); + daysLayout->addWidget( mUseTimeLimit ); + mDays = new TQSpinBox( 1, 365, 1, frame ); + mDays->setSuffix( " days" ); + daysLayout->addWidget( mDays ); + + TQGridLayout *sizeLayout = new TQGridLayout( layout, 2, 2 ); + mUseSizeLimit = new TQCheckBox( i18n( "Limit to maximum size" ), frame ); + sizeLayout->addMultiCellWidget( mUseSizeLimit, 0, 0, 0, 1 ); + + mSizeWidget = new TQWidget( frame ); + sizeLayout->setColSpacing( 0, 30 ); + sizeLayout->addWidget( mSizeWidget, 1, 1 ); + + TQGridLayout *sizeWidgetLayout = new TQGridLayout( mSizeWidget, 3, 3, 11, 6 ); + + mRbPercentSize = new TQRadioButton( i18n("&Percentage:"), mSizeWidget ); + mRbFixedSize = new TQRadioButton( i18n("&Fixed size:"), mSizeWidget ); + sizeWidgetLayout->addWidget( mRbPercentSize, 0, 0 ); + sizeWidgetLayout->addWidget( mRbFixedSize, 1, 0 ); + + mPercentSize = new KDoubleSpinBox( 0, 100, 0.1, 10, 2, mSizeWidget ); + mPercentSize->setSuffix( " %" ); + sizeWidgetLayout->addWidget( mPercentSize, 0, 1 ); + mSizeLabel = new TQLabel( mSizeWidget ); + sizeWidgetLayout->addWidget( mSizeLabel, 0, 2 ); + + mFixedSize = new KDoubleSpinBox( 0, 1024*1024, 1, 500, 2, mSizeWidget ); + sizeWidgetLayout->addWidget( mFixedSize, 1, 1 ); + mFixedSizeUnit = new TQComboBox( mSizeWidget ); + mFixedSizeUnit->setEditable( false ); + mFixedSizeUnit->insertItem( i18n( "Bytes" ), SIZE_ID_B ); + mFixedSizeUnit->insertItem( i18n( "KBytes" ), SIZE_ID_KB ); + mFixedSizeUnit->insertItem( i18n( "MBytes" ), SIZE_ID_MB ); + mFixedSizeUnit->insertItem( i18n( "GBytes" ), SIZE_ID_GB ); + mFixedSizeUnit->insertItem( i18n( "TBytes" ), SIZE_ID_TB ); + mFixedSizeUnit->setCurrentItem( 2 ); + sizeWidgetLayout->addWidget( mFixedSizeUnit, 1, 2 ); + + TQLabel *label = new TQLabel( i18n( "When limit reached:" ), mSizeWidget ); + sizeWidgetLayout->addWidget( label, 2, 0 ); + + mLimitReachedAction = new TQComboBox( mSizeWidget ); + mLimitReachedAction->insertItem( i18n( "Warn me" ) ); + mLimitReachedAction->insertItem( i18n( "Delete oldest files from trash" ) ); + mLimitReachedAction->insertItem( i18n( "Delete biggest files from trash" ) ); + sizeWidgetLayout->addMultiCellWidget( mLimitReachedAction, 2, 2, 1, 2 ); + + layout->addStretch(); +} + void KTrashPropsDlgPlugin::applyChanges() { if ( !mCurrentTrash.isEmpty() ) { @@ -111,7 +219,17 @@ void KTrashPropsDlgPlugin::applyChanges() entry.useTimeLimit = mUseTimeLimit->isChecked(); entry.days = mDays->value(); entry.useSizeLimit = mUseSizeLimit->isChecked(); - entry.percent = mPercent->value(), + if (mRbFixedSize->isChecked()) + { + entry.sizeLimitType = SIZE_LIMIT_FIXED; + } + else + { + entry.sizeLimitType = SIZE_LIMIT_PERCENT; + } + entry.percent = mPercentSize->value(); + entry.fixedSize = mFixedSize->value(); + entry.fixedSizeUnit = mFixedSizeUnit->currentItem(); entry.actionType = mLimitReachedAction->currentItem(); mConfigMap.insert( mCurrentTrash, entry ); } @@ -119,41 +237,107 @@ void KTrashPropsDlgPlugin::applyChanges() writeConfig(); } -void KTrashPropsDlgPlugin::percentChanged( double percent ) +void KTrashPropsDlgPlugin::percentSizeChanged( double percent ) { DiscSpaceUtil util( mCurrentTrash ); - double partitionSize = util.size() * 1024.0; // convert to byte - double size = partitionSize*(percent/100.0); - // FIXME It would be good if precision step depended on max HD size - mPercent->setPrecision(3); - - TQString unit = i18n( "Byte" ); - if ( size > 1024 ) { - unit = i18n( "KByte" ); + TQString unit = i18n( "Bytes" ); + if ( size >= 1024 ) { + unit = i18n( "KBytes" ); size = size/1024.0; - mPercent->setLineStep(0.001); } - if ( size > 1024 ) { - unit = i18n( "MByte" ); + if ( size >= 1024 ) { + unit = i18n( "MBytes" ); size = size/1024.0; - mPercent->setLineStep(0.01); } - if ( size > 1024 ) { - unit = i18n( "GByte" ); + if ( size >= 1024 ) { + unit = i18n( "GBytes" ); size = size/1024.0; - mPercent->setLineStep(0.1); } - if ( size > 1024 ) { - unit = i18n( "TByte" ); + if ( size >= 1024 ) { + unit = i18n( "TBytes" ); size = size/1024.0; - mPercent->setLineStep(1); } mSizeLabel->setText( i18n( "(%1 %2)" ).arg( TQString::number( size, 'f', 2 ) ).arg( unit ) ); +} +void KTrashPropsDlgPlugin::fixedSizeChanged( double value ) +{ + int currItem = mFixedSizeUnit->currentItem(); + if (value > 1023.999 && currItem >= SIZE_ID_TB) + { + // Max limit 1024 TBytes + mFixedSizeUnit->setCurrentItem(SIZE_ID_TB); + mFixedSize->setValue(1024.0); + } + else if (value > 1023.999 && currItem < SIZE_ID_TB) + { + // Scale up to higher measure unit + while (value > 1023.999 && currItem < SIZE_ID_TB) + { + ++currItem; + value /= 1024.0; + } + mFixedSizeUnit->setCurrentItem(currItem); + mFixedSize->setValue(value); + } + else if (value < 0.001) + { + // Scale down to lower measure unit + int currItem = mFixedSizeUnit->currentItem(); + if (currItem > SIZE_ID_B) + { + mFixedSizeUnit->setCurrentItem(currItem - 1); + mFixedSize->setValue(1023.0); + } + } + // Need to call this manually because "activated" is not emitted by "mFixedSizeUnit" + // when the index is changed programmatically (see TQComboBox API docs) + fixedSizeUnitActivated(mFixedSizeUnit->currentItem()); +} + +void KTrashPropsDlgPlugin::fixedSizeUnitActivated(int index) +{ + // Bytes can not be split into fractions + if (index == SIZE_ID_B) + { + mFixedSize->setPrecision(0); + } + else + { + mFixedSize->setPrecision(2); + } +} + +void KTrashPropsDlgPlugin::rbPercentSizeToggled( bool buttonOn) +{ + if (buttonOn) + { + mRbFixedSize->setChecked(false); + mSizeLimitType = SIZE_LIMIT_PERCENT; + } + else if (!mRbFixedSize->isChecked()) + { + // Set the button back on if the user clicked it twice + mRbPercentSize->setChecked(true); + } +} + +void KTrashPropsDlgPlugin::rbFixedSizeToggled( bool buttonOn) +{ + if (buttonOn) + { + mRbPercentSize->setChecked(false); + mSizeLimitType = SIZE_LIMIT_FIXED; + } + else if (!mRbPercentSize->isChecked()) + { + // Set the button back on if the user clicked it twice + mRbFixedSize->setChecked(true); + } } void KTrashPropsDlgPlugin::trashChanged( int value ) @@ -165,7 +349,10 @@ void KTrashPropsDlgPlugin::trashChanged( int value ) entry.useTimeLimit = mUseTimeLimit->isChecked(); entry.days = mDays->value(); entry.useSizeLimit = mUseSizeLimit->isChecked(); - entry.percent = mPercent->value(), + entry.sizeLimitType = mSizeLimitType; + entry.percent = mPercentSize->value(), + entry.fixedSize = mFixedSize->value(); + entry.fixedSizeUnit = mFixedSizeUnit->currentItem(); entry.actionType = mLimitReachedAction->currentItem(); mConfigMap.insert( mCurrentTrash, entry ); } @@ -177,17 +364,31 @@ void KTrashPropsDlgPlugin::trashChanged( int value ) mUseTimeLimit->setChecked( entry.useTimeLimit ); mDays->setValue( entry.days ); mUseSizeLimit->setChecked( entry.useSizeLimit ); - mPercent->setValue( entry.percent ); + if ( mSizeLimitType == SIZE_LIMIT_FIXED ) + { + mRbFixedSize->setChecked( true ); + } + else + { + mRbPercentSize->setChecked( true ); + } + mPercentSize->setValue( entry.percent ); + mFixedSize->setValue( entry.fixedSize ); + mFixedSizeUnit->setCurrentItem( entry.fixedSizeUnit ); mLimitReachedAction->setCurrentItem( entry.actionType ); } else { mUseTimeLimit->setChecked( false ); mDays->setValue( 7 ); mUseSizeLimit->setChecked( true ); - mPercent->setValue( 10.0 ); + mRbPercentSize->setChecked( true ); + mPercentSize->setValue( 10.0 ); + mFixedSize->setValue( 500 ); + mFixedSizeUnit->setCurrentItem( SIZE_ID_MB ); mLimitReachedAction->setCurrentItem( 0 ); } - percentChanged( mPercent->value() ); + percentSizeChanged( mPercentSize->value() ); + fixedSizeChanged( mFixedSize->value() ); } void KTrashPropsDlgPlugin::useTypeChanged() @@ -209,7 +410,10 @@ void KTrashPropsDlgPlugin::readConfig() entry.useTimeLimit = config.readBoolEntry( "UseTimeLimit", false ); entry.days = config.readNumEntry( "Days", 7 ); entry.useSizeLimit = config.readBoolEntry( "UseSizeLimit", true ); + entry.sizeLimitType = config.readNumEntry( "SizeLimitType", SIZE_LIMIT_PERCENT ); entry.percent = config.readDoubleNumEntry( "Percent", 10 ); + entry.fixedSize = config.readDoubleNumEntry( "FixedSize", 500 ); + entry.fixedSizeUnit = config.readNumEntry( "FixedSizeUnit", SIZE_ID_MB ); entry.actionType = config.readNumEntry( "LimitReachedAction", 0 ); mConfigMap.insert( groups[ i ], entry ); } @@ -232,77 +436,14 @@ void KTrashPropsDlgPlugin::writeConfig() config.writeEntry( "UseTimeLimit", it.data().useTimeLimit ); config.writeEntry( "Days", it.data().days ); config.writeEntry( "UseSizeLimit", it.data().useSizeLimit ); + config.writeEntry( "SizeLimitType", it.data().sizeLimitType ); config.writeEntry( "Percent", it.data().percent ); + config.writeEntry( "FixedSize", it.data().fixedSize ); + config.writeEntry( "FixedSizeUnit", it.data().fixedSizeUnit ); config.writeEntry( "LimitReachedAction", it.data().actionType ); } config.sync(); } -void KTrashPropsDlgPlugin::setupGui( TQFrame *frame ) -{ - TQVBoxLayout *layout = new TQVBoxLayout( frame, 11, 6 ); - - TrashImpl::TrashDirMap map = mTrashImpl->trashDirectories(); - if ( map.count() != 1 ) { - // If we have multiple trashes, we setup a widget to choose - // which trash to configure - TQListBox *mountPoints = new TQListBox( frame ); - layout->addWidget( mountPoints ); - - const TQPixmap folderPixmap = TDEGlobal::iconLoader()->loadIcon( "folder", TDEIcon::Small ); - TQMapConstIterator it; - for ( it = map.begin(); it != map.end(); ++it ) { - DiscSpaceUtil util( it.data() ); - mountPoints->insertItem( folderPixmap, util.mountPoint(), it.key() ); - } - - mountPoints->setCurrentItem( 0 ); - - connect( mountPoints, TQT_SIGNAL( highlighted( int ) ), TQT_SLOT( trashChanged( int ) ) ); - } else { - mCurrentTrash = map[0]; - } - - TQHBoxLayout *daysLayout = new TQHBoxLayout( layout ); - - mUseTimeLimit = new TQCheckBox( i18n( "Delete files older than:" ), frame ); - daysLayout->addWidget( mUseTimeLimit ); - mDays = new TQSpinBox( 1, 365, 1, frame ); - mDays->setSuffix( " days" ); - daysLayout->addWidget( mDays ); - - TQGridLayout *sizeLayout = new TQGridLayout( layout, 2, 2 ); - mUseSizeLimit = new TQCheckBox( i18n( "Limit to maximum size" ), frame ); - sizeLayout->addMultiCellWidget( mUseSizeLimit, 0, 0, 0, 1 ); - - mSizeWidget = new TQWidget( frame ); - sizeLayout->setColSpacing( 0, 30 ); - sizeLayout->addWidget( mSizeWidget, 1, 1 ); - - TQGridLayout *sizeWidgetLayout = new TQGridLayout( mSizeWidget, 2, 3, 11, 6 ); - - TQLabel *label = new TQLabel( i18n( "Maximum Size:" ), mSizeWidget ); - sizeWidgetLayout->addWidget( label, 0, 0 ); - - mPercent = new KDoubleSpinBox( 0.001, 100, 1, 10, 3, mSizeWidget ); - mPercent->setSuffix( " %" ); - sizeWidgetLayout->addWidget( mPercent, 0, 1 ); - - mSizeLabel = new TQLabel( mSizeWidget ); - sizeWidgetLayout->addWidget( mSizeLabel, 0, 2 ); - - label = new TQLabel( i18n( "When limit reached:" ), mSizeWidget ); - sizeWidgetLayout->addWidget( label, 1, 0 ); - - mLimitReachedAction = new TQComboBox( mSizeWidget ); - mLimitReachedAction->insertItem( i18n( "Warn me" ) ); - mLimitReachedAction->insertItem( i18n( "Delete oldest files from trash" ) ); - mLimitReachedAction->insertItem( i18n( "Delete biggest files from trash" ) ); - sizeWidgetLayout->addMultiCellWidget( mLimitReachedAction, 1, 1, 1, 2 ); - - layout->addStretch(); - -} - #include "ktrashpropsdlgplugin.moc" diff --git a/tdeioslave/trash/ktrashpropsdlgplugin.h b/tdeioslave/trash/ktrashpropsdlgplugin.h index b62ba127d..d21dd4578 100644 --- a/tdeioslave/trash/ktrashpropsdlgplugin.h +++ b/tdeioslave/trash/ktrashpropsdlgplugin.h @@ -22,13 +22,14 @@ #ifndef KTRASHPROPSDLGPLUGIN_H #define KTRASHPROPSDLGPLUGIN_H -#include +#include "kpropertiesdialog.h" class KDoubleSpinBox; class TQCheckBox; class TQComboBox; class TQFrame; class TQLabel; +class TQRadioButton; class TQSpinBox; class TrashImpl; @@ -43,21 +44,29 @@ class KTrashPropsDlgPlugin : public KPropsDlgPlugin virtual void applyChanges(); private slots: - void percentChanged( double ); + void percentSizeChanged( double ); + void fixedSizeChanged( double ); + void fixedSizeUnitActivated ( int ); + void rbPercentSizeToggled( bool ); + void rbFixedSizeToggled( bool ); void trashChanged( int ); void useTypeChanged(); - + private: void readConfig(); void writeConfig(); void setupGui( TQFrame *frame ); TQCheckBox *mUseTimeLimit; - TQSpinBox *mDays; + TQSpinBox *mDays; TQCheckBox *mUseSizeLimit; - TQWidget *mSizeWidget; - KDoubleSpinBox *mPercent; - TQLabel *mSizeLabel; + int mSizeLimitType; + TQWidget *mSizeWidget; + TQRadioButton *mRbPercentSize, *mRbFixedSize; + KDoubleSpinBox *mPercentSize; + KDoubleSpinBox *mFixedSize; + TQComboBox *mFixedSizeUnit; + TQLabel *mSizeLabel; TQComboBox *mLimitReachedAction; TrashImpl *mTrashImpl; @@ -67,7 +76,10 @@ class KTrashPropsDlgPlugin : public KPropsDlgPlugin bool useTimeLimit; int days; bool useSizeLimit; + int sizeLimitType; double percent; + double fixedSize; + int fixedSizeUnit; int actionType; } ConfigEntry; diff --git a/tdeioslave/trash/tdefile-plugin/tdefile_trash.cpp b/tdeioslave/trash/tdefile-plugin/tdefile_trash.cpp index 5c903fcb8..e7bfdc280 100644 --- a/tdeioslave/trash/tdefile-plugin/tdefile_trash.cpp +++ b/tdeioslave/trash/tdefile-plugin/tdefile_trash.cpp @@ -51,9 +51,8 @@ void KTrashPlugin::makeMimeTypeInfo(const TQString& mimeType) KFileMimeTypeInfo::GroupInfo* group = addGroupInfo(info, "General", i18n("General")); - KFileMimeTypeInfo::ItemInfo* item; - item = addItemInfo(group, "OriginalPath", i18n("Original Path"), TQVariant::String); - item = addItemInfo(group, "DateOfDeletion", i18n("Date of Deletion"), TQVariant::DateTime); + addItemInfo(group, "OriginalPath", i18n("Original Path"), TQVariant::String); + addItemInfo(group, "DateOfDeletion", i18n("Date of Deletion"), TQVariant::DateTime); } bool KTrashPlugin::readInfo(KFileMetaInfo& info, uint) diff --git a/tdeioslave/trash/tdeio_trash.h b/tdeioslave/trash/tdeio_trash.h index 157db3464..964e05f9a 100644 --- a/tdeioslave/trash/tdeio_trash.h +++ b/tdeioslave/trash/tdeio_trash.h @@ -22,6 +22,7 @@ #include #include "trashimpl.h" + namespace TDEIO { class Job; } typedef TrashImpl::TrashedFileInfo TrashedFileInfo; diff --git a/tdeioslave/trash/trash_constant.h b/tdeioslave/trash/trash_constant.h new file mode 100644 index 000000000..aab42b3aa --- /dev/null +++ b/tdeioslave/trash/trash_constant.h @@ -0,0 +1,41 @@ +/* This file is part of the TDE project + Copyright (C) 2016 Michele Calgaro #include -#include #include #include #include @@ -35,8 +34,6 @@ #include #include -#include - #include #include #include @@ -51,6 +48,8 @@ #include #include +#include "trash_constant.h" + TrashImpl::TrashImpl() : TQObject(), m_lastErrorCode( 0 ), @@ -976,7 +975,10 @@ bool TrashImpl::adaptTrashSize( const TQString& origPath, int trashId ) bool useTimeLimit = config.readBoolEntry( "UseTimeLimit", false ); bool useSizeLimit = config.readBoolEntry( "UseSizeLimit", true ); + int sizeLimitType = config.readNumEntry( "SizeLimitType", TrashConstant::SIZE_LIMIT_PERCENT ); double percent = config.readDoubleNumEntry( "Percent", 10 ); + double fixedSize = config.readDoubleNumEntry( "FixedSize", 500 ); + int fixedSizeUnit = config.readNumEntry( "FixedSizeUnit", TrashConstant::SIZE_ID_MB ); int actionType = config.readNumEntry( "LimitReachedAction", 0 ); if ( useTimeLimit ) { // delete all files in trash older than X days @@ -998,33 +1000,32 @@ bool TrashImpl::adaptTrashSize( const TQString& origPath, int trashId ) } if ( useSizeLimit ) { // check if size limit exceeded - // calculate size of the files to be put into the trash unsigned long additionalSize = DiscSpaceUtil::sizeOfPath( origPath ); - - DiscSpaceUtil util( trashPath + "/files/" ); - if ( util.usage( additionalSize ) >= percent ) { + TQString trashPathName = trashPath + "/files/"; + DiscSpaceUtil util( trashPathName ); + unsigned long requiredTrashSpace = util.sizeOfPath(trashPathName) + additionalSize; + unsigned long trashLimit = 0; + if ( sizeLimitType == TrashConstant::SIZE_LIMIT_PERCENT) + { + trashLimit = (unsigned long)(1024 * percent * util.size() / 100.0); + } + else if ( sizeLimitType == TrashConstant::SIZE_LIMIT_FIXED) + { + double trashLimitTemp = fixedSize; + while (fixedSizeUnit > TrashConstant::SIZE_ID_B) + { + trashLimitTemp *= 1024; + --fixedSizeUnit; + } + trashLimit = (unsigned long)trashLimitTemp; + } + if ( requiredTrashSpace > trashLimit ) { if ( actionType == 0 ) { // warn the user only m_lastErrorCode = TDEIO::ERR_SLAVE_DEFINED; m_lastErrorMessage = i18n( "The trash has reached its maximum size!\nClean the trash manually." ); return false; } else { - // before we start to remove any files from the trash, - // check whether the new file will fit into the trash - // at all... - - unsigned long partitionSize = util.size(); // in kB - unsigned long fileSize = additionalSize/1024; // convert to kB - - if ( ((double)fileSize*100/(double)partitionSize) >= percent ) { - m_lastErrorCode = TDEIO::ERR_SLAVE_DEFINED; - m_lastErrorMessage = i18n( "The file is too big to be trashed because it exceeds the maximum size set for the trash bin." ); - return false; - } - - // the size of the to be trashed file is ok, so lets start removing - // some other files from the trash - TQDir dir( trashPath + "/files" ); const TQFileInfoList *infos = 0; if ( actionType == 1 ) // delete oldest files first @@ -1038,11 +1039,9 @@ bool TrashImpl::adaptTrashSize( const TQString& origPath, int trashId ) TQFileInfo *info; bool deleteFurther = true; while ( ((info = it.current()) != 0) && deleteFurther ) { - if ( info->fileName() != "." && info->fileName() != ".." ) { del( trashId, info->fileName() ); // delete trashed file - - if ( util.usage( additionalSize ) < percent ) // check whether we have enough space now + if ( (util.sizeOfPath(trashPathName) + additionalSize) < trashLimit ) // check whether we have enough space now deleteFurther = false; } ++it; diff --git a/tdeioslave/trash/trashimpl.h b/tdeioslave/trash/trashimpl.h index 812922364..6e7af2bad 100644 --- a/tdeioslave/trash/trashimpl.h +++ b/tdeioslave/trash/trashimpl.h @@ -25,9 +25,6 @@ #include #include -#include -#include -#include #include /** -- cgit v1.2.1