]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/panels/places/placesitem.cpp
Update trash-icon dependent on whether the thrash is empty or not
[dolphin.git] / src / panels / places / placesitem.cpp
index 436d69668c4dc009e703005cb902a11f661ba792..7a5daff8ea2c12d4fc7fa8db69e383659d59b58f 100644 (file)
 
 #include <KBookmarkManager>
 #include <KDebug>
+#include <KDirLister>
 #include <KIcon>
 #include <KLocale>
-#include "placesitemstorageaccesslistener.h"
+#include "placesitemsignalhandler.h"
 #include <QDateTime>
 #include <Solid/Block>
 
@@ -36,34 +37,44 @@ PlacesItem::PlacesItem(const KBookmark& bookmark, PlacesItem* parent) :
     m_access(),
     m_volume(),
     m_disc(),
-    m_accessListener(0),
+    m_signalHandler(0),
+    m_trashDirLister(0),
     m_bookmark()
 {
+    m_signalHandler = new PlacesItemSignalHandler(this);
     setBookmark(bookmark);
 }
 
-PlacesItem::PlacesItem(const PlacesItem& item) :
-    KStandardItem(item),
-    m_device(item.m_device),
-    m_access(item.m_access),
-    m_volume(item.m_volume),
-    m_disc(item.m_disc),
-    m_accessListener(0),
-    m_bookmark(item.m_bookmark)
-{
-    if (item.m_accessListener) {
-        m_accessListener = new PlacesItemStorageAccessListener(this);
-    }
-}
-
 PlacesItem::~PlacesItem()
 {
-    delete m_accessListener;
+    delete m_signalHandler;
+    delete m_trashDirLister;
 }
 
 void PlacesItem::setUrl(const KUrl& url)
 {
-    setDataValue("url", url);
+    // The default check in KStandardItem::setDataValue()
+    // for equal values does not work with a custom value
+    // like KUrl. Hence do a manual check to prevent that
+    // setting an equal URL results in an itemsChanged()
+    // signal.
+    if (dataValue("url").value<KUrl>() != url) {
+        delete m_trashDirLister;
+        if (url.protocol() == 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, 0);
+            m_trashDirLister->setDelayedMimeTypes(true);
+            QObject::connect(m_trashDirLister, SIGNAL(completed()),
+                             m_signalHandler, SLOT(onTrashDirListerCompleted()));
+            m_trashDirLister->openUrl(url);
+        }
+
+        setDataValue("url", url);
+    }
 }
 
 KUrl PlacesItem::url() const
@@ -84,9 +95,6 @@ QString PlacesItem::udi() const
 void PlacesItem::setHidden(bool hidden)
 {
     setDataValue("isHidden", hidden);
-    if (!m_bookmark.isNull()) {
-        m_bookmark.setMetaDataItem("IsHidden", hidden ? "true" : "false");
-    }
 }
 
 bool PlacesItem::isHidden() const
@@ -116,14 +124,12 @@ void PlacesItem::setBookmark(const KBookmark& bookmark)
     delete m_access;
     delete m_volume;
     delete m_disc;
-    delete m_accessListener;
 
     const QString udi = bookmark.metaDataItem("UDI");
     if (udi.isEmpty()) {
         setIcon(bookmark.icon());
-        setText(bookmark.description());
+        setText(bookmark.text());
         setUrl(bookmark.url());
-        setDataValue("address", bookmark.address());
     } else {
         initializeDevice(udi);
     }
@@ -173,7 +179,7 @@ KBookmark PlacesItem::createBookmark(KBookmarkManager* manager,
     }
 
     KBookmark bookmark = root.addBookmark(text, url, iconName);
-    bookmark.setDescription(text);
+    bookmark.setFullText(text);
     bookmark.setMetaDataItem("ID", generateNewId());
 
     return bookmark;
@@ -237,11 +243,8 @@ void PlacesItem::initializeDevice(const QString& udi)
 
     if (m_access) {
         setUrl(m_access->filePath());
-        if (!m_accessListener) {
-            // The access listener takes care to call PlacesItem::onAccessibilityChanged()
-            // in case if the accessibility of m_access has been changed.
-            m_accessListener = new PlacesItemStorageAccessListener(this);
-        }
+        QObject::connect(m_access, SIGNAL(accessibilityChanged(bool,QString)),
+                         m_signalHandler, SLOT(onAccessibilityChanged()));
     } else if (m_disc && (m_disc->availableContent() & Solid::OpticalDisc::Audio) != 0) {
         const QString device = m_device.as<Solid::Block>()->device();
         setUrl(QString("audiocd:/?device=%1").arg(device));
@@ -253,13 +256,21 @@ void PlacesItem::onAccessibilityChanged()
     setIconOverlays(m_device.emblems());
 }
 
+void PlacesItem::onTrashDirListerCompleted()
+{
+    Q_ASSERT(url().protocol() == QLatin1String("trash"));
+
+    const bool isTrashEmpty = m_trashDirLister->items().isEmpty();
+    setIcon(isTrashEmpty ? "user-trash" : "user-trash-full");
+}
+
 void PlacesItem::updateBookmarkForRole(const QByteArray& role)
 {
     Q_ASSERT(!m_bookmark.isNull());
     if (role == "iconName") {
         m_bookmark.setIcon(icon());
     } else if (role == "text") {
-        m_bookmark.setDescription(text());
+        m_bookmark.setFullText(text());
     } else if (role == "url") {
         m_bookmark.setUrl(url());
     } else if (role == "udi)") {
@@ -273,6 +284,11 @@ void PlacesItem::updateBookmarkForRole(const QByteArray& role)
 
 QString PlacesItem::generateNewId()
 {
+    // The ID-generation must be different as done in KFilePlacesItem from kdelibs
+    // to prevent identical IDs, because 'count' is of course not shared. We append a
+    // " (V2)" to indicate that the ID has been generated by
+    // a new version of the places view.
     static int count = 0;
-    return QString::number(QDateTime::currentDateTime().toTime_t()) + '/' + QString::number(count++);
+    return QString::number(QDateTime::currentDateTime().toTime_t()) +
+            '/' + QString::number(count++) + " (V2)";
 }