475 lines
15 KiB
Diff
475 lines
15 KiB
Diff
|
From 5c0a31a2f2a46aa44b8c34baae67b6951b2abcaf Mon Sep 17 00:00:00 2001
|
||
|
From: Emmanuel Pescosta <emmanuelpescosta099@gmail.com>
|
||
|
Date: Wed, 29 Apr 2015 16:02:02 +0200
|
||
|
Subject: [PATCH 15/32] Remove bookmarks syncing from KFilePlacesModel and use
|
||
|
user-places.xbel only.
|
||
|
|
||
|
FIXED-IN: 4.14.8
|
||
|
BUG: 345174
|
||
|
REVIEW: 123568
|
||
|
---
|
||
|
kfile/CMakeLists.txt | 1 -
|
||
|
kfile/kfileplacesmodel.cpp | 21 +--
|
||
|
kfile/kfileplacessharedbookmarks.cpp | 276 -----------------------------------
|
||
|
kfile/kfileplacessharedbookmarks_p.h | 56 -------
|
||
|
4 files changed, 3 insertions(+), 351 deletions(-)
|
||
|
delete mode 100644 kfile/kfileplacessharedbookmarks.cpp
|
||
|
delete mode 100644 kfile/kfileplacessharedbookmarks_p.h
|
||
|
|
||
|
diff --git a/kfile/CMakeLists.txt b/kfile/CMakeLists.txt
|
||
|
index ceae140..e796908 100644
|
||
|
--- a/kfile/CMakeLists.txt
|
||
|
+++ b/kfile/CMakeLists.txt
|
||
|
@@ -22,7 +22,6 @@ set(kfile_LIB_SRCS
|
||
|
kfilewidget.cpp
|
||
|
kfileplacesitem.cpp
|
||
|
kfileplacesmodel.cpp
|
||
|
- kfileplacessharedbookmarks.cpp
|
||
|
kfileplacesview.cpp
|
||
|
kfileplaceeditdialog.cpp
|
||
|
kfilepreviewgenerator.cpp
|
||
|
diff --git a/kfile/kfileplacesmodel.cpp b/kfile/kfileplacesmodel.cpp
|
||
|
index 24f95ad..a3ac9fb 100644
|
||
|
--- a/kfile/kfileplacesmodel.cpp
|
||
|
+++ b/kfile/kfileplacesmodel.cpp
|
||
|
@@ -19,7 +19,6 @@
|
||
|
*/
|
||
|
#include "kfileplacesmodel.h"
|
||
|
#include "kfileplacesitem_p.h"
|
||
|
-#include "kfileplacessharedbookmarks_p.h"
|
||
|
|
||
|
#ifdef _WIN32_WCE
|
||
|
#include "Windows.h"
|
||
|
@@ -61,10 +60,9 @@
|
||
|
class KFilePlacesModel::Private
|
||
|
{
|
||
|
public:
|
||
|
- Private(KFilePlacesModel *self) : q(self), bookmarkManager(0), sharedBookmarks(0) {}
|
||
|
+ Private(KFilePlacesModel *self) : q(self), bookmarkManager(0) {}
|
||
|
~Private()
|
||
|
{
|
||
|
- delete sharedBookmarks;
|
||
|
qDeleteAll(items);
|
||
|
}
|
||
|
|
||
|
@@ -76,7 +74,6 @@ public:
|
||
|
|
||
|
Solid::Predicate predicate;
|
||
|
KBookmarkManager *bookmarkManager;
|
||
|
- KFilePlacesSharedBookmarks * sharedBookmarks;
|
||
|
|
||
|
void reloadAndSignal();
|
||
|
QList<KFilePlacesItem *> loadBookmarkList();
|
||
|
@@ -93,8 +90,8 @@ public:
|
||
|
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 file = KStandardDirs().localxdgdatadir() + "user-places.xbel";
|
||
|
+ d->bookmarkManager = KBookmarkManager::managerForExternalFile(file);
|
||
|
|
||
|
// Let's put some places in there if it's empty. We have a corner case here:
|
||
|
// Given you have bookmarked some folders (which have been saved on
|
||
|
@@ -146,9 +143,6 @@ KFilePlacesModel::KFilePlacesModel(QObject *parent)
|
||
|
d->bookmarkManager->saveAs(file);
|
||
|
}
|
||
|
|
||
|
- // create after, so if we have own places, they are added afterwards, in case of equal priorities
|
||
|
- d->sharedBookmarks = new KFilePlacesSharedBookmarks(d->bookmarkManager);
|
||
|
-
|
||
|
QString predicate("[[[[ StorageVolume.ignored == false AND [ StorageVolume.usage == 'FileSystem' OR StorageVolume.usage == 'Encrypted' ]]"
|
||
|
" OR "
|
||
|
"[ IS StorageAccess AND StorageDrive.driveType == 'Floppy' ]]"
|
||
|
@@ -632,8 +626,6 @@ bool KFilePlacesModel::dropMimeData(const QMimeData *data, Qt::DropAction action
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
- d->sharedBookmarks->updateSharedBookmarks();
|
||
|
-
|
||
|
d->reloadAndSignal();
|
||
|
|
||
|
return true;
|
||
|
@@ -661,8 +653,6 @@ void KFilePlacesModel::addPlace(const QString &text, const KUrl &url,
|
||
|
d->bookmarkManager->root().moveBookmark(bookmark, item->bookmark());
|
||
|
}
|
||
|
|
||
|
- d->sharedBookmarks->updateSharedBookmarks();
|
||
|
-
|
||
|
d->reloadAndSignal();
|
||
|
}
|
||
|
|
||
|
@@ -684,8 +674,6 @@ void KFilePlacesModel::editPlace(const QModelIndex &index, const QString &text,
|
||
|
bookmark.setIcon(iconName);
|
||
|
bookmark.setMetaDataItem("OnlyInApp", appName);
|
||
|
|
||
|
- d->sharedBookmarks->updateSharedBookmarks();
|
||
|
-
|
||
|
d->reloadAndSignal();
|
||
|
emit dataChanged(index, index);
|
||
|
}
|
||
|
@@ -703,7 +691,6 @@ void KFilePlacesModel::removePlace(const QModelIndex &index) const
|
||
|
if (bookmark.isNull()) return;
|
||
|
|
||
|
d->bookmarkManager->root().deleteBookmark(bookmark);
|
||
|
- d->sharedBookmarks->updateSharedBookmarks();
|
||
|
d->reloadAndSignal();
|
||
|
}
|
||
|
|
||
|
@@ -719,8 +706,6 @@ void KFilePlacesModel::setPlaceHidden(const QModelIndex &index, bool hidden)
|
||
|
|
||
|
bookmark.setMetaDataItem("IsHidden", (hidden ? "true" : "false"));
|
||
|
|
||
|
- d->sharedBookmarks->updateSharedBookmarks();
|
||
|
-
|
||
|
d->reloadAndSignal();
|
||
|
emit dataChanged(index, index);
|
||
|
}
|
||
|
diff --git a/kfile/kfileplacessharedbookmarks.cpp b/kfile/kfileplacessharedbookmarks.cpp
|
||
|
deleted file mode 100644
|
||
|
index 5385d42..0000000
|
||
|
--- a/kfile/kfileplacessharedbookmarks.cpp
|
||
|
+++ /dev/null
|
||
|
@@ -1,276 +0,0 @@
|
||
|
-/* This file is part of the KDE project
|
||
|
- Copyright (C) 2008 Norbert Frese <nf2@scheinwelt.at>
|
||
|
-
|
||
|
- This library is free software; you can redistribute it and/or
|
||
|
- modify it under the terms of the GNU Library General Public
|
||
|
- License version 2 as published by the Free Software Foundation.
|
||
|
-
|
||
|
- This library 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
|
||
|
- Library General Public License for more details.
|
||
|
-
|
||
|
- You should have received a copy of the GNU Library General Public License
|
||
|
- along with this library; see the file COPYING.LIB. If not, write to
|
||
|
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||
|
- Boston, MA 02110-1301, USA.
|
||
|
-
|
||
|
-*/
|
||
|
-
|
||
|
-#include "kfileplacessharedbookmarks_p.h"
|
||
|
-
|
||
|
-#include <QtCore/QObject>
|
||
|
-#include <QtCore/QTextStream>
|
||
|
-#include <QtCore/QFile>
|
||
|
-#include <kstandarddirs.h>
|
||
|
-#include <kbookmarkmanager.h>
|
||
|
-#include <kbookmark.h>
|
||
|
-#include <kdebug.h>
|
||
|
-
|
||
|
-//////////////// utility functions
|
||
|
-
|
||
|
-static bool compareBookmarks(const KBookmark & bookmark1, const KBookmark & bookmark2)
|
||
|
-{
|
||
|
- return (bookmark1.url() == bookmark2.url() || bookmark1.text() == bookmark2.text());
|
||
|
-}
|
||
|
-
|
||
|
-static bool deepCompareDomNodes(const QDomNode & node1, const QDomNode & node2)
|
||
|
-{
|
||
|
-
|
||
|
- // compare name and value
|
||
|
- if (node1.nodeName() != node2.nodeName() || node1.nodeValue() != node2.nodeValue())
|
||
|
- return false;
|
||
|
-
|
||
|
- // recursively compare children
|
||
|
- const QDomNodeList node1Children = node1.childNodes();
|
||
|
- const QDomNodeList node2Children = node2.childNodes();
|
||
|
-
|
||
|
- if (node1Children.count () != node2Children.count ())
|
||
|
- return false;
|
||
|
-
|
||
|
- for (int i=0; i<node1Children.count ();i++) {
|
||
|
- if (!deepCompareDomNodes(node1Children.at(i), node2Children.at(i) ))
|
||
|
- return false;
|
||
|
- }
|
||
|
- return true;
|
||
|
-}
|
||
|
-
|
||
|
-/*
|
||
|
-static QString nodeAsString(const QDomNode & node1)
|
||
|
-{
|
||
|
- QString str;
|
||
|
- QTextStream ts( &str, QIODevice::WriteOnly );
|
||
|
- ts << node1;
|
||
|
- return str;
|
||
|
-}
|
||
|
-*/
|
||
|
-
|
||
|
-static bool exactCompareBookmarks(const KBookmark & bookmark1, const KBookmark & bookmark2)
|
||
|
-{
|
||
|
- //kDebug() << "excat comparing:\n" << nodeAsString(bookmark1.internalElement()) << "\nwith:\n" << nodeAsString(bookmark2.internalElement());
|
||
|
- return deepCompareDomNodes(bookmark1.internalElement(), bookmark2.internalElement());
|
||
|
-}
|
||
|
-
|
||
|
-static void cloneBookmarkContents(const KBookmark & target, const KBookmark & source)
|
||
|
-{
|
||
|
- const QDomElement targetEl = target.internalElement();
|
||
|
- QDomNode parent = targetEl.parentNode ();
|
||
|
- QDomNode clonedNode = source.internalElement().cloneNode(true);
|
||
|
- parent.replaceChild (clonedNode , targetEl );
|
||
|
-}
|
||
|
-
|
||
|
-static KBookmark cloneBookmark(const KBookmark & toClone)
|
||
|
-{
|
||
|
- const QDomNode cloned = toClone.internalElement().cloneNode(true);
|
||
|
- return KBookmark(cloned.toElement ());
|
||
|
-}
|
||
|
-
|
||
|
-
|
||
|
-static void emptyBookmarkGroup(KBookmarkGroup & root)
|
||
|
-{
|
||
|
- KBookmark bookmark = root.first();
|
||
|
- while (!bookmark.isNull()) {
|
||
|
- KBookmark bookmarkToRemove = bookmark;
|
||
|
- bookmark = root.next(bookmark);
|
||
|
- root.deleteBookmark(bookmarkToRemove);
|
||
|
- }
|
||
|
-}
|
||
|
-
|
||
|
-static int bookmarkGroupSize(KBookmarkGroup & root)
|
||
|
-{
|
||
|
- int count=0;
|
||
|
- KBookmark bookmark = root.first();
|
||
|
- while (!bookmark.isNull()) {
|
||
|
- count++;
|
||
|
- bookmark = root.next(bookmark);
|
||
|
- }
|
||
|
- return count;
|
||
|
-}
|
||
|
-
|
||
|
-//////////////// class KFilePlacesSharedBookmarks
|
||
|
-
|
||
|
-KFilePlacesSharedBookmarks::KFilePlacesSharedBookmarks(KBookmarkManager * mgr)
|
||
|
-{
|
||
|
- m_placesBookmarkManager = mgr;
|
||
|
-
|
||
|
- // we check later if the directory exists
|
||
|
- KStandardDirs::makeDir(KStandardDirs().localxdgdatadir());
|
||
|
- const QString file = KStandardDirs().localxdgdatadir() + "user-places.xbel";
|
||
|
- m_sharedBookmarkManager = KBookmarkManager::managerForExternalFile(file);
|
||
|
-
|
||
|
- connect(m_sharedBookmarkManager, SIGNAL(changed(QString,QString)),
|
||
|
- this, SLOT(slotSharedBookmarksChanged()));
|
||
|
- connect(m_sharedBookmarkManager, SIGNAL(bookmarksChanged(QString)),
|
||
|
- this, SLOT(slotSharedBookmarksChanged()));
|
||
|
-
|
||
|
- integrateSharedBookmarks();
|
||
|
-}
|
||
|
-
|
||
|
-bool KFilePlacesSharedBookmarks::integrateSharedBookmarks()
|
||
|
-{
|
||
|
- KBookmarkGroup root = m_placesBookmarkManager->root();
|
||
|
- KBookmark bookmark = root.first();
|
||
|
-
|
||
|
- KBookmarkGroup sharedRoot = m_sharedBookmarkManager->root();
|
||
|
- KBookmark sharedBookmark = sharedRoot.first();
|
||
|
-
|
||
|
- bool dirty = false;
|
||
|
-
|
||
|
- while (!bookmark.isNull()) {
|
||
|
- //kDebug() << "importing" << bookmark.text();
|
||
|
-
|
||
|
- // skip over system items
|
||
|
- if (bookmark.metaDataItem("isSystemItem") == "true") {
|
||
|
- bookmark = root.next(bookmark);
|
||
|
- continue;
|
||
|
- }
|
||
|
-
|
||
|
- // do the bookmarks match?
|
||
|
- if (!sharedBookmark.isNull() && compareBookmarks(bookmark, sharedBookmark)) {
|
||
|
- //kDebug() << "excat comparing: targetbk:\n" << nodeAsString(bookmark.internalElement()) << "\nsourcbk:\n" << nodeAsString(sharedBookmark.internalElement());
|
||
|
-
|
||
|
- if (!exactCompareBookmarks(bookmark, sharedBookmark)) {
|
||
|
- KBookmark cloneTarget=bookmark;
|
||
|
- KBookmark cloneSource = sharedBookmark;
|
||
|
-
|
||
|
- sharedBookmark = sharedRoot.next(sharedBookmark);
|
||
|
- bookmark = root.next(bookmark);
|
||
|
-
|
||
|
- //kDebug() << "cloning" << cloneSource.text();
|
||
|
- //kDebug() << "cloning: target=\n" << nodeAsString(cloneTarget.internalElement()) << "\n source:\n" << nodeAsString(cloneSource.internalElement());
|
||
|
-
|
||
|
- cloneBookmarkContents(cloneTarget, cloneSource);
|
||
|
- dirty = true;
|
||
|
- continue;
|
||
|
- } else {
|
||
|
- //kDebug() << "keeping" << bookmark.text();
|
||
|
- }
|
||
|
- sharedBookmark = sharedRoot.next(sharedBookmark);
|
||
|
- bookmark = root.next(bookmark);
|
||
|
- continue;
|
||
|
- }
|
||
|
-
|
||
|
- // they don't match -> remove
|
||
|
- //kDebug() << "removing" << bookmark.text();
|
||
|
- KBookmark bookmarkToRemove = bookmark;
|
||
|
- bookmark = root.next(bookmark);
|
||
|
- root.deleteBookmark(bookmarkToRemove);
|
||
|
-
|
||
|
- dirty = true;
|
||
|
- }
|
||
|
-
|
||
|
- // append the remaining shared bookmarks
|
||
|
- while(!sharedBookmark.isNull()) {
|
||
|
- root.addBookmark(cloneBookmark(sharedBookmark));
|
||
|
- sharedBookmark = sharedRoot.next(sharedBookmark);
|
||
|
- dirty = true;
|
||
|
- }
|
||
|
-
|
||
|
- return dirty;
|
||
|
-}
|
||
|
-
|
||
|
-bool KFilePlacesSharedBookmarks::exportSharedBookmarks()
|
||
|
-{
|
||
|
- KBookmarkGroup root = m_placesBookmarkManager->root();
|
||
|
- KBookmark bookmark = root.first();
|
||
|
-
|
||
|
- KBookmarkGroup sharedRoot = m_sharedBookmarkManager->root();
|
||
|
- KBookmark sharedBookmark = sharedRoot.first();
|
||
|
-
|
||
|
- bool dirty = false;
|
||
|
-
|
||
|
- // first check if they are the same
|
||
|
- int count=0;
|
||
|
- while (!bookmark.isNull()) {
|
||
|
- //kDebug() << "exporting..." << bookmark.text();
|
||
|
-
|
||
|
- // skip over system items
|
||
|
- if (bookmark.metaDataItem("isSystemItem") == "true") {
|
||
|
- bookmark = root.next(bookmark);
|
||
|
- continue;
|
||
|
- }
|
||
|
- count++;
|
||
|
-
|
||
|
- // end of sharedBookmarks?
|
||
|
- if (sharedBookmark.isNull()) {
|
||
|
- dirty=true;
|
||
|
- break;
|
||
|
- }
|
||
|
-
|
||
|
- // do the bookmarks match?
|
||
|
- if (compareBookmarks(bookmark, sharedBookmark)) {
|
||
|
- if (!exactCompareBookmarks(bookmark, sharedBookmark)) {
|
||
|
- dirty = true;
|
||
|
- break;
|
||
|
- }
|
||
|
- } else {
|
||
|
- dirty=true;
|
||
|
- break;
|
||
|
- }
|
||
|
- sharedBookmark = sharedRoot.next(sharedBookmark);
|
||
|
- bookmark = root.next(bookmark);
|
||
|
- }
|
||
|
-
|
||
|
- //kDebug() << "dirty=" << dirty << " oldsize=" << bookmarkGroupSize(sharedRoot) << " count=" << count;
|
||
|
-
|
||
|
- if (bookmarkGroupSize(sharedRoot) != count)
|
||
|
- dirty=true;
|
||
|
-
|
||
|
- if (dirty) {
|
||
|
- emptyBookmarkGroup(sharedRoot);
|
||
|
-
|
||
|
- // append all bookmarks
|
||
|
- KBookmark bookmark = root.first();
|
||
|
-
|
||
|
- while(!bookmark.isNull()) {
|
||
|
-
|
||
|
- if (bookmark.metaDataItem("isSystemItem") == "true") {
|
||
|
- bookmark = root.next(bookmark);
|
||
|
- continue;
|
||
|
- }
|
||
|
-
|
||
|
- sharedRoot.addBookmark(cloneBookmark(bookmark));
|
||
|
- bookmark = root.next(bookmark);
|
||
|
- dirty = true;
|
||
|
- }
|
||
|
- }
|
||
|
-
|
||
|
- return dirty;
|
||
|
-
|
||
|
-}
|
||
|
-
|
||
|
-void KFilePlacesSharedBookmarks::slotSharedBookmarksChanged()
|
||
|
-{
|
||
|
- //kDebug() << "shared bookmarks changed";
|
||
|
- bool dirty = integrateSharedBookmarks();
|
||
|
- if (dirty) m_placesBookmarkManager->emitChanged();
|
||
|
-}
|
||
|
-
|
||
|
-void KFilePlacesSharedBookmarks::updateSharedBookmarks()
|
||
|
-{
|
||
|
- //kDebug() << "places bookmarks changed";
|
||
|
- bool dirty = exportSharedBookmarks();
|
||
|
- if (dirty) m_sharedBookmarkManager->emitChanged();
|
||
|
-}
|
||
|
-
|
||
|
-#include "kfileplacessharedbookmarks_p.moc"
|
||
|
diff --git a/kfile/kfileplacessharedbookmarks_p.h b/kfile/kfileplacessharedbookmarks_p.h
|
||
|
deleted file mode 100644
|
||
|
index 654fe18..0000000
|
||
|
--- a/kfile/kfileplacessharedbookmarks_p.h
|
||
|
+++ /dev/null
|
||
|
@@ -1,56 +0,0 @@
|
||
|
-/* This file is part of the KDE project
|
||
|
- Copyright (C) 2008 Norbert Frese <nf2@scheinwelt.at>
|
||
|
-
|
||
|
- This library is free software; you can redistribute it and/or
|
||
|
- modify it under the terms of the GNU Library General Public
|
||
|
- License version 2 as published by the Free Software Foundation.
|
||
|
-
|
||
|
- This library 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
|
||
|
- Library General Public License for more details.
|
||
|
-
|
||
|
- You should have received a copy of the GNU Library General Public License
|
||
|
- along with this library; see the file COPYING.LIB. If not, write to
|
||
|
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||
|
- Boston, MA 02110-1301, USA.
|
||
|
-
|
||
|
-*/
|
||
|
-
|
||
|
-#ifndef KFILEPLACESSHAREDBOOKMARKS_P_H
|
||
|
-#define KFILEPLACESSHAREDBOOKMARKS_P_H
|
||
|
-
|
||
|
-#include <QtCore/QObject>
|
||
|
-#include <kbookmarkmanager.h>
|
||
|
-
|
||
|
-/**
|
||
|
- * keeps the KFilePlacesModel bookmarks and the shared bookmark spec
|
||
|
- * shortcuts in sync
|
||
|
- */
|
||
|
-class KFilePlacesSharedBookmarks : public QObject
|
||
|
-{
|
||
|
- Q_OBJECT
|
||
|
-public:
|
||
|
-
|
||
|
- KFilePlacesSharedBookmarks(KBookmarkManager * mgr);
|
||
|
- ~KFilePlacesSharedBookmarks() { /* delete m_sharedBookmarkManager; */}
|
||
|
-
|
||
|
- void updateSharedBookmarks();
|
||
|
-
|
||
|
-private:
|
||
|
-
|
||
|
- bool integrateSharedBookmarks();
|
||
|
- bool exportSharedBookmarks();
|
||
|
-
|
||
|
- KBookmarkManager *m_placesBookmarkManager;
|
||
|
- KBookmarkManager *m_sharedBookmarkManager;
|
||
|
-
|
||
|
-private Q_SLOTS:
|
||
|
-
|
||
|
- void slotSharedBookmarksChanged();
|
||
|
-};
|
||
|
-
|
||
|
-
|
||
|
-
|
||
|
-
|
||
|
-#endif /*KFILEPLACESSHARED_P_H_*/
|
||
|
--
|
||
|
2.4.2
|
||
|
|