┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRoman Inflianskas <[email protected]>2018-03-03 19:44:56 +0300
committerRoman Inflianskas <[email protected]>2018-03-11 17:32:33 +0300
commitf16fbcba4e9ed3cd48cb2c1a40c01daf1d511f4b (patch)
tree2dd71c3a19bb24ff82fc7d655f42c5040294a520 /src
parent0c9343d614872b88da59a7c1a18d19c8df83739f (diff)
Add Trash (empty, isEmpty, emptinessChanged)
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
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt1
-rw-r--r--src/dolphincontextmenu.cpp12
-rw-r--r--src/dolphinviewcontainer.cpp1
-rw-r--r--src/panels/places/placesitem.cpp22
-rw-r--r--src/panels/places/placesitem.h6
-rw-r--r--src/panels/places/placesitemsignalhandler.cpp7
-rw-r--r--src/panels/places/placesitemsignalhandler.h5
-rw-r--r--src/panels/places/placespanel.cpp31
-rw-r--r--src/panels/places/placespanel.h2
-rw-r--r--src/trash/dolphintrash.cpp81
-rw-r--r--src/trash/dolphintrash.h54
11 files changed, 150 insertions, 72 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 89180b780..58af19ebd 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -205,6 +205,7 @@ set(dolphinstatic_SRCS
dolphinrecenttabsmenu.cpp
dolphintabpage.cpp
dolphintabwidget.cpp
+ trash/dolphintrash.cpp
filterbar/filterbar.cpp
main.cpp
panels/information/filemetadataconfigurationdialog.cpp
diff --git a/src/dolphincontextmenu.cpp b/src/dolphincontextmenu.cpp
index c35f442cb..c4a66c19a 100644
--- a/src/dolphincontextmenu.cpp
+++ b/src/dolphincontextmenu.cpp
@@ -27,6 +27,7 @@
#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"
@@ -139,8 +140,7 @@ void DolphinContextMenu::openTrashContextMenu()
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();
@@ -151,13 +151,7 @@ void DolphinContextMenu::openTrashContextMenu()
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);
}
}
diff --git a/src/dolphinviewcontainer.cpp b/src/dolphinviewcontainer.cpp
index 1620f3c36..6c5edc13f 100644
--- a/src/dolphinviewcontainer.cpp
+++ b/src/dolphinviewcontainer.cpp
@@ -25,6 +25,7 @@
#include "global.h"
#include "search/dolphinsearchbox.h"
#include "statusbar/dolphinstatusbar.h"
+#include "trash/dolphintrash.h"
#include "views/viewmodecontroller.h"
#include "views/viewproperties.h"
diff --git a/src/panels/places/placesitem.cpp b/src/panels/places/placesitem.cpp
index 20c19e152..ff81e8e63 100644
--- a/src/panels/places/placesitem.cpp
+++ b/src/panels/places/placesitem.cpp
@@ -21,6 +21,7 @@
***************************************************************************/
#include "placesitem.h"
+#include "trash/dolphintrash.h"
#include "dolphindebug.h"
#include "placesitemsignalhandler.h"
@@ -60,16 +61,9 @@ void PlacesItem::setUrl(const QUrl &url)
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);
@@ -239,14 +233,6 @@ void PlacesItem::onAccessibilityChanged()
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());
diff --git a/src/panels/places/placesitem.h b/src/panels/places/placesitem.h
index 680590dcd..3de626983 100644
--- a/src/panels/places/placesitem.h
+++ b/src/panels/places/placesitem.h
@@ -92,12 +92,6 @@ private:
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 updateBookmarkForRole(const QByteArray& role);
diff --git a/src/panels/places/placesitemsignalhandler.cpp b/src/panels/places/placesitemsignalhandler.cpp
index 5531d1b63..c85c8336e 100644
--- a/src/panels/places/placesitemsignalhandler.cpp
+++ b/src/panels/places/placesitemsignalhandler.cpp
@@ -39,13 +39,6 @@ void PlacesItemSignalHandler::onAccessibilityChanged()
}
}
-void PlacesItemSignalHandler::onTrashDirListerCompleted()
-{
- if (m_item) {
- m_item->onTrashDirListerCompleted();
- }
-}
-
void PlacesItemSignalHandler::onTearDownRequested(const QString& udi)
{
Q_UNUSED(udi)
diff --git a/src/panels/places/placesitemsignalhandler.h b/src/panels/places/placesitemsignalhandler.h
index 49c8e43c9..6158d7180 100644
--- a/src/panels/places/placesitemsignalhandler.h
+++ b/src/panels/places/placesitemsignalhandler.h
@@ -56,11 +56,6 @@ public slots:
*/
void onAccessibilityChanged();
- /**
- * Calls PlacesItem::onTrashDirListerCompleted()
- */
- void onTrashDirListerCompleted();
-
void onTearDownRequested(const QString& udi);
signals:
diff --git a/src/panels/places/placespanel.cpp b/src/panels/places/placespanel.cpp
index 29acd034c..216b76038 100644
--- a/src/panels/places/placespanel.cpp
+++ b/src/panels/places/placespanel.cpp
@@ -25,16 +25,17 @@
#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>
@@ -226,7 +227,7 @@ void PlacesPanel::slotItemContextMenuRequested(int index, const QPointF& pos)
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.
@@ -425,15 +426,6 @@ void PlacesPanel::slotUrlsDropped(const QUrl& dest, QDropEvent* event, QWidget*
}
}
-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,
@@ -453,17 +445,6 @@ void PlacesPanel::slotStorageSetupDone(int index, bool success)
}
}
-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();
diff --git a/src/panels/places/placespanel.h b/src/panels/places/placespanel.h
index 7159357f8..d62697940 100644
--- a/src/panels/places/placespanel.h
+++ b/src/panels/places/placespanel.h
@@ -68,11 +68,9 @@ private slots:
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);
diff --git a/src/trash/dolphintrash.cpp b/src/trash/dolphintrash.cpp
new file mode 100644
index 000000000..10d9badf5
--- /dev/null
+++ b/src/trash/dolphintrash.cpp
@@ -0,0 +1,81 @@
+/***************************************************************************
+ * Copyright (C) 2012 by Peter Penz <[email protected]> *
+ * Copyright (C) 2018 by Roman Inflianskas <[email protected]> *
+ * *
+ * 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));
+}
+
diff --git a/src/trash/dolphintrash.h b/src/trash/dolphintrash.h
new file mode 100644
index 000000000..76da4a5e0
--- /dev/null
+++ b/src/trash/dolphintrash.h
@@ -0,0 +1,54 @@
+/***************************************************************************
+ * Copyright (C) 2012 by Peter Penz <[email protected]> *
+ * Copyright (C) 2018 by Roman Inflianskas <[email protected]> *
+ * *
+ * 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