diff options
author | Emanoil Kotsev <[email protected]> | 2016-10-12 15:20:02 +0900 |
---|---|---|
committer | Michele Calgaro <[email protected]> | 2016-10-12 15:20:02 +0900 |
commit | ee3091bc41f5cae8be2ba5f8335e0b866edb4711 (patch) | |
tree | 8ffc7ba391bb968e9de33674fa6caf5e9166e5eb /tdeioslave/trash/ktrashpropsdlgplugin.cpp | |
parent | 443c910570647f415838e65a1b8add30b00b7dbb (diff) | |
download | tdebase-ee3091bc41f5cae8be2ba5f8335e0b866edb4711.tar.gz tdebase-ee3091bc41f5cae8be2ba5f8335e0b866edb4711.zip |
Added trash limit configuration option
This work is based on original patch created by Tobias Koenig <[email protected]> for KDE 3.5.9 and later added to KDE 4.2, and available under GPL version 2 License, or any later version.
See also http://tokoe-kde.blogspot.com/2008/08/size-limits-for-trash.html
This relates to bug 1923.
Signed-off-by: Emanoil Kotsev <[email protected]>
Signed-off-by: Michele Calgaro <[email protected]>
Diffstat (limited to 'tdeioslave/trash/ktrashpropsdlgplugin.cpp')
-rw-r--r-- | tdeioslave/trash/ktrashpropsdlgplugin.cpp | 316 |
1 files changed, 316 insertions, 0 deletions
diff --git a/tdeioslave/trash/ktrashpropsdlgplugin.cpp b/tdeioslave/trash/ktrashpropsdlgplugin.cpp new file mode 100644 index 000000000..9d18f2acf --- /dev/null +++ b/tdeioslave/trash/ktrashpropsdlgplugin.cpp @@ -0,0 +1,316 @@ +/* + This file is part of the KDE project + + Copyright (C) 2008 Tobias Koenig <[email protected]> + Copyright (C) 2016 Emanoil Kotsev <[email protected]> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "ktrashpropsdlgplugin.h" +#include "discspaceutil.h" +#include "trashimpl.h" + +#include <tqcheckbox.h> +#include <tqcombobox.h> +#include <tqlabel.h> +#include <tqlayout.h> +#include <tqlistbox.h> +#include <tqspinbox.h> + +#include <kdesktopfile.h> +#include <kgenericfactory.h> +#include <tdeglobal.h> +#include <kiconloader.h> +#include <tdelocale.h> +#include <knuminput.h> + +#include <kdebug.h> + +typedef KGenericFactory<KTrashPropsDlgPlugin, KPropertiesDialog> Factory; +K_EXPORT_COMPONENT_FACTORY( ktrashpropsdlgplugin, Factory( "ktrashpropsdlgplugin" ) ) + +KTrashPropsDlgPlugin::KTrashPropsDlgPlugin( KPropertiesDialog *dialog, const char*, const TQStringList& ) + : KPropsDlgPlugin( dialog ) +{ + kdDebug() << "KTrashPropsDlgPlugin::KTrashPropsDlgPlugin called" << endl; + if ( dialog->items().count() != 1 ) + return; + + KFileItem *item = dialog->items().first(); + + if ( !KPropsDlgPlugin::isDesktopFile( item ) ) + return; + + kdDebug() << "KPropsDlgPlugin::isDesktopFile( item ) passed" << endl; + KDesktopFile deskFile( item->url().path(), true /* readonly */ ); + + if ( deskFile.readURL() != "trash:/" ) + return; + + kdDebug() << "deskFile.readURL() != \"trash:/\") passed" << endl; + TDEGlobal::locale()->insertCatalogue( "tdeio_trash" ); + + mTrashImpl = new TrashImpl(); + mTrashImpl->init(); + + readConfig(); + + TQFrame *frame = dialog->addPage( i18n( "Size Limits" ) ); + setupGui( frame ); + + + mUseTimeLimit->setChecked( mConfigMap[ mCurrentTrash ].useTimeLimit ); + mUseSizeLimit->setChecked( mConfigMap[ mCurrentTrash ].useSizeLimit ); + mDays->setValue( mConfigMap[ mCurrentTrash ].days ); + mPercent->setValue( mConfigMap[ mCurrentTrash ].percent ); + mPercent->setPrecision(3); + mLimitReachedAction->setCurrentItem( mConfigMap[ mCurrentTrash ].actionType ); + percentChanged(mPercent->value()); + + useTypeChanged(); + + connect( mUseTimeLimit, SIGNAL( toggled( bool ) ), + this, SLOT( setDirty() ) ); + connect( mUseTimeLimit, SIGNAL( toggled( bool ) ), + this, SLOT( useTypeChanged() ) ); + connect( mDays, SIGNAL( valueChanged( int ) ), + this, SLOT( setDirty() ) ); + connect( mUseSizeLimit, SIGNAL( toggled( bool ) ), + this, SLOT( setDirty() ) ); + connect( mUseSizeLimit, SIGNAL( toggled( bool ) ), + this, SLOT( useTypeChanged() ) ); + connect( mPercent, SIGNAL( valueChanged( double ) ), + this, SLOT( percentChanged( double ) ) ); + connect( mPercent, SIGNAL( valueChanged( double ) ), + this, SLOT( setDirty() ) ); + connect( mLimitReachedAction, SIGNAL( activated( int ) ), + this, SLOT( setDirty() ) ); + + trashChanged( 0 ); +} + +KTrashPropsDlgPlugin::~KTrashPropsDlgPlugin() +{ +} + +void KTrashPropsDlgPlugin::applyChanges() +{ + if ( !mCurrentTrash.isEmpty() ) { + ConfigEntry entry; + entry.useTimeLimit = mUseTimeLimit->isChecked(); + entry.days = mDays->value(); + entry.useSizeLimit = mUseSizeLimit->isChecked(); + entry.percent = mPercent->value(), + entry.actionType = mLimitReachedAction->currentItem(); + mConfigMap.insert( mCurrentTrash, entry ); + } + + writeConfig(); +} + +void KTrashPropsDlgPlugin::percentChanged( double percent ) +{ + DiscSpaceUtil util( mCurrentTrash ); + + double partitionSize = util.size() * 1024.0; // convert to byte + + double size = partitionSize*(percent/100.0); + +// Step should be depending on size +// https://api.kde.org/3.5-api/kdelibs-apidocs/kdeui/html/classKDoubleSpinBox.html +// https://api.kde.org/3.5-api/kdelibs-apidocs/kdeui/html/knuminput_8cpp_source.html + mPercent->setPrecision(3); + + TQString unit = i18n( "Byte" ); + if ( size > 1024 ) { + unit = i18n( "KByte" ); + size = size/1024.0; + mPercent->setLineStep(0.001); + } + if ( size > 1024 ) { + unit = i18n( "MByte" ); + size = size/1024.0; + mPercent->setLineStep(0.01); + } + if ( size > 1024 ) { + unit = i18n( "GByte" ); + size = size/1024.0; + mPercent->setLineStep(0.1); + } + if ( size > 1024 ) { + unit = i18n( "TByte" ); + size = size/1024.0; + mPercent->setLineStep(1); + } + + mSizeLabel->setText( i18n( "(%1 %2)" ).arg( TQString::number( size, 'f', 2 ) ).arg( unit ) ); + +} + +void KTrashPropsDlgPlugin::trashChanged( int value ) +{ + const TrashImpl::TrashDirMap map = mTrashImpl->trashDirectories(); + + if ( !mCurrentTrash.isEmpty() ) { + ConfigEntry entry; + entry.useTimeLimit = mUseTimeLimit->isChecked(); + entry.days = mDays->value(); + entry.useSizeLimit = mUseSizeLimit->isChecked(); + entry.percent = mPercent->value(), + entry.actionType = mLimitReachedAction->currentItem(); + mConfigMap.insert( mCurrentTrash, entry ); + } + + mCurrentTrash = map[ value ]; + + if ( mConfigMap.contains( mCurrentTrash ) ) { + const ConfigEntry entry = mConfigMap[ mCurrentTrash ]; + mUseTimeLimit->setChecked( entry.useTimeLimit ); + mDays->setValue( entry.days ); + mUseSizeLimit->setChecked( entry.useSizeLimit ); + mPercent->setValue( entry.percent ); + mLimitReachedAction->setCurrentItem( entry.actionType ); + } else { + mUseTimeLimit->setChecked( false ); + mDays->setValue( 7 ); + mUseSizeLimit->setChecked( true ); + mPercent->setValue( 10.0 ); + mLimitReachedAction->setCurrentItem( 0 ); + } + + percentChanged( mPercent->value() ); +} + +void KTrashPropsDlgPlugin::useTypeChanged() +{ + mDays->setEnabled( mUseTimeLimit->isChecked() ); + mSizeWidget->setEnabled( mUseSizeLimit->isChecked() ); +} + +void KTrashPropsDlgPlugin::readConfig() +{ + kdDebug() << "KTrashPropsDlgPlugin::readConfig() called" << endl; + TDEConfig config( "trashrc" ); + mConfigMap.clear(); + + const TQStringList groups = config.groupList(); + for ( uint i = 0; i < groups.count(); ++i ) { + if ( groups[ i ].startsWith( "/" ) ) { + config.setGroup( groups[ i ] ); + ConfigEntry entry; + entry.useTimeLimit = config.readBoolEntry( "UseTimeLimit", false ); + entry.days = config.readNumEntry( "Days", 7 ); + entry.useSizeLimit = config.readBoolEntry( "UseSizeLimit", true ); + entry.percent = config.readDoubleNumEntry( "Percent", 10 ); + entry.actionType = config.readNumEntry( "LimitReachedAction", 0 ); + mConfigMap.insert( groups[ i ], entry ); + } + } +} + +void KTrashPropsDlgPlugin::writeConfig() +{ + kdDebug() << "KTrashPropsDlgPlugin::writeConfig() called" << endl; + TDEConfig config( "trashrc" ); + + // first delete all existing groups + const TQStringList groups = config.groupList(); + for ( uint i = 0; i < groups.count(); ++i ) + if ( groups[ i ].startsWith( "/" ) ) + config.deleteGroup( groups[ i ] ); + + TQMapConstIterator<TQString, ConfigEntry> it; + for ( it = mConfigMap.begin(); it != mConfigMap.end(); ++it ) { + config.setGroup( it.key() ); + config.writeEntry( "UseTimeLimit", it.data().useTimeLimit ); + config.writeEntry( "Days", it.data().days ); + config.writeEntry( "UseSizeLimit", it.data().useSizeLimit ); + config.writeEntry( "Percent", it.data().percent ); + config.writeEntry( "LimitReachedAction", it.data().actionType ); + } + + config.sync(); +} + +void KTrashPropsDlgPlugin::setupGui( TQFrame *frame ) +{ + kdDebug() << "KTrashPropsDlgPlugin::setupGui( TQFrame *frame )" << endl; + 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<int, TQString> 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, SIGNAL( highlighted( int ) ), 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" |