[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-core-devel
Subject:    Re: [PATCH] KFilePlacesModel : separate storage for custom items
From:       nf2 <nf2 () scheinwelt ! at>
Date:       2008-03-10 19:22:44
Message-ID: 47D58A84.7030608 () scheinwelt ! at
[Download RAW message or body]

nf2 wrote:
> Hi,
>
> Here is an experimental patch for KFilePlacesModel, which separates 
> the storage for the custom items and the standard ("root") items.
>
> The custom items go to ~/.local/share/filemgr-shortcuts.xbel, that 
> they can be shared with other desktops, and the root items are stored 
> in ~/.kde4/share/apps/kfileplaces/rootbookmarks.xml.
>
> This patch depends on my previous KBookmarks patch (to enable 
> KDirWatch monitoring for external bookmarks).
>
> I still have a little problem that <IsHidden> is not always written to 
> the files correctly, but i can't figure out where the bug is.
>
>

Here is an updated patch (because of the recent changes in 
kfileplacesmodel.cpp).

Norbert







["kfileplaces2.patch" (text/x-patch)]

Index: kfile/kfileplacesitem.cpp
===================================================================
--- kfile/kfileplacesitem.cpp	(revision 784133)
+++ kfile/kfileplacesitem.cpp	(working copy)
@@ -31,8 +31,9 @@
 
 KFilePlacesItem::KFilePlacesItem(KBookmarkManager *manager,
                                  const QString &address,
-                                 const QString &udi)
-    : m_manager(manager), m_lister(0), m_folderIsEmpty(true)
+                                 const QString &udi,
+                                 bool isRootItem)
+    : m_manager(manager), m_lister(0), m_folderIsEmpty(true), \
m_isRootItem(isRootItem)  {
     m_bookmark = m_manager->findByAddress(address);
 
@@ -183,7 +184,6 @@
     KBookmarkGroup root = manager->root();
     KBookmark bookmark = root.createNewSeparator();
     bookmark.setMetaDataItem("UDI", udi);
-
     return bookmark;
 }
 
@@ -191,8 +191,11 @@
 {
     static int count = 0;
 
-    return QString::number(count++);
+    //return QString::number(count++);
 
+    return QString::number(QDateTime::currentDateTime().toTime_t())
+      + '/' + QString::number(count++);
+    
 //    return QString::number(QDateTime::currentDateTime().toTime_t())
 //         + '/' + QString::number(qrand());
 }
@@ -230,4 +233,10 @@
     emit itemChanged(id());
 }
 
+bool KFilePlacesItem::isRootItem() const
+{
+    return m_isRootItem;
+}
+
+
 #include "kfileplacesitem_p.moc"
Index: kfile/kfileplacesmodel.cpp
===================================================================
--- kfile/kfileplacesmodel.cpp	(revision 784133)
+++ kfile/kfileplacesmodel.cpp	(working copy)
@@ -58,9 +58,10 @@
     QMap<QObject*, QPersistentModelIndex> setupInProgress;
 
     Solid::Predicate predicate;
+    KBookmarkManager *bookmarkManagerRoots;
     KBookmarkManager *bookmarkManager;
 
-    void reloadAndSignal();
+    void reloadAndSignal(bool roots);
     QList<KFilePlacesItem *> loadBookmarkList();
 
     void _k_initDeviceList();
