mirror of
https://invent.kde.org/system/dolphin
synced 2024-10-28 03:21:56 +00:00
Make sure that old URLs do not appear duplicated in places model
Summary: BUG: 389401 KIO model now provides Baloo URLs; we need to remove the old ones created by Dolphin places model BUG: 387888 Depends on D9332 Test Plan: unit test Reviewers: mwolff, #dolphin, ngraham, elvisangelaccio Reviewed By: #dolphin, ngraham, elvisangelaccio Subscribers: elvisangelaccio, broulik, ervin, ngraham, #dolphin Differential Revision: https://phabricator.kde.org/D9333
This commit is contained in:
parent
ea6a2424fb
commit
3bf68fd714
|
@ -53,9 +53,19 @@
|
||||||
#include <views/viewproperties.h>
|
#include <views/viewproperties.h>
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
// Hence a prefix to the application-name of the stored bookmarks is
|
// A suffix to the application-name of the stored bookmarks is
|
||||||
// added, which is only read by PlacesItemModel.
|
// added, which is only read by PlacesItemModel.
|
||||||
const char AppNamePrefix[] = "-places-panel";
|
const QString AppNameSuffix = QStringLiteral("-places-panel");
|
||||||
|
static QList<QUrl> balooURLs = {
|
||||||
|
QUrl(QStringLiteral("timeline:/today")),
|
||||||
|
QUrl(QStringLiteral("timeline:/yesterday")),
|
||||||
|
QUrl(QStringLiteral("timeline:/thismonth")),
|
||||||
|
QUrl(QStringLiteral("timeline:/lastmonth")),
|
||||||
|
QUrl(QStringLiteral("search:/documents")),
|
||||||
|
QUrl(QStringLiteral("search:/images")),
|
||||||
|
QUrl(QStringLiteral("search:/audio")),
|
||||||
|
QUrl(QStringLiteral("search:/videos"))
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
PlacesItemModel::PlacesItemModel(QObject* parent) :
|
PlacesItemModel::PlacesItemModel(QObject* parent) :
|
||||||
|
@ -63,8 +73,9 @@ PlacesItemModel::PlacesItemModel(QObject* parent) :
|
||||||
m_hiddenItemsShown(false),
|
m_hiddenItemsShown(false),
|
||||||
m_deviceToTearDown(nullptr),
|
m_deviceToTearDown(nullptr),
|
||||||
m_storageSetupInProgress(),
|
m_storageSetupInProgress(),
|
||||||
m_sourceModel(new KFilePlacesModel(this))
|
m_sourceModel(new KFilePlacesModel(KAboutData::applicationData().componentName() + AppNameSuffix, this))
|
||||||
{
|
{
|
||||||
|
cleanupBookmarks();
|
||||||
loadBookmarks();
|
loadBookmarks();
|
||||||
initializeDefaultViewProperties();
|
initializeDefaultViewProperties();
|
||||||
|
|
||||||
|
@ -153,12 +164,13 @@ void PlacesItemModel::insertSortedItem(PlacesItem* item)
|
||||||
|
|
||||||
for(int r = 0, rMax = m_sourceModel->rowCount(); r < rMax; r++) {
|
for(int r = 0, rMax = m_sourceModel->rowCount(); r < rMax; r++) {
|
||||||
sourceIndex = m_sourceModel->index(r, 0);
|
sourceIndex = m_sourceModel->index(r, 0);
|
||||||
|
const KBookmark sourceBookmark = m_sourceModel->bookmarkForIndex(sourceIndex);
|
||||||
|
|
||||||
if (bookmarkId(m_sourceModel->bookmarkForIndex(sourceIndex)) == iBookmarkId) {
|
if (bookmarkId(sourceBookmark) == iBookmarkId) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!m_sourceModel->isHidden(sourceIndex)) {
|
if (m_hiddenItemsShown || !m_sourceModel->isHidden(sourceIndex)) {
|
||||||
pos++;
|
pos++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -559,11 +571,7 @@ void PlacesItemModel::onSourceModelRowsMoved(const QModelIndex &parent, int star
|
||||||
const int targetRow = row + (start - r) - (r < row ? blockSize : 0);
|
const int targetRow = row + (start - r) - (r < row ? blockSize : 0);
|
||||||
const QModelIndex targetIndex = m_sourceModel->index(targetRow, 0, destination);
|
const QModelIndex targetIndex = m_sourceModel->index(targetRow, 0, destination);
|
||||||
|
|
||||||
const KBookmark bookmark = m_sourceModel->bookmarkForIndex(targetIndex);
|
addItemFromSourceModel(targetIndex);
|
||||||
PlacesItem *item = new PlacesItem(bookmark);
|
|
||||||
updateItem(item, targetIndex);
|
|
||||||
|
|
||||||
insertSortedItem(item);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -608,13 +616,33 @@ void PlacesItemModel::onSourceModelGroupHiddenChanged(KFilePlacesModel::GroupTyp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PlacesItemModel::cleanupBookmarks()
|
||||||
|
{
|
||||||
|
// KIO model now provides support for baloo urls, and because of that we
|
||||||
|
// need to remove old URLs that were visible only in Dolphin to avoid duplication
|
||||||
|
int row = 0;
|
||||||
|
do {
|
||||||
|
const QModelIndex sourceIndex = m_sourceModel->index(row, 0);
|
||||||
|
const KBookmark bookmark = m_sourceModel->bookmarkForIndex(sourceIndex);
|
||||||
|
const QUrl url = bookmark.url();
|
||||||
|
const QString appName = bookmark.metaDataItem(QStringLiteral("OnlyInApp"));
|
||||||
|
|
||||||
|
if ((appName == KAboutData::applicationData().componentName() ||
|
||||||
|
appName == KAboutData::applicationData().componentName() + AppNameSuffix) && balooURLs.contains(url)) {
|
||||||
|
qCDebug(DolphinDebug) << "Removing old baloo url:" << url;
|
||||||
|
m_sourceModel->removePlace(sourceIndex);
|
||||||
|
} else {
|
||||||
|
row++;
|
||||||
|
}
|
||||||
|
} while (row < m_sourceModel->rowCount());
|
||||||
|
}
|
||||||
|
|
||||||
void PlacesItemModel::loadBookmarks()
|
void PlacesItemModel::loadBookmarks()
|
||||||
{
|
{
|
||||||
for(int r = 0, rMax = m_sourceModel->rowCount(); r < rMax; r++) {
|
for(int r = 0, rMax = m_sourceModel->rowCount(); r < rMax; r++) {
|
||||||
const QModelIndex sourceIndex = m_sourceModel->index(r, 0);
|
const QModelIndex sourceIndex = m_sourceModel->index(r, 0);
|
||||||
KBookmark bookmark = m_sourceModel->bookmarkForIndex(sourceIndex);
|
KBookmark bookmark = m_sourceModel->bookmarkForIndex(sourceIndex);
|
||||||
if (acceptBookmark(bookmark) &&
|
if (m_hiddenItemsShown || !m_sourceModel->isHidden(sourceIndex)) {
|
||||||
(m_hiddenItemsShown || !m_sourceModel->isHidden(sourceIndex))) {
|
|
||||||
addItemFromSourceModel(sourceIndex);
|
addItemFromSourceModel(sourceIndex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -625,19 +653,6 @@ void PlacesItemModel::loadBookmarks()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PlacesItemModel::acceptBookmark(const KBookmark& bookmark) const
|
|
||||||
{
|
|
||||||
const QString udi = bookmark.metaDataItem(QStringLiteral("UDI"));
|
|
||||||
const QUrl url = bookmark.url();
|
|
||||||
const QString appName = bookmark.metaDataItem(QStringLiteral("OnlyInApp"));
|
|
||||||
|
|
||||||
const bool allowedHere = (appName.isEmpty()
|
|
||||||
|| appName == KAboutData::applicationData().componentName()
|
|
||||||
|| appName == KAboutData::applicationData().componentName() + AppNamePrefix);
|
|
||||||
|
|
||||||
return (udi.isEmpty() && allowedHere);
|
|
||||||
}
|
|
||||||
|
|
||||||
void PlacesItemModel::clear() {
|
void PlacesItemModel::clear() {
|
||||||
KStandardItemModel::clear();
|
KStandardItemModel::clear();
|
||||||
}
|
}
|
||||||
|
|
|
@ -167,19 +167,18 @@ private slots:
|
||||||
void onSourceModelGroupHiddenChanged(KFilePlacesModel::GroupType group, bool hidden);
|
void onSourceModelGroupHiddenChanged(KFilePlacesModel::GroupType group, bool hidden);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
/**
|
||||||
|
* Remove bookmarks created by the previous version of dolphin that are
|
||||||
|
* not valid anymore
|
||||||
|
*/
|
||||||
|
void cleanupBookmarks();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads the bookmarks from the bookmark-manager and creates items for
|
* Loads the bookmarks from the bookmark-manager and creates items for
|
||||||
* the model or moves hidden items to m_bookmarkedItems.
|
* the model or moves hidden items to m_bookmarkedItems.
|
||||||
*/
|
*/
|
||||||
void loadBookmarks();
|
void loadBookmarks();
|
||||||
|
|
||||||
/**
|
|
||||||
* @return True, if the bookmark can be accepted in the context of the
|
|
||||||
* current application (e.g. bookmarks from other applications
|
|
||||||
* will be ignored).
|
|
||||||
*/
|
|
||||||
bool acceptBookmark(const KBookmark& bookmark) const;
|
|
||||||
|
|
||||||
QString internalMimeType() const;
|
QString internalMimeType() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -83,6 +83,7 @@ private slots:
|
||||||
void testIcons();
|
void testIcons();
|
||||||
void testDragAndDrop();
|
void testDragAndDrop();
|
||||||
void testHideDevices();
|
void testHideDevices();
|
||||||
|
void testDuplicatedEntries();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
PlacesItemModel* m_model;
|
PlacesItemModel* m_model;
|
||||||
|
@ -780,6 +781,31 @@ void PlacesItemModelTest::testHideDevices()
|
||||||
m_model = new PlacesItemModel();
|
m_model = new PlacesItemModel();
|
||||||
QTRY_COMPARE(m_model->count(), urls.count());
|
QTRY_COMPARE(m_model->count(), urls.count());
|
||||||
CHECK_PLACES_URLS(urls);
|
CHECK_PLACES_URLS(urls);
|
||||||
|
|
||||||
|
// revert changes
|
||||||
|
m_model->setGroupHidden(KFilePlacesModel::RemovableDevicesType, false);
|
||||||
|
urls = initialUrls();
|
||||||
|
QTRY_COMPARE(m_model->count(), urls.count());
|
||||||
|
CHECK_PLACES_URLS(urls);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PlacesItemModelTest::testDuplicatedEntries()
|
||||||
|
{
|
||||||
|
QStringList urls = initialUrls();
|
||||||
|
// create a duplicated entry on bookmark
|
||||||
|
KBookmarkManager *bookmarkManager = KBookmarkManager::managerForFile(bookmarksFile(), QStringLiteral("kfilePlaces"));
|
||||||
|
KBookmarkGroup root = bookmarkManager->root();
|
||||||
|
KBookmark bookmark = root.addBookmark(QStringLiteral("Duplicated Search Videos"), QUrl("search:/videos"), {});
|
||||||
|
|
||||||
|
const QString id = QUuid::createUuid().toString();
|
||||||
|
bookmark.setMetaDataItem(QStringLiteral("ID"), id);
|
||||||
|
bookmark.setMetaDataItem(QStringLiteral("OnlyInApp"), KAboutData::applicationData().componentName());
|
||||||
|
bookmarkManager->emitChanged(bookmarkManager->root());
|
||||||
|
|
||||||
|
PlacesItemModel *newModel = new PlacesItemModel();
|
||||||
|
QTRY_COMPARE(placesUrls(newModel).count(QStringLiteral("search:/videos")), 1);
|
||||||
|
QTRY_COMPARE(urls, placesUrls(newModel));
|
||||||
|
delete newModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
QTEST_MAIN(PlacesItemModelTest)
|
QTEST_MAIN(PlacesItemModelTest)
|
||||||
|
|
Loading…
Reference in a new issue