File indexing completed on 2024-05-19 13:37:46
0001 /* 0002 SPDX-FileCopyrightText: 2009 Csaba Karai <krusader@users.sourceforge.net> 0003 SPDX-FileCopyrightText: 2009-2022 Krusader Krew <https://krusader.org> 0004 0005 SPDX-License-Identifier: GPL-2.0-or-later 0006 */ 0007 0008 #include "krtrashhandler.h" 0009 0010 // QtCore 0011 #include <QDir> 0012 #include <QStandardPaths> 0013 0014 #include <KConfigCore/KConfig> 0015 #include <KConfigCore/KConfigGroup> 0016 #include <KIO/EmptyTrashJob> 0017 #include <KIO/Job> 0018 #include <KIO/JobUiDelegate> 0019 #include <KIO/RestoreJob> 0020 #include <KJobWidgets/KJobWidgets> 0021 0022 #include "../icon.h" 0023 #include "../kractions.h" 0024 #include "../krglobal.h" 0025 #include "filesystemprovider.h" 0026 0027 KrTrashWatcher *KrTrashHandler::_trashWatcher = nullptr; 0028 0029 bool KrTrashHandler::isTrashEmpty() 0030 { 0031 KConfig trashConfig("trashrc"); 0032 KConfigGroup cfg(&trashConfig, "Status"); 0033 return cfg.readEntry("Empty", false); 0034 } 0035 0036 QString KrTrashHandler::trashIconName() 0037 { 0038 return isTrashEmpty() ? "user-trash" : "user-trash-full"; 0039 } 0040 0041 void KrTrashHandler::emptyTrash() 0042 { 0043 KIO::JobUiDelegate uiDelegate; 0044 uiDelegate.setWindow(krMainWindow); 0045 if (!uiDelegate.askDeleteConfirmation(QList<QUrl>(), KIO::JobUiDelegate::EmptyTrash, KIO::JobUiDelegate::DefaultConfirmation)) 0046 return; 0047 0048 KIO::Job *job = KIO::emptyTrash(); 0049 KJobWidgets::setWindow(job, krMainWindow); 0050 job->uiDelegate()->setAutoErrorHandlingEnabled(true); 0051 const QUrl url = QUrl("trash:/"); 0052 QObject::connect(job, &KIO::Job::result, [=]() { 0053 FileSystemProvider::instance().refreshFilesystems(url, false); 0054 }); 0055 } 0056 0057 void KrTrashHandler::restoreTrashedFiles(const QList<QUrl> &urls) 0058 { 0059 if (urls.isEmpty()) 0060 return; 0061 0062 KIO::RestoreJob *job = KIO::restoreFromTrash(urls); 0063 KJobWidgets::setWindow(job, krMainWindow); 0064 job->uiDelegate()->setAutoErrorHandlingEnabled(true); 0065 const QUrl url = urls.first().adjusted(QUrl::RemoveFilename); 0066 QObject::connect(job, &KIO::Job::result, [=]() { 0067 FileSystemProvider::instance().refreshFilesystems(url, false); 0068 }); 0069 } 0070 0071 void KrTrashHandler::startWatcher() 0072 { 0073 if (!_trashWatcher) 0074 _trashWatcher = new KrTrashWatcher(); 0075 } 0076 0077 void KrTrashHandler::stopWatcher() 0078 { 0079 delete _trashWatcher; 0080 _trashWatcher = nullptr; 0081 } 0082 0083 KrTrashWatcher::KrTrashWatcher() 0084 { 0085 _watcher = new KDirWatch(); 0086 connect(_watcher, &KDirWatch::created, this, &KrTrashWatcher::slotTrashChanged); 0087 connect(_watcher, &KDirWatch::dirty, this, &KrTrashWatcher::slotTrashChanged); 0088 const QString trashrcFile = QDir(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation)).filePath("trashrc"); 0089 _watcher->addFile(trashrcFile); 0090 _watcher->startScan(true); 0091 } 0092 0093 KrTrashWatcher::~KrTrashWatcher() 0094 { 0095 delete _watcher; 0096 _watcher = nullptr; 0097 } 0098 0099 void KrTrashWatcher::slotTrashChanged() 0100 { 0101 KrActions::actTrashBin->setIcon(Icon(KrTrashHandler::trashIconName())); 0102 }