@@ -75,25 +76,28 @@
 KFilePlacesModel::KFilePlacesModel(QObject *parent)
     : QAbstractItemModel(parent), d(new Private(this))
 {
-    const QString file = KStandardDirs::locateLocal("data", \
                "kfileplaces/bookmarks.xml");
-    d->bookmarkManager = KBookmarkManager::managerForFile(file, "kfilePlaces");
+    const QString rootsFile = KStandardDirs::locateLocal("data", \
"kfileplaces/rootbookmarks.xml"); +    d->bookmarkManagerRoots = \
KBookmarkManager::managerForFile(rootsFile, "kfilePlacesRoots");  
+    const QString file = KStandardDirs().localxdgdatadir() + \
"/filemgr-shortcuts.xbel"; +    d->bookmarkManager = \
KBookmarkManager::managerForExternalFile(file);  +    
     // Let's put some places in there if it's empty
-    KBookmarkGroup root = d->bookmarkManager->root();
+    KBookmarkGroup root = d->bookmarkManagerRoots->root();
     if (root.first().isNull()) {
-        KFilePlacesItem::createBookmark(d->bookmarkManager,
+        KFilePlacesItem::createBookmark(d->bookmarkManagerRoots,
                                         i18nc("Home Directory", "Home"), \
                KUrl(KUser().homeDir()), "user-home");
-        KFilePlacesItem::createBookmark(d->bookmarkManager,
+        KFilePlacesItem::createBookmark(d->bookmarkManagerRoots,
                                         i18n("Network"), KUrl("remote:/"), \
"network-workgroup");  #ifdef Q_OS_WIN
 	//c:\ as root for windows
-        KFilePlacesItem::createBookmark(d->bookmarkManager,
+        KFilePlacesItem::createBookmark(d->bookmarkManagerRoots,
                                         i18n("Root"), KUrl("C:\\"), "folder-red");
 #else
-        KFilePlacesItem::createBookmark(d->bookmarkManager,
+        KFilePlacesItem::createBookmark(d->bookmarkManagerRoots,
                                         i18n("Root"), KUrl("/"), "folder-red");
 #endif
-        KFilePlacesItem::createBookmark(d->bookmarkManager,
+        KFilePlacesItem::createBookmark(d->bookmarkManagerRoots,
                                         i18n("Trash"), KUrl("trash:/"), \
"user-trash");  }
 
@@ -102,6 +106,11 @@
         " OR "
         "[ IS StorageAccess AND StorageDrive.driveType == 'Floppy' ]]");
 
+    connect(d->bookmarkManagerRoots, SIGNAL(changed(const QString&, const \
QString&)), +            this, SLOT(_k_reloadBookmarks()));
+    connect(d->bookmarkManagerRoots, SIGNAL(bookmarksChanged(const QString&)),
+            this, SLOT(_k_reloadBookmarks()));
+    
     connect(d->bookmarkManager, SIGNAL(changed(const QString&, const QString&)),
             this, SLOT(_k_reloadBookmarks()));
     connect(d->bookmarkManager, SIGNAL(bookmarksChanged(const QString&)),
@@ -364,7 +373,8 @@
 {
     QList<KFilePlacesItem*> items;
 
-    KBookmarkGroup root = bookmarkManager->root();
+    // load root items
+    KBookmarkGroup root = bookmarkManagerRoots->root();
     KBookmark bookmark = root.first();
     QSet<QString> devices = availableDevices;
 
@@ -378,37 +388,55 @@
         if ((udi.isEmpty() && allowedHere) || deviceAvailable) {
             KFilePlacesItem *item;
             if (deviceAvailable) {
-                item = new KFilePlacesItem(bookmarkManager, bookmark.address(), \
udi); +                item = new KFilePlacesItem(bookmarkManagerRoots, \
bookmark.address(), udi, true);  // TODO: Update bookmark internal element
             } else {
-                item = new KFilePlacesItem(bookmarkManager, bookmark.address());
+                item = new KFilePlacesItem(bookmarkManagerRoots, bookmark.address(), \
QString(), true);  }
             connect(item, SIGNAL(itemChanged(const QString&)),
                     q, SLOT(_k_itemChanged(const QString&)));
             items << item;
         }
-
         bookmark = root.next(bookmark);
     }
-
+   
     // Add bookmarks for the remaining devices, they were previously unknown
     foreach (const QString &udi, devices) {
-        bookmark = KFilePlacesItem::createDeviceBookmark(bookmarkManager, udi);
+        bookmark = KFilePlacesItem::createDeviceBookmark(bookmarkManagerRoots, udi);
 
-        KFilePlacesItem *item = new KFilePlacesItem(bookmarkManager,
-                                                    bookmark.address(), udi);
+        KFilePlacesItem *item = new KFilePlacesItem(bookmarkManagerRoots,
+                                                    bookmark.address(), udi, true);
         connect(item, SIGNAL(itemChanged(const QString&)),
                 q, SLOT(_k_itemChanged(const QString&)));
         // TODO: Update bookmark internal element
         items << item;
     }
 
+    // load shortcuts
+    root = bookmarkManager->root();
+    bookmark = root.first();
+    while (!bookmark.isNull()) {
+        KFilePlacesItem *item;
+        item = new KFilePlacesItem(bookmarkManager, bookmark.address());
+        connect(item, SIGNAL(itemChanged(const QString&)),
+              q, SLOT(_k_itemChanged(const QString&)));
+        items << item;
+        bookmark = root.next(bookmark);
+    }    
+    
     return items;
 }
 
-void KFilePlacesModel::Private::reloadAndSignal()
+void KFilePlacesModel::Private::reloadAndSignal(bool roots)
 {
-    bookmarkManager->emitChanged(bookmarkManager->root()); // ... we'll get relisted \
anyway +    if (roots)
+    {
+        bookmarkManagerRoots->emitChanged(bookmarkManagerRoots->root());
+    }
+    else
+    {
+        bookmarkManager->emitChanged(bookmarkManager->root()); // ... we'll get \
relisted anyway +    }
 }
 
 Qt::DropActions KFilePlacesModel::supportedDropActions() const
@@ -541,7 +569,7 @@
         return false;
     }
 
-    d->reloadAndSignal();
+    d->reloadAndSignal(false);
 
     return true;
 }
@@ -556,7 +584,7 @@
         bookmark.setMetaDataItem("OnlyInApp", appName);
     }
 
-    d->reloadAndSignal();
+    d->reloadAndSignal(false);
 }
 
 void KFilePlacesModel::editPlace(const QModelIndex &index, const QString &text, \
const KUrl &url, @@ -577,7 +605,7 @@
     bookmark.setIcon(iconName);
     bookmark.setMetaDataItem("OnlyInApp", appName);
 
-    d->reloadAndSignal();
+    d->reloadAndSignal(item->isRootItem());
     emit dataChanged(index, index);
 }
 
@@ -588,13 +616,14 @@
     KFilePlacesItem *item = static_cast<KFilePlacesItem*>(index.internalPointer());
 
     if (item->isDevice()) return;
-
+    if (item->isRootItem()) return;
+    
     KBookmark bookmark = item->bookmark();
 
     if (bookmark.isNull()) return;
 
     d->bookmarkManager->root().deleteBookmark(bookmark);
-    d->reloadAndSignal();
+    d->reloadAndSignal(false);
 }
 
 void KFilePlacesModel::setPlaceHidden(const QModelIndex &index, bool hidden)
@@ -609,7 +638,7 @@
 
     bookmark.setMetaDataItem("IsHidden", (hidden ? "true" : "false"));
 
-    d->reloadAndSignal();
+    d->reloadAndSignal(item->isRootItem());
     emit dataChanged(index, index);
 }
 
Index: kfile/kfileplacesitem_p.h
===================================================================
--- kfile/kfileplacesitem_p.h	(revision 784133)
+++ kfile/kfileplacesitem_p.h	(working copy)
@@ -33,12 +33,13 @@
 public:
     KFilePlacesItem(KBookmarkManager *manager,
                     const QString &address,
-                    const QString &udi = QString());
+                    const QString &udi = QString(), bool isRootItem = false);
     ~KFilePlacesItem();
 
     QString id() const;
 
     bool isDevice() const;
+    bool isRootItem() const;
     KBookmark bookmark() const;
     Solid::Device device() const;
     QVariant data(int role) const;
@@ -70,6 +71,7 @@
     KBookmark m_bookmark;
     KDirLister *m_lister;
     bool m_folderIsEmpty;
+    bool m_isRootItem;
 };
 
 #endif



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic