]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/panels/places/placesitem.cpp
Places Panel: Prepare code to save state of bookmarks
[dolphin.git] / src / panels / places / placesitem.cpp
index c865aa11db5e38467abf5751493c8be62818bdc9..292312d0a07243c57c1cf9d3d91db7bc1f2f9a8f 100644 (file)
 
 #include "placesitem.h"
 
-#include <KBookmark>
+#include <KBookmarkManager>
+#include <KDebug>
 #include <KIcon>
 #include <KLocale>
 #include "placesitemstorageaccesslistener.h"
+#include <QDateTime>
 #include <Solid/Block>
 
-PlacesItem::PlacesItem(PlacesItem* parent) :
-    KStandardItem(parent),
-    m_device(),
-    m_access(),
-    m_volume(),
-    m_disc(),
-    m_accessListener(0)
-{
-}
-
 PlacesItem::PlacesItem(const KBookmark& bookmark, PlacesItem* parent) :
     KStandardItem(parent),
     m_device(),
     m_access(),
     m_volume(),
     m_disc(),
-    m_accessListener(0)
-{
-    setHidden(bookmark.metaDataItem("IsHidden") == QLatin1String("true"));
-
-    const QString udi = bookmark.metaDataItem("UDI");
-    if (udi.isEmpty()) {
-        setIcon(bookmark.icon());
-        setText(bookmark.text());
-        setUrl(bookmark.url());
-        setDataValue("address", bookmark.address());
-        setGroup(i18nc("@item", "Places"));
-    } else {
-        initializeDevice(udi);
-    }
-}
-
-PlacesItem::PlacesItem(const QString& udi, PlacesItem* parent) :
-    KStandardItem(parent),
-    m_device(),
-    m_access(),
-    m_volume(),
-    m_disc(),
-    m_accessListener(0)
+    m_accessListener(0),
+    m_bookmark()
 {
-    initializeDevice(udi);
+    setBookmark(bookmark);
 }
 
 PlacesItem::PlacesItem(const PlacesItem& item) :
@@ -77,14 +48,14 @@ PlacesItem::PlacesItem(const PlacesItem& item) :
     m_access(),
     m_volume(),
     m_disc(),
-    m_accessListener(0)
+    m_accessListener(0),
+    m_bookmark()
 {
 }
 
 PlacesItem::~PlacesItem()
 {
     delete m_accessListener;
-    m_accessListener = 0;
 }
 
 void PlacesItem::setUrl(const KUrl& url)
@@ -110,6 +81,9 @@ 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
@@ -117,11 +91,109 @@ bool PlacesItem::isHidden() const
     return dataValue("isHidden").toBool();
 }
 
+void PlacesItem::setSystemItem(bool isSystemItem)
+{
+    setDataValue("isSystemItem", isSystemItem);
+}
+
+bool PlacesItem::isSystemItem() const
+{
+    return dataValue("isSystemItem").toBool();
+}
+
 Solid::Device PlacesItem::device() const
 {
     return m_device;
 }
 
+void PlacesItem::setBookmark(const KBookmark& bookmark)
+{
+    m_bookmark = 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.text());
+        setUrl(bookmark.url());
+        setDataValue("address", bookmark.address());
+        setGroup(i18nc("@item", "Places"));
+    } else {
+        initializeDevice(udi);
+    }
+    setHidden(bookmark.metaDataItem("IsHidden") == QLatin1String("true"));
+}
+
+KBookmark PlacesItem::bookmark() const
+{
+    return m_bookmark;
+}
+
+KBookmark PlacesItem::createBookmark(KBookmarkManager* manager,
+                                     const QString& text,
+                                     const KUrl& url,
+                                     const QString& iconName,
+                                     PlacesItem* after)
+{
+    KBookmarkGroup root = manager->root();
+    if (root.isNull()) {
+        return KBookmark();
+    }
+
+    KBookmark bookmark = root.addBookmark(text, url, iconName);
+    bookmark.setMetaDataItem("ID", generateNewId());
+
+    if (after) {
+        root.moveBookmark(bookmark, after->bookmark());
+    }
+
+    return bookmark;
+}
+
+KBookmark PlacesItem::createDeviceBookmark(KBookmarkManager* manager,
+                                           const QString& udi)
+{
+    KBookmarkGroup root = manager->root();
+    if (root.isNull()) {
+        return KBookmark();
+    }
+
+    KBookmark bookmark = root.createNewSeparator();
+    bookmark.setMetaDataItem("UDI", udi);
+    bookmark.setMetaDataItem("isSystemItem", "true");
+    return bookmark;
+}
+
+void PlacesItem::onDataValueChanged(const QByteArray& role,
+                                    const QVariant& current,
+                                    const QVariant& previous)
+{
+    Q_UNUSED(current);
+    Q_UNUSED(previous);
+
+    if (!m_bookmark.isNull()) {
+        updateBookmarkForRole(role);
+    }
+}
+
+void PlacesItem::onDataChanged(const QHash<QByteArray, QVariant>& current,
+                               const QHash<QByteArray, QVariant>& previous)
+{
+    Q_UNUSED(previous);
+
+    if (!m_bookmark.isNull()) {
+        QHashIterator<QByteArray, QVariant> it(current);
+        while (it.hasNext()) {
+            it.next();
+            updateBookmarkForRole(it.key());
+        }
+    }
+}
+
 void PlacesItem::initializeDevice(const QString& udi)
 {
     m_device = Solid::Device(udi);
@@ -141,11 +213,11 @@ void PlacesItem::initializeDevice(const QString& udi)
 
     if (m_access) {
         setUrl(m_access->filePath());
-
-        // The access listener takes care to call PlacesItem::onAccessibilityChanged()
-        // in case if the accessibility of m_access has been changed.
-        Q_ASSERT(!m_accessListener);
-        m_accessListener = new PlacesItemStorageAccessListener(this);
+        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);
+        }
     } 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));
@@ -157,3 +229,26 @@ void PlacesItem::onAccessibilityChanged()
     setIconOverlays(m_device.emblems());
 }
 
+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());
+    } else if (role == "url") {
+        m_bookmark.setUrl(url());
+    } else if (role == "udi)") {
+        m_bookmark.setMetaDataItem("UDI", udi());
+    } else if (role == "isSystemItem") {
+        m_bookmark.setMetaDataItem("isSystemItem", isSystemItem() ? "true" : "false");
+    } else if (role == "isHidden") {
+        m_bookmark.setMetaDataItem("IsHidden", isHidden() ? "true" : "false");
+    }
+}
+
+QString PlacesItem::generateNewId()
+{
+    static int count = 0;
+    return QString::number(QDateTime::currentDateTime().toTime_t()) + '/' + QString::number(count++);
+}