Summary: Add `Trash` class to handle all trash operations.
Reviewers: elvisangelaccio, markg, ngraham
Reviewed By: elvisangelaccio, markg, ngraham
Subscribers: ngraham, markg, rkflx, elvisangelaccio, #dolphin
Differential Revision: https://phabricator.kde.org/D11012
dolphinrecenttabsmenu.cpp
dolphintabpage.cpp
dolphintabwidget.cpp
+ trash/dolphintrash.cpp
filterbar/filterbar.cpp
main.cpp
panels/information/filemetadataconfigurationdialog.cpp
#include "dolphinviewcontainer.h"
#include "panels/places/placesitem.h"
#include "panels/places/placesitemmodel.h"
+#include "trash/dolphintrash.h"
#include "views/dolphinview.h"
#include "views/viewmodecontroller.h"
Q_ASSERT(m_context & TrashContext);
QAction* emptyTrashAction = new QAction(QIcon::fromTheme(QStringLiteral("trash-empty")), i18nc("@action:inmenu", "Empty Trash"), this);
- KConfig trashConfig(QStringLiteral("trashrc"), KConfig::SimpleConfig);
- emptyTrashAction->setEnabled(!trashConfig.group("Status").readEntry("Empty", true));
+ emptyTrashAction->setEnabled(!Trash::isEmpty());
addAction(emptyTrashAction);
addCustomActions();
addShowMenuBarAction();
if (exec(m_pos) == emptyTrashAction) {
- KIO::JobUiDelegate uiDelegate;
- uiDelegate.setWindow(m_mainWindow);
- if (uiDelegate.askDeleteConfirmation(QList<QUrl>(), KIO::JobUiDelegate::EmptyTrash, KIO::JobUiDelegate::DefaultConfirmation)) {
- KIO::Job* job = KIO::emptyTrash();
- KJobWidgets::setWindow(job, m_mainWindow);
- job->uiDelegate()->setAutoErrorHandlingEnabled(true);
- }
+ Trash::empty(m_mainWindow);
}
}
#include "global.h"
#include "search/dolphinsearchbox.h"
#include "statusbar/dolphinstatusbar.h"
+#include "trash/dolphintrash.h"
#include "views/viewmodecontroller.h"
#include "views/viewproperties.h"
***************************************************************************/
#include "placesitem.h"
+#include "trash/dolphintrash.h"
#include "dolphindebug.h"
#include "placesitemsignalhandler.h"
if (dataValue("url").toUrl() != url) {
delete m_trashDirLister;
if (url.scheme() == QLatin1String("trash")) {
- // The trash icon must always be updated dependent on whether
- // the trash is empty or not. We use a KDirLister that automatically
- // watches for changes if the number of items has been changed.
- // The update of the icon is handled in onTrashDirListerCompleted().
- m_trashDirLister = new KDirLister();
- m_trashDirLister->setAutoErrorHandlingEnabled(false, nullptr);
- m_trashDirLister->setDelayedMimeTypes(true);
- QObject::connect(m_trashDirLister.data(), static_cast<void(KDirLister::*)()>(&KDirLister::completed),
- m_signalHandler.data(), &PlacesItemSignalHandler::onTrashDirListerCompleted);
- m_trashDirLister->openUrl(url);
+ QObject::connect(&Trash::instance(), &Trash::emptinessChanged, [this](bool isTrashEmpty){
+ setIcon(isTrashEmpty ? QStringLiteral("user-trash") : QStringLiteral("user-trash-full"));
+ });
}
setDataValue("url", url);
setUrl(QUrl::fromLocalFile(m_access->filePath()));
}
-void PlacesItem::onTrashDirListerCompleted()
-{
- Q_ASSERT(url().scheme() == QLatin1String("trash"));
-
- const bool isTrashEmpty = m_trashDirLister->items().isEmpty();
- setIcon(isTrashEmpty ? QStringLiteral("user-trash") : QStringLiteral("user-trash-full"));
-}
-
void PlacesItem::updateBookmarkForRole(const QByteArray& role)
{
Q_ASSERT(!m_bookmark.isNull());
*/
void onAccessibilityChanged();
- /**
- * Is invoked if the listing of the trash has been completed.
- * Updates the state of the trash-icon to be empty or full.
- */
- void onTrashDirListerCompleted();
-
/**
* Applies the data-value from the role to m_bookmark.
*/
}
}
-void PlacesItemSignalHandler::onTrashDirListerCompleted()
-{
- if (m_item) {
- m_item->onTrashDirListerCompleted();
- }
-}
-
void PlacesItemSignalHandler::onTearDownRequested(const QString& udi)
{
Q_UNUSED(udi)
*/
void onAccessibilityChanged();
- /**
- * Calls PlacesItem::onTrashDirListerCompleted()
- */
- void onTrashDirListerCompleted();
-
void onTearDownRequested(const QString& udi);
signals:
#include "dolphin_generalsettings.h"
#include "global.h"
+#include "kitemviews/kitemlistcontainer.h"
+#include "kitemviews/kitemlistcontroller.h"
+#include "kitemviews/kitemlistselectionmanager.h"
+#include "kitemviews/kstandarditem.h"
#include "placesitem.h"
#include "placesitemeditdialog.h"
#include "placesitemlistgroupheader.h"
#include "placesitemlistwidget.h"
#include "placesitemmodel.h"
#include "placesview.h"
-#include "kitemviews/kitemlistcontainer.h"
-#include "kitemviews/kitemlistcontroller.h"
-#include "kitemviews/kitemlistselectionmanager.h"
-#include "kitemviews/kstandarditem.h"
+#include "trash/dolphintrash.h"
#include "views/draganddrophelper.h"
#include <KDirNotify>
QAction* action = menu.exec(pos.toPoint());
if (action) {
if (action == emptyTrashAction) {
- emptyTrash();
+ Trash::empty(this);
} else {
// The index might have changed if devices were added/removed while
// the context menu was open.
}
}
-void PlacesPanel::slotTrashUpdated(KJob* job)
-{
- if (job->error()) {
- emit errorMessage(job->errorString());
- }
- // as long as KIO doesn't do this, do it ourselves
- KNotification::event(QStringLiteral("Trash: emptied"), QString(), QPixmap(), nullptr, KNotification::DefaultEvent);
-}
-
void PlacesPanel::slotStorageSetupDone(int index, bool success)
{
disconnect(m_model, &PlacesItemModel::storageSetupDone,
}
}
-void PlacesPanel::emptyTrash()
-{
- KIO::JobUiDelegate uiDelegate;
- uiDelegate.setWindow(window());
- if (uiDelegate.askDeleteConfirmation(QList<QUrl>(), KIO::JobUiDelegate::EmptyTrash, KIO::JobUiDelegate::DefaultConfirmation)) {
- KIO::Job* job = KIO::emptyTrash();
- KJobWidgets::setWindow(job, window());
- connect(job, &KIO::Job::result, this, &PlacesPanel::slotTrashUpdated);
- }
-}
-
void PlacesPanel::addEntry()
{
const int index = m_controller->selectionManager()->currentItem();
void slotItemDropEventStorageSetupDone(int index, bool success);
void slotAboveItemDropEvent(int index, QGraphicsSceneDragDropEvent* event);
void slotUrlsDropped(const QUrl& dest, QDropEvent* event, QWidget* parent);
- void slotTrashUpdated(KJob* job);
void slotStorageSetupDone(int index, bool success);
private:
- void emptyTrash();
void addEntry();
void editEntry(int index);
--- /dev/null
+/***************************************************************************
+ * Copyright (C) 2012 by Peter Penz <peter.penz19@gmail.com> *
+ * Copyright (C) 2018 by Roman Inflianskas <infroma@gmail.com> *
+ * *
+ * 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. *
+ * *
+ * This program 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 General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
+ ***************************************************************************/
+
+#include "dolphintrash.h"
+
+#include <KIO/JobUiDelegate>
+#include <KJobWidgets>
+#include <QList>
+#include <KNotification>
+#include <KConfig>
+#include <KConfigGroup>
+
+
+Trash::Trash()
+ : m_trashDirLister(new KDirLister())
+{
+ // The trash icon must always be updated dependent on whether
+ // the trash is empty or not. We use a KDirLister that automatically
+ // watches for changes if the number of items has been changed.
+ m_trashDirLister->setAutoErrorHandlingEnabled(false, nullptr);
+ m_trashDirLister->setDelayedMimeTypes(true);
+ auto trashDirContentChanged = [this]() {
+ bool isTrashEmpty = m_trashDirLister->items().isEmpty();
+ emit emptinessChanged(isTrashEmpty);
+ };
+ connect(m_trashDirLister, static_cast<void(KDirLister::*)()>(&KDirLister::completed), trashDirContentChanged);
+ m_trashDirLister->openUrl(QStringLiteral("trash:/"));
+}
+
+Trash::~Trash()
+{
+ delete m_trashDirLister;
+}
+
+Trash &Trash::instance()
+{
+ static Trash result;
+ return result;
+}
+
+KIO::Job *Trash::empty(QWidget *window)
+{
+ KIO::JobUiDelegate uiDelegate;
+ uiDelegate.setWindow(window);
+ bool confirmed = uiDelegate.askDeleteConfirmation(QList<QUrl>(), KIO::JobUiDelegate::EmptyTrash, KIO::JobUiDelegate::DefaultConfirmation);
+ if (confirmed) {
+ KIO::Job* job = KIO::emptyTrash();
+ KJobWidgets::setWindow(job, window);
+ job->uiDelegate()->setAutoErrorHandlingEnabled(true);
+ // as long as KIO doesn't do this, do it ourselves
+ connect(job, &KIO::Job::result, [](){
+ KNotification::event(QStringLiteral("Trash: emptied"), QString(), QPixmap(), nullptr, KNotification::DefaultEvent);
+ });
+ return job;
+ }
+ return nullptr;
+}
+
+bool Trash::isEmpty()
+{
+ KConfig trashConfig(QStringLiteral("trashrc"), KConfig::SimpleConfig);
+ return (trashConfig.group("Status").readEntry("Empty", true));
+}
+
--- /dev/null
+/***************************************************************************
+ * Copyright (C) 2012 by Peter Penz <peter.penz19@gmail.com> *
+ * Copyright (C) 2018 by Roman Inflianskas <infroma@gmail.com> *
+ * *
+ * 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. *
+ * *
+ * This program 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 General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
+ ***************************************************************************/
+
+#ifndef DOLPHINTRASH_H
+#define DOLPHINTRASH_H
+
+#include <QWidget>
+
+#include <KIO/EmptyTrashJob>
+#include <KIOWidgets/KDirLister>
+
+class Trash: public QObject
+{
+ Q_OBJECT
+
+public:
+ // delete copy and move constructors and assign operators
+ Trash(Trash const&) = delete;
+ Trash(Trash&&) = delete;
+ Trash& operator=(Trash const&) = delete;
+ Trash& operator=(Trash &&) = delete;
+
+ static Trash& instance();
+ static KIO::Job* empty(QWidget *window);
+ static bool isEmpty();
+
+signals:
+ void emptinessChanged(bool isEmpty);
+
+private:
+ KDirLister *m_trashDirLister;
+
+ Trash();
+ ~Trash();
+};
+
+#endif // DOLPHINTRASH_H