[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