File indexing completed on 2024-05-05 17:56:56

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 